Choosing between OPC UA and REST for dashboard data sources in ThingWorx visualization projects

I’m architecting data sources for a new operations dashboard in ThingWorx 9.6 and trying to decide on the right protocol mix. We have real-time PLC data that needs sub-second updates for production monitoring, plus we need to pull work order and material data from our MES and ERP systems.

My initial thinking was OPC UA for all the PLC connections since we have Rockwell and Siemens controllers that support it natively. But I’m wondering about the REST API approach for the MES/ERP integration versus trying to standardize everything through OPC UA.

What’s been your experience with protocol selection for mixed data sources? Specifically interested in performance trade-offs and whether a hybrid approach (OPC UA for PLCs, REST for business systems) adds too much complexity to the Mashup Builder development process. Our dashboard will have about 40 widgets displaying everything from live sensor readings to daily production summaries.

Hybrid is definitely the way to go. OPC UA excels at high-frequency PLC data but it’s overkill for MES/ERP queries that update every few minutes. We use OPC UA subscriptions for anything under 5-second refresh and REST for business data. The Mashup Builder handles both protocols seamlessly - you just bind to different Thing properties. Performance-wise, REST actually reduces server load for infrequent updates compared to maintaining OPC UA subscriptions.

That caching point is important - are you using the built-in ThingWorx value stream for that, or implementing custom cache logic? And for the OPC UA subscriptions, what’s a reasonable number to stay under before you start seeing performance issues? We’re planning about 150 data points from PLCs, maybe 80 of those need real-time updates.

From the MES side, REST integration is much cleaner. Most modern MES platforms expose REST APIs specifically designed for dashboard consumption with built-in filtering and aggregation. If you tried to route that through OPC UA, you’d lose those query capabilities and end up pulling more data than needed. Our ThingWorx dashboards query MES REST endpoints every 30 seconds for work order status and it works perfectly. The key is implementing proper caching on the ThingWorx side so you’re not hammering the MES server.

Don’t overlook OPC UA’s historical access capabilities either. If your PLCs support it, you can query historical trends directly through OPC UA rather than storing everything in ThingWorx. This works well for trend widgets showing the last 8 hours of data. Reduces your ThingWorx storage requirements significantly.

For caching MES/ERP data, use Thing properties with custom subscription refresh rates rather than value streams - much lighter weight for dashboard use cases. On the OPC UA side, 80 subscriptions is manageable but watch your scan rates. We keep critical subscriptions at 500ms, everything else at 2-5 seconds. Also consider data change filters in OPC UA - only update when values actually change rather than scanning continuously. This can cut your subscription overhead by 60-70% for relatively stable process variables.