QuickOPC-UA Subscription Behavior: Reads and Auto-Subscribe Logic

Jason IP9 min read
OPC / OPC UAOther ManufacturerTechnical Reference
Licensed PE Working through this on a live machine? A Maine-licensed engineer can take it from here — included with IMD hardware, by the hour for everything else. Book an engineer

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_NamespaceArray node (Namespace 0, node id i=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 Value of the Server_ServerStatus_State variable (Namespace 0, i=2256) and related status components.
  • Transport layer: regular ReadRequest/ReadResponse over 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.
This subscription is the most likely source of confusion in network captures. Although there is only one and it is not driven by the application, its presence at predictable intervals is what engineers typically notice first when they inspect a session with Wireshark or an OPC UA traffic analyzer.

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
    }
};
The exact property names differ across QuickOPC-UA versions and across .NET vs COM wrappers. Always consult the version-specific API reference shipped with the installed QuickOPC-UA build (Help file or OPC Labs documentation portal) before deploying configuration changes to production.

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.

  1. 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).
  2. 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.
  3. 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.PositiveInfinity suppresses 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.

  1. 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.
  2. 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.

Back to blog