...
DEVICE MODULE DISCOVERY SERVICES
(Pillar 2: Devices) (Technology under Pillar 1: UNS)
?????????????????
--------------------------- ????????????????????????????????---------------------------------
• Define local tags FIRST • NO local tags needed
• Create Channel → Node → Points • Give address, system discovers
• Explicit polling, scan rates • On-demand, auto-managed
• ~100 protocols • ~17 protocols (discovery-capable)
• Full control, deterministic • Dynamic, flexible
• Governance: LOCAL • Governance: EXTERNAL
...
Modules involved: UNS (Discovery Services connection only). No tags, no devices.
| If your data... | Use | Why |
|---|---|---|
| Requires deterministic polling with explicit scan rates | Pattern 1 (Local Tags + Devices) | Only way to control timing |
| Uses legacy/proprietary protocols without discovery | Pattern 1 | Only option for non-discovery protocols |
| Needs local governance + alarms + historian, but flexible sourcing | Pattern 2 (DataLink) | Best of both worlds |
| Has stable structure but multiple sites or changing sources | Pattern 2 | Template once, link many |
| Is temporary or diagnostic | Pattern 3 (Dynamic/Asset) | No configuration overhead |
| Has unknown or changing structure | Pattern 3 | Dynamic discovery at runtime |
| Has thousands of tags, mostly for monitoring | Pattern 3 | Zero engineering per tag |
| Needs alarms on some points from a dynamic source | Mixed: Pattern 3 for browsing + Pattern 2 for alarm points | Use DataLink for the critical subset |
Most production systems use multiple patterns simultaneously. A typical split:
...
Only protocols with built-in discovery capability can be used. Currently 17 connectors:
| Connector | Type | Notes |
|---|---|---|
| AB Rockwell ControlLogix | PLC | Discovers controller tags |
| Beckhoff TwinCAT | PLC | Discovers TwinCAT symbols |
| Canary Historian | Historian | Also usable as Storage Location |
| Codesys PLC Handler | PLC | Discovers Codesys variables |
| DataHub Communication Service | Application | Connects to Cogent DataHub |
| FlowTimebaseDB Database | Historian | Time-series database |
| GE Proficy Historian | Historian | Also usable as Storage Location |
| InfluxDB Database | Historian | Also usable as Storage Location |
| LineMonitor | Application | Production monitoring |
| MQTT Client | Messaging | Standard MQTT broker |
| MQTT Sparkplug B Collector | Messaging | SparkplugB-specific metadata |
| OPC UA Client | Industrial | Standard OPC UA discovery |
| OSIsoft Aveva PI System | Historian | Also usable as Storage Location |
| Server to Server | Application | Connect to another FrameworX solution |
| SQL Database | Database | Generic SQL data source |
| SQL Database Normalized | Database | Normalized schema variant |
Important: The Device Module has ~100 protocols. Discovery Services has ~17. They are independent lists. Do not confuse them.
...
int intValue = TK.ToInt(Asset("/path"));
double dblValue = TK.ToDouble(Asset("/path"));
string strValue = TK.ToString(Asset("/path"));
bool boolValue = TK.ToDigital(Asset("/path"));
| Syntax | When to use | Example |
|---|---|---|
@Tag.Folder/Name | Local tags, Linked Tags (DataLink) | @Tag.Plant1/TankLevel |
Asset("path") | Dynamic tags from Discovery Services | Asset("/MQTT/plant/tank01/level") |
Asset(expression) | Dynamic UIs driven by user selection | Asset(Client.Context.AssetPath + "/Temp") |
Note: Asset() also works with local tags. It's sometimes used even with local tags because the string argument can be an expression, enabling dynamic display patterns.
| Mistake | Why it happens | How to avoid |
|---|---|---|
| Creating UnsTags for dynamic Discovery Services data | Habit from Device Module workflow | Dynamic tags don't need local tags — that's the whole point. Only create UnsTags if you need alarms/historian or want DataLink. |
| Confusing Device Module protocols with Discovery Services protocols | Both can use MQTT/OPC UA | Device Module has ~100 protocols. Discovery Services has ~17. Check list_protocols() for Discovery Services availability. |
| Setting alarms on dynamic tags | Dynamic tags have no local tag to attach alarms to | Create a local tag with DataLink to the specific path, then configure alarms on that tag. |
| Using DataLink without a Discovery Services connection | DataLink needs the underlying TagProvider technology | A UnsTagProviders entry for the matching protocol must exist. DataLink binds to paths in that connection. |
| Thinking Discovery Services replaces Devices | They are independent systems | Both can coexist in the same solution. Use Devices for control, Discovery Services for monitoring/IoT. |
| Wrong PrimaryStation format | Each protocol has its own format | Always call list_protocols('<protocol>') before writing UnsTagProviders. |
A typical production solution combining all three patterns:
...