OPC-UA Subscriptions and Monitored Items: Engineering Low-Latency Data Pipelines for Manufacturing [2026]
If you've worked with industrial protocols long enough, you know there are exactly two categories of data delivery: polling (you ask, the device answers) and subscriptions (the device tells you when something changes). OPC-UA's subscription model is one of the most sophisticated data delivery mechanisms in industrial automation — and one of the most frequently misconfigured.
This guide covers how OPC-UA subscriptions actually work at the wire level, how to configure monitored items for different manufacturing scenarios, and the real-world performance tradeoffs that separate a responsive factory dashboard from one that lags behind reality by minutes.
How OPC-UA Subscriptions Differ from Polling
In a traditional Modbus or EtherNet/IP setup, the client polls registers on a fixed interval — every 1 second, every 5 seconds, whatever the configuration says. This is simple and predictable, but it has fundamental limitations:
- Wasted bandwidth: If a temperature value hasn't changed in 30 minutes, you're still reading it every second
- Missed transients: If a pressure spike occurs between poll cycles, you'll never see it
- Scaling problems: With 500 tags across 20 PLCs, fixed-interval polling creates predictable network congestion waves
OPC-UA subscriptions flip this model. Instead of the client pulling data, the server monitors values internally and notifies the client only when something meaningful changes. The key word is "meaningful" — and that's where the engineering gets interesting.
The Three Layers of OPC-UA Subscriptions
An OPC-UA subscription isn't a single thing. It's three nested concepts that work together:
1. The Subscription Object
A subscription is a container that defines the publishing interval — how often the server checks its monitored items and bundles any pending notifications into a single message. Think of it as the heartbeat of the data pipeline.
Publishing Interval: 500ms
Max Keep-Alive Count: 10
Max Notifications Per Publish: 0 (unlimited)
Priority: 100
The publishing interval is NOT the sampling rate. This is a critical distinction. The publishing interval only controls how often notifications are bundled and sent to the client. A 500ms publishing interval with a 100ms sampling rate means values are checked 5 times between each publish cycle.
2. Monitored Items
Each variable you want to track becomes a monitored item within a subscription. This is where the real configuration lives:
- Sampling Interval: How often the server reads the underlying data source (PLC register, sensor, calculated value)
- Queue Size: How many value changes to buffer between publish cycles
- Discard Policy: When the queue overflows, do you keep the oldest or newest values?
- Filter: What constitutes a "change" worth reporting?
3. Filters (Deadbands)
Filters determine when a monitored item's value has changed "enough" to warrant a notification. There are two types:
- Absolute Deadband: Value must change by at least X units (e.g., temperature must change by 0.5°F)
- Percent Deadband: Value must change by X% of its engineering range
Without a deadband filter, you'll get notifications for every single floating-point fluctuation — including ADC noise that makes a temperature reading bounce between 72.001°F and 72.003°F. That's not useful data. That's noise masquerading as signal.
Practical Configuration Patterns
Pattern 1: Critical Alarms (Boolean State Changes)
For alarm bits — compressor faults, pressure switch trips, flow switch states — you want immediate notification with zero tolerance for missed events.
Subscription:
Publishing Interval: 250ms
Monitored Item (alarm_active):
Sampling Interval: 100ms
Queue Size: 10
Discard Policy: DiscardOldest
Filter: None (report every change)
Why a queue size of 10? Because boolean alarm bits can toggle rapidly during fault conditions. A compressor might fault, reset, and fault again within a single publish cycle. Without a queue, you'd only see the final state. With a queue, you see the full sequence — which is critical for root cause analysis.
Pattern 2: Process Temperatures (Slow-Moving Analog)
Chiller outlet temperature, barrel zone temps, coolant temperatures — these change gradually and generate enormous amounts of redundant data without deadbanding.
Subscription:
Publishing Interval: 1000ms
Monitored Item (chiller_outlet_temp):
Sampling Interval: 500ms
Queue Size: 5
Discard Policy: DiscardOldest
Filter: AbsoluteDeadband(0.5) // °F
A 0.5°F deadband means you won't get notifications from ADC noise, but you will catch meaningful process drift. At a 500ms sampling rate, the server checks the value twice per publish cycle, ensuring you don't miss a rapid temperature swing even with the coarser publishing interval.
Pattern 3: High-Frequency Production Counters
Cycle counts, part counts, shot counters — these increment continuously during production and need efficient handling.
Subscription:
Publishing Interval: 5000ms
Monitored Item (cycle_count):
Sampling Interval: 1000ms
Queue Size: 1
Discard Policy: DiscardOldest
Filter: None
Queue size of 1 is intentional here. You only care about the latest count value — intermediate values are meaningless because the counter only goes up. A 5-second publishing interval means you update dashboards at a reasonable rate without flooding the network with every single increment.
Pattern 4: Energy Metering (Cumulative Registers)
Power consumption registers accumulate continuously. The challenge is capturing the delta accurately without drowning in data.
Subscription:
Publishing Interval: 60000ms (1 minute)
Monitored Item (energy_kwh):
Sampling Interval: 10000ms
Queue Size: 1
Discard Policy: DiscardOldest
Filter: PercentDeadband(1.0) // 1% of range
For energy data, minute-level resolution is typically sufficient for cost allocation and ESG reporting. The percent deadband prevents notifications from meter jitter while still capturing real consumption changes.
Queue Management: The Hidden Performance Killer
Here's what most OPC-UA deployments get wrong: they set queue sizes too small and wonder why their historical data has gaps.
Consider what happens during a network hiccup. The subscription's publish cycle fires, but the client is temporarily unreachable. The server holds notifications in the subscription's retransmission queue for a configurable number of keep-alive cycles. But the monitored item queue is independent — it continues filling with new samples.
If your monitored item queue size is 1 and the network is down for 10 seconds at a 100ms sampling rate, you've lost 100 samples. When the connection recovers, you get exactly one value — the last one. The history is gone.
Rule of thumb: Set the queue size to at least (expected_max_outage_seconds × 1000) / sampling_interval_ms for any tag where you can't afford data gaps.
For a process that needs 30-second outage tolerance at 500ms sampling:
Queue Size = (30 × 1000) / 500 = 60
That's 60 entries per monitored item. Multiply by your tag count and you'll understand why OPC-UA server memory sizing matters.
Sampling Interval vs. Publishing Interval: Getting the Ratio Right
The relationship between sampling interval and publishing interval determines your system's behavior:
| Ratio | Behavior | Use Case |
|---|---|---|
| Sampling = Publishing | Sample once, publish once | Simple monitoring, low bandwidth |
| Sampling < Publishing | Multiple samples per publish, deadband filtering effective | Process control, drift detection |
| Sampling << Publishing | High-resolution capture, batched delivery | Vibration, power quality |
Anti-pattern: Setting sampling interval to 0 (fastest possible). This tells the server to sample at its maximum rate, which on some implementations means every scan cycle of the underlying PLC. A Siemens S7-1500 scanning at 1ms will generate 1,000 samples per second per tag. With 200 tags, that's 200,000 data points per second — most of which are identical to the previous value.
Better approach: Match the sampling interval to the physical process dynamics. A barrel heater zone that takes 30 seconds to change 1°F doesn't need 10ms sampling. A pneumatic valve that opens in 50ms does.
Subscription Diagnostics and Health Monitoring
OPC-UA provides built-in diagnostics that most deployments ignore:
Subscription-Level Counters
- NotificationCount: Total notifications sent since subscription creation
- PublishRequestCount: How many publish requests the client has outstanding
- RepublishCount: How many times the server had to retransmit (indicates network issues)
- TransferredCount: Subscriptions transferred between sessions (cluster failover)
Monitored Item Counters
- SamplingCount: How many times the item was sampled
- QueueOverflowCount: How many values were discarded due to full queues — this is your canary
- FilteredCount: How many samples were suppressed by deadband filters
If QueueOverflowCount is climbing, your queue is too small for the sampling rate and publish interval combination. If FilteredCount is near SamplingCount, your deadband is too aggressive — you're suppressing real data.
How This Compares to Change-Based Polling in Other Protocols
OPC-UA subscriptions aren't the only way to get change-driven data from PLCs. In practice, many IIoT platforms — including machineCDN — implement intelligent change detection at the edge, regardless of the underlying protocol.
The pattern works like this: the edge gateway reads register values on a schedule, compares them to the previously read values, and only transmits data upstream when a meaningful change occurs. Critical state changes (alarms, link state transitions) bypass batching entirely and are sent immediately. Analog values are batched on configurable intervals and compared using value-based thresholds.
This approach brings subscription-like efficiency to protocols that don't natively support it (Modbus, older EtherNet/IP devices). The tradeoff is latency — you're still polling, so maximum detection latency equals your polling interval. But for processes where sub-second change detection isn't required, it's remarkably effective and dramatically reduces cloud ingestion costs.
Real-World Performance Numbers
From production deployments across plastics, packaging, and discrete manufacturing:
| Configuration | Tags | Bandwidth | Update Latency |
|---|---|---|---|
| Fixed 1s polling, no filtering | 500 | 2.1 Mbps | 1s |
| OPC-UA subscriptions, 500ms publish, deadband | 500 | 180 Kbps | 250ms–500ms |
| Edge change detection + batching | 500 | 95 Kbps | 1s–5s (configurable) |
| OPC-UA subs + edge batching combined | 500 | 45 Kbps | 500ms–5s (priority dependent) |
The bandwidth savings from proper subscription configuration are typically 10–20x compared to naive polling. Combined with edge-side batching for cloud delivery, you can achieve 40–50x reduction — which matters enormously on cellular connections at remote facilities.
Common Pitfalls
1. Ignoring the Revised Sampling Interval
When you request a sampling interval, the server may revise it to a supported value. Always check the response — if you asked for 100ms and the server gave you 1000ms, your entire timing assumption is wrong.
2. Too Many Subscriptions
Each subscription has overhead: keep-alive traffic, retransmission buffers, and a dedicated publish thread on some implementations. Don't create one subscription per tag — group tags by priority class and use 3–5 subscriptions total.
3. Forgetting Lifetime Count
The subscription's lifetime count determines how many publish cycles can pass without a successful client response before the server kills the subscription. On unreliable networks, set this high enough to survive outages without losing your subscription state.
4. Not Monitoring Queue Overflows
If you're not checking QueueOverflowCount, you have no idea whether you're losing data. This is especially insidious because everything looks fine on your dashboard — you just have invisible gaps in your history.
Wrapping Up
OPC-UA subscriptions are the most capable data delivery mechanism in industrial automation today, but capability without proper configuration is just complexity. The fundamentals come down to:
- Match sampling intervals to process dynamics, not to what feels fast enough
- Use deadbands aggressively on analog values — noise isn't data
- Size queues for your worst-case outage, not your average case
- Monitor the diagnostics — OPC-UA tells you when things are wrong, if you're listening
For manufacturing environments where protocols like Modbus and EtherNet/IP dominate the device layer, an edge platform like machineCDN provides change-based detection and intelligent batching that delivers subscription-like efficiency regardless of the underlying protocol — bridging the gap between legacy equipment and modern analytics pipelines.
The protocol layer is just plumbing. What matters is getting the right data, at the right time, to the right system — without burying your network or your cloud budget under a mountain of redundant samples.