QuickOPC-UA, the OPC UA flavor of the QuickOPC component library, behaves differently from QuickOPC "Classic" (the COM/DA flavor) in one commonly misunderstood area: how the library treats user-initiated Read and Write operations. QuickOPC-UA does not create an OPC UA Subscription and MonitoredItem in response to every Read or Write the developer issues. Despite that, an OPC UA analyzer trace from a connected application will show traffic that looks subscription-like. This reference explains, mechanism by mechanism, what traffic is generated automatically, why it is generated, and which configuration parameters govern it.
Subscription Model: QuickOPC Classic vs QuickOPC-UA
| Aspect | QuickOPC "Classic" (COM/DA) | QuickOPC-UA |
|---|---|---|
| Read API call | May map to a cache that is refreshed via subscriptions | Performs a synchronous Read service against the server |
| Write API call | Cached write; updated on subsequent subscription refresh | Performs a synchronous Write service against the server |
| Subscription created for Read/Write | Implicit, automatic for matching items | No. Reads/Writes do not create subscriptions |
| Background subscription traffic | Driven by application subscriptions | Driven by three library-internal mechanisms (described below) |
The key takeaway: when using QuickOPC-UA, a user-level Read or Write does not leave behind a Subscription containing a corresponding MonitoredItem. Any subscriptions that appear in a Wireshark capture against an OPC UA endpoint are explained by one of the three mechanisms listed next, not by the call you performed in code.
Mechanism 1: Pre-Defined Node Reads on Connect
When QuickOPC-UA opens a session to an OPC UA server, the underlying OPC UA .NET stack (used by the library) issues a small batch of one-time Read service calls against well-known, pre-defined nodes. Examples include:
- The server's
Server_NamespaceArraynode (Namespace 0, node idi=2255) so that string identifiers can be resolved into numeric NodeIds. - Server capability, server status, and product/server name attributes used to populate browse roots.
These reads are issued shortly after CreateSession/ActivateSession complete and are dictated by the OPC UA specification itself. They are not application-visible and cannot be disabled through any QuickOPC-UA setting, because the OPC UA .NET stack performs them automatically. See OPC UA Part 4 — Services for the mandatory Read and Browse service interactions that every conformant client must perform against a server's well-known nodes.
Mechanism 2: Periodic Keep-Alive Status Read
The OPC UA .NET stack also issues a periodic Read against the server's status. This serves as a low-level session/connection keep-alive and as a sanity check on server health.
- Target node attribute: typically
Valueof theServer_ServerStatus_Statevariable (Namespace 0,i=2256) and related status components. - Transport layer: regular
ReadRequest/ReadResponseover the active secure channel. - Source: OPC UA .NET stack within the QuickOPC-UA process.
The rate is influenced by parameters exposed by QuickOPC-UA, but the server itself can also revise the requested rate. As a result, configuring a faster rate on the client does not guarantee the server honors a faster cadence — the server ultimately controls what it executes and at what interval. Refer to OPC UA Part 6 — Mappings for the wire-level encoding details of these services.
Mechanism 3: Server-Status Monitored-Item Subscription
For each session, QuickOPC-UA creates one additional Subscription containing one or more MonitoredItems that watch server-status-related attributes. Characteristics of this subscription:
- Count: A single subscription per session (not per Read/Write, not per application subscription).
- Purpose: OPC compliance — ensuring the client observes server state changes through the standard pub/sub mechanism.
- Items: Well-known, pre-defined pieces of information in the OPC UA server's address space. They have no relationship to whatever the developer later subscribes to at the application level.
- Relationship to Mechanism 2: Functionally duplicates the periodic Read to a large extent today; future versions are expected to consolidate more server-status monitoring into this subscription and reduce other traffic.
Default Rates and How to Change Them
| Parameter | Default Value (per source) | Effect of Setting to Double.PositiveInfinity
|
|---|---|---|
| Sampling rate of the status subscription | 15000 ms | Subscription is not created at all |
| Publishing rate (kept-alive interval) of the status subscription | 7500 ms | Library uses the slowest viable cadence the server will accept |
QuickOPC-UA exposes settings that let you change the sampling and publishing rates of the server-status subscription. Sample configuration patterns:
// C# / .NET example — illustrative, not copied from any specific QuickOPC API version
var uaClient = new OpcLabs.EasyOpc.UA.EasyUAClient();
// Recommended use of explicit settings object to change rates
uaClient.SessionParameters = new OpcLabs.EasyOpc.UA.UASessionParameters
{
// Lower the server-status subscription rates to a less aggressive cadence
SubscriptionParameters = new OpcLabs.EasyOpc.UA.UASubscriptionParameters
{
PublishingInterval = 5000, // milliseconds
SamplingInterval = 10000 // milliseconds
}
};
Why the Library Behaves This Way (OPC UA Specification Drivers)
The three mechanisms are not arbitrary. Each one exists because the OPC UA specification, as written, makes them necessary or strongly recommended.
-
Namespace and capability discovery. Before the client can resolve string NodeIds or browse a server, it needs the
NamespaceArray,ServerCapabilities, and a few additional well-known nodes. Many of these are only available through Read/Browse service calls (see OPC UA Part 3 — Address Space). - Session keep-alive. OPC UA relies on session and secure channel timeouts. A periodic Read against server status fulfills the same role as a transport-level keep-alive without the complexity of a dedicated heartbeat message.
- Compliance profile expectations. Several OPC UA compliance test groups expect a client to demonstrate subscription-based monitoring of server status (rather than relying exclusively on polling). Adding an internal subscription future-proofs the library against evolving certification profiles (see OPC UA technology overview).
Network and Performance Implications
For the vast majority of installations, the three automatic mechanisms are negligible compared to the application's actual Read/Write load. Each mechanism alone produces:
- Mechanism 1: A few Read requests during connection setup — no ongoing traffic.
- Mechanism 2: One Read request at the configured keep-alive cadence (often tens of seconds).
- Mechanism 3: One Publish request at the configured publishing cadence, carrying one or more MonitoredItems of server status.
Combined steady-state cost at default rates (15000 ms sampling / 7500 ms publishing) is on the order of a couple of requests per interval — far smaller than typical poll loops in SCADA applications. The library author specifically notes awareness that none of the three mechanisms should be causing field issues at these rates.
When to Tune the Defaults
Common motivations for altering the defaults include:
-
Reducing subscription churn for audit-friendly networks. Some compliance regimes dislike any subscription that the auditor cannot trace to application code. Setting the sampling interval to
Double.PositiveInfinitysuppresses Mechanism 3 entirely. Verify this against the version-specific QuickOPC-UA help before relying on the behavior. - Tuning subscription lifetime to OPC UA session timeouts. If the server's session timeout is shorter than the status subscription's publishing cadence, server-side housekeeping may be triggered more aggressively than needed. Aligning the publishing interval to roughly half the session timeout avoids surprises.
- Optimizing WAN links. On constrained links, lengthening intervals reduces request/response pressure without losing the keep-alive benefit.
Verification: Confirming Behavior in the Field
Two practical checks confirm the library is behaving as documented.
- Capture during connect. Point QuickOPC-UA at the server, start a packet capture (Wireshark with the OPC UA dissector enabled), and observe: CreateSession, ActivateSession, the small batch of Read requests against well-known server nodes, then the CreateSubscription and CreateMonitoredItems request pair from Mechanism 3.
- Capture during steady state. With the application idle (no application-level Reads/Writes), observe one Read request per keep-alive interval (Mechanism 2) and one Publish request per publishing interval (Mechanism 3). The MonitoredItems in these requests should reference server-status nodes, not application-specific tags.
If additional subscriptions appear, the cause is application-level code that subscribed to those items — not the library's internal mechanisms.
Troubleshooting Matrix
| Observed Symptom | Likely Cause | Recommended Action |
|---|---|---|
| Subscription seen in capture for an item only ever Read by code | Application code is mistakenly calling Subscribe in addition to Read
|
Audit application code; remove unintended Subscribe calls |
| Many well-known-node Reads at startup | Mechanism 1 running normally | No action required — mandated by OPC UA |
| High subscription publishing rate even at idle | Default rates inherited from earlier version, or configuration set to a low value | Adjust PublishingInterval and verify with capture |
| No subscription visible at all after connect | Sampling interval set to Double.PositiveInfinity; Mechanism 3 disabled |
Verify configuration; this is by design when disabled |
| Server rejects CreateMonitoredItems | Server access policy denies read access to server-status nodes | Adjust server-side user/role permissions for the application's identity |
Summary of Default Values
| Setting | Default | Notes |
|---|---|---|
| Server-status subscription — sampling rate | 15000 ms | Set to Double.PositiveInfinity to suppress the subscription |
| Server-status subscription — publishing rate | 7500 ms | Subject to server revision |
| Keep-alive Read cadence | Influenced by client setting; revised by server | Cannot be fully disabled at the OPC UA .NET stack level |
| Pre-defined node Reads on connect | Fixed, occurs once per session | Cannot be disabled (specification requirement) |
Does QuickOPC-UA automatically subscribe to every Node I Read?
No. QuickOPC-UA Read and Write calls perform synchronous Read/Write services against the server and do not create subscriptions or monitored items for those nodes. Any subscription you see in a trace is created by explicit application code calling Subscribe, or by one of the three library-internal mechanisms described in this reference.
Why does my network capture show a subscription I never created?
QuickOPC-UA opens one additional subscription per session to monitor well-known server-status nodes for OPC compliance. With default rates of 15000 ms sampling and 7500 ms publishing, this single subscription produces steady-state traffic that is unrelated to your application's reads or subscriptions.
Can I disable the server-status subscription entirely?
Yes. Expose the subscription-sampling-rate setting exposed by QuickOPC-UA and set it to Double.PositiveInfinity; the subscription will not be created. Validate the exact property name against the version-specific QuickOPC-UA API reference before deploying to production.
What are the pre-defined Reads at startup, and can they be turned off?
On each session, the OPC UA .NET stack Reads server well-known nodes such as the NamespaceArray, server capabilities, and product information. These Reads are mandated by the OPC UA specification to populate discovery, browse, and namespace translation, and cannot be disabled through any QuickOPC-UA configuration.
How can I confirm in the field that QuickOPC-UA is behaving as documented?
Enable a packet capture with Wireshark while the application is idle. You should see one CreateSubscription/CreateMonitoredItems pair at startup, then steady-state Read and Publish traffic against server-status nodes at the configured intervals, with no additional subscriptions appearing for application Read/Write calls.