/Plant/Area/Process/Sensors/
/Plant/Production/Reactor1/Temperature/TT-1001
/Plant/Production/Reactor1/Pressure/PT-1001
/Plant/Production/Reactor1/Valves/XV-1001/State
/Plant/Area/Cell/Equipment/Device/
/Plant/Production/Cell1/PLC/CPU/Status
/Plant/Production/Cell1/PLC/IO/Module1/Health
/Plant/Production/Cell1/Drives/VFD-1001/Speed
/Plant/Area/Control/
/Plant/Production/Control/Loops/TIC-1001/PV
/Plant/Production/Control/Loops/TIC-1001/SP
/Plant/Production/Control/Loops/TIC-1001/Mode
/Plant/Production/Control/Alarms/Active/Count
/Enterprise/MES/
/Enterprise/MES/WorkOrders/WO-2024-001/Status
/Enterprise/MES/Production/Batch/B-12345/Recipe
/Enterprise/MES/Quality/Samples/S-98765/Results
/Enterprise/MES/OEE/Line1/Availability
/Enterprise/ERP/
/Enterprise/ERP/Planning/Schedule/Week45
/Enterprise/ERP/Inventory/RawMaterials/RM-001/Quantity
/Enterprise/ERP/Orders/PO-2024-1234/Status
Enterprise: "Acme_Corp"
??? Site: "Plant_Chicago"
??? Area: "Production"
??? ProductionLine: "Line_1"
??? WorkCell: "Cell_1A"
??? WorkUnit: "Reactor_1"
??? EquipmentModule: "Agitator"
??? ControlModule: "Motor_M101"
// Equipment Model Template
const EquipmentModel = {
Enterprise: "Acme_Corp",
Site: {
Name: "Chicago_Plant",
Areas: [
{
Name: "Production",
ProductionLines: [
{
Name: "Line_1",
WorkCells: [
{
Name: "Cell_1A",
Units: ["Reactor_1", "Reactor_2"],
StorageZones: ["Tank_Farm_A"]
}
]
}
]
}
]
}
};
// UNS Path Generation
function generateUNSPath(equipment) {
return `/${equipment.Enterprise}/${equipment.Site}/${equipment.Area}/${equipment.Line}/${equipment.Cell}/${equipment.Unit}`;
}
Production Operations:
??? Production Scheduling
? ??? Detailed Scheduling
? ??? Resource Allocation
? ??? Dispatching
??? Production Control
? ??? Recipe Management
? ??? Batch Control
? ??? Process Control
??? Production Data Collection
? ??? Process Data
? ??? Quality Data
? ??? Equipment Data
??? Production Performance Analysis
??? OEE Calculation
??? SPC Analysis
??? Energy Monitoring
/Operations/Scheduling/Current/Orders/
/Operations/Control/Recipes/Active/
/Operations/DataCollection/Process/Trends/
/Operations/Performance/OEE/Realtime/
<Personnel>
<ID>EMP-12345</ID>
<Name>John Smith</Name>
<PersonnelClass>
<ID>Operator_Level2</ID>
<Property>
<ID>Certification</ID>
<Value>Process_Control</Value>
</Property>
</PersonnelClass>
<UNSPath>/Personnel/Operations/EMP-12345</UNSPath>
</Personnel>
<Equipment>
<ID>REACTOR-001</ID>
<Description>Primary Reactor Vessel</Description>
<EquipmentClass>
<ID>Reactor_Type_A</ID>
<Property>
<ID>MaxTemperature</ID>
<Value>200</Value>
<UoM>Celsius</UoM>
</Property>
</EquipmentClass>
<UNSPath>/Plant/Production/Cell1/Reactor1</UNSPath>
</Equipment>
<Material>
<ID>MAT-5678</ID>
<Description>Raw Material A</Description>
<MaterialClass>
<ID>Chemical_Grade_1</ID>
<Property>
<ID>Purity</ID>
<Value>99.5</Value>
<UoM>Percent</UoM>
</Property>
</MaterialClass>
<UNSPath>/Materials/Raw/MAT-5678</UNSPath>
</Material>
Pattern: /{Context}/{Asset}/{Attribute}/{SubAttribute}
Context Types:
Process Values:
States:
Measurements:
const DataQuality = {
Good: 192, // Good quality data
Uncertain: 64, // Uncertain quality
Bad: 0, // Bad quality
// Sub-quality codes
GoodLocalOverride: 216,
UncertainLastUsableValue: 68,
BadNotConnected: 8,
BadDeviceFailure: 12
};
{
"timestamp": "2024-10-30T14:23:45.123Z",
"source": "/Plant/Production/Cell1/Reactor1",
"eventType": "StateChange",
"payload": {
"previousState": "Running",
"currentState": "Stopped",
"reason": "BatchComplete",
"batchId": "B-12345",
"operator": "EMP-12345"
},
"quality": 192,
"metadata": {
"ISA95Level": 2,
"Equipment": "REACTOR-001",
"Area": "Production"
}
}
# ISA-95 Aligned Topics
Plant/+/+/+/data # Level 0-1 Process data
Control/+/+/status # Level 2 Control status
MES/+/+/production # Level 3 Production data
ERP/+/+/planning # Level 4-5 Business data
# Examples
Plant/Production/Cell1/Reactor1/data
Control/Area1/Loop/TIC-1001/status
MES/Orders/Active/WO-2024-001/production
ERP/Inventory/Raw/MAT-5678/planning
<AssetTree>
<Enterprise name="AcmeCorp">
<Site name="Chicago" ISA95Level="4">
<Area name="Production" ISA95Level="3">
<ProductionLine name="Line1">
<WorkCell name="Cell1A" ISA95Level="2">
<WorkUnit name="Reactor1" ISA95Level="1">
<Tags>
<Tag name="Temperature" path="TT-1001"/>
<Tag name="Pressure" path="PT-1001"/>
<Tag name="Level" path="LT-1001"/>
</Tags>
</WorkUnit>
</WorkCell>
</ProductionLine>
</Area>
</Site>
</Enterprise>
</AssetTree>
// ISA-95 Level-based Tag Provider Configuration
const TagProviders = {
Level0_1: {
provider: "OPCUAProvider",
endpoint: "opc.tcp://plc1:4840",
updateRate: 1000,
tags: "/Plant/*/Sensors/*"
},
Level2: {
provider: "SCADAProvider",
endpoint: "http://scada:8080",
updateRate: 5000,
tags: "/Control/*/*"
},
Level3: {
provider: "MESProvider",
endpoint: "http://mes:9090",
updateRate: 60000,
tags: "/MES/*/*"
},
Level4_5: {
provider: "ERPProvider",
endpoint: "http://erp:8443",
updateRate: 300000,
tags: "/Enterprise/*/*"
}
};
UNS Optimization Settings:
Level0_1:
BufferSize: 10000
Compression: true
DeadbandType: Absolute
DeadbandValue: 0.5
Level2:
BufferSize: 5000
StoreAndForward: true
Priority: High
Level3:
BufferSize: 1000
BatchingInterval: 60s
Priority: Normal
Level4_5:
BufferSize: 100
BatchingInterval: 300s
Priority: Low
Level 4-5 (ERP) <--> REST/SOAP
?
Level 3 (MES) <--> OData/GraphQL
?
Level 2 (SCADA) <--> OPC UA
?
Level 0-1 (PLC) <--> EtherNet/IP
Pattern: Publish/Subscribe via MQTT
Publisher: /Plant/Production/Cell1/Reactor1/Temperature
Subscribers:
- /Control/Loops/TIC-1001 (Control)
- /MES/Batch/Current/Temperature (MES)
- /Maintenance/Monitoring/Reactor1 (Maintenance)
// Level 3 to Level 2 Transaction
async function sendProductionOrder(order) {
const transaction = {
id: generateUUID(),
timestamp: new Date().toISOString(),
source: "/MES/Orders",
target: "/Control/Production",
type: "ProductionOrderRequest",
payload: {
orderId: order.id,
product: order.product,
quantity: order.quantity,
recipe: order.recipe,
scheduledStart: order.startTime
},
requiresAck: true,
timeout: 30000
};
await publishToUNS(transaction);
await waitForAcknowledgment(transaction.id);
}
? Maintain ISA-95 level separation - Clear boundaries between levels
? Use semantic naming - Self-describing paths and attributes
? Implement data contracts - Defined schemas between levels
? Version your models - Track changes to data structures
? Monitor data quality - Include quality indicators with data
? Design for scalability - Consider future growth
? Skip levels - Direct Level 0 to Level 4 connections
? Mix contexts - Business logic in control systems
? Ignore standards - Custom implementations without ISA-95 alignment
? Forget security - Each level needs appropriate security
? Overlook performance - Consider update rates and data volumes
Assessment Phase:
Design Phase:
Implementation Phase:
Validation Phase:
ISA-95 provides the international standard for integrating enterprise and control systems, defining hierarchical levels, data models, and information flows. This guide implements ISA-95 principles within FrameworX's Unified Namespace (UNS), creating a standardized data architecture that bridges OT and IT systems while maintaining clear functional boundaries.
/Plant/Area/Process/Sensors/
/Plant/Production/Reactor1/Temperature/TT-1001
/Plant/Production/Reactor1/Pressure/PT-1001
/Plant/Production/Reactor1/Valves/XV-1001/State
/Plant/Area/Cell/Equipment/Device/
/Plant/Production/Cell1/PLC/CPU/Status
/Plant/Production/Cell1/PLC/IO/Module1/Health
/Plant/Production/Cell1/Drives/VFD-1001/Speed
/Plant/Area/Control/
/Plant/Production/Control/Loops/TIC-1001/PV
/Plant/Production/Control/Loops/TIC-1001/SP
/Plant/Production/Control/Loops/TIC-1001/Mode
/Plant/Production/Control/Alarms/Active/Count
/Enterprise/MES/
/Enterprise/MES/WorkOrders/WO-2024-001/Status
/Enterprise/MES/Production/Batch/B-12345/Recipe
/Enterprise/MES/Quality/Samples/S-98765/Results
/Enterprise/MES/OEE/Line1/Availability
/Enterprise/ERP/
/Enterprise/ERP/Planning/Schedule/Week45
/Enterprise/ERP/Inventory/RawMaterials/RM-001/Quantity
/Enterprise/ERP/Orders/PO-2024-1234/Status
Enterprise:
Site: "Plant_Chicago"
Area: "Production"
ProductionLine: "Line_1"
WorkCell: "Cell_1A"
WorkUnit: "Reactor_1"
EquipmentModule: "Agitator"
ControlModule: "Motor_M101"
// Equipment Model Template
const EquipmentModel = {
Enterprise: "Acme_Corp",
Site: {
Name: "Chicago_Plant",
Areas: [
{
Name: "Production",
ProductionLines: [
{
Name: "Line_1",
WorkCells: [
{
Name: "Cell_1A",
Units: ["Reactor_1", "Reactor_2"],
StorageZones: ["Tank_Farm_A"]
}
]
}
]
}
]
}
};
// UNS Path Generation
function generateUNSPath(equipment) {
return `/${equipment.Enterprise}/${equipment.Site}/${equipment.Area}/${equipment.Line}/${equipment.Cell}/${equipment.Unit}`;
}
Production Operations:
??? Production Scheduling
? ??? Detailed Scheduling
? ??? Resource Allocation
? ??? Dispatching
??? Production Control
? ??? Recipe Management
? ??? Batch Control
? ??? Process Control
??? Production Data Collection
? ??? Process Data
? ??? Quality Data
? ??? Equipment Data
??? Production Performance Analysis
??? OEE Calculation
??? SPC Analysis
??? Energy Monitoring
/Operations/Scheduling/Current/Orders/
/Operations/Control/Recipes/Active/
/Operations/DataCollection/Process/Trends/
/Operations/Performance/OEE/Realtime/
<Personnel>
<ID>EMP-12345</ID>
<Name>John Smith</Name>
<PersonnelClass>
<ID>Operator_Level2</ID>
<Property>
<ID>Certification</ID>
<Value>Process_Control</Value>
</Property>
</PersonnelClass>
<UNSPath>/Personnel/Operations/EMP-12345</UNSPath>
</Personnel>
<Equipment>
<ID>REACTOR-001</ID>
<Description>Primary Reactor Vessel</Description>
<EquipmentClass>
<ID>Reactor_Type_A</ID>
<Property>
<ID>MaxTemperature</ID>
<Value>200</Value>
<UoM>Celsius</UoM>
</Property>
</EquipmentClass>
<UNSPath>/Plant/Production/Cell1/Reactor1</UNSPath>
</Equipment>
<Material>
<ID>MAT-5678</ID>
<Description>Raw Material A</Description>
<MaterialClass>
<ID>Chemical_Grade_1</ID>
<Property>
<ID>Purity</ID>
<Value>99.5</Value>
<UoM>Percent</UoM>
</Property>
</MaterialClass>
<UNSPath>/Materials/Raw/MAT-5678</UNSPath>
</Material>
Pattern: /{Context}/{Asset}/{Attribute}/{SubAttribute}
Context Types:
- Plant: Physical equipment and processes
- Operations: Manufacturing execution
- Enterprise: Business systems
- Quality: Quality management
- Maintenance: Asset management
Process Values:
- PV: Process Variable
- SP: Setpoint
- OP: Output
- Mode: Control mode (Auto/Manual/Cascade)
States:
- State: Current state (Running/Stopped/Fault)
- Command: Requested state
- Status: Detailed status information
Measurements:
- Value: Current measured value
- EU: Engineering units
- Range: Min/max limits
- Quality: Data quality indicator
const DataQuality = {
Good: 192, // Good quality data
Uncertain: 64, // Uncertain quality
Bad: 0, // Bad quality
// Sub-quality codes
GoodLocalOverride: 216,
UncertainLastUsableValue: 68,
BadNotConnected: 8,
BadDeviceFailure: 12
};
{
"timestamp": "2024-10-30T14:23:45.123Z",
"source": "/Plant/Production/Cell1/Reactor1",
"eventType": "StateChange",
"payload": {
"previousState": "Running",
"currentState": "Stopped",
"reason": "BatchComplete",
"batchId": "B-12345",
"operator": "EMP-12345"
},
"quality": 192,
"metadata": {
"ISA95Level": 2,
"Equipment": "REACTOR-001",
"Area": "Production"
}
}
# ISA-95 Aligned Topics
Plant/+/+/+/data # Level 0-1 Process data
Control/+/+/status # Level 2 Control status
MES/+/+/production # Level 3 Production data
ERP/+/+/planning # Level 4-5 Business data
# Examples
Plant/Production/Cell1/Reactor1/data
Control/Area1/Loop/TIC-1001/status
MES/Orders/Active/WO-2024-001/production
ERP/Inventory/Raw/MAT-5678/planning
<AssetTree>
<Enterprise name="AcmeCorp">
<Site name="Chicago" ISA95Level="4">
<Area name="Production" ISA95Level="3">
<ProductionLine name="Line1">
<WorkCell name="Cell1A" ISA95Level="2">
<WorkUnit name="Reactor1" ISA95Level="1">
<Tags>
<Tag name="Temperature" path="TT-1001"/>
<Tag name="Pressure" path="PT-1001"/>
<Tag name="Level" path="LT-1001"/>
</Tags>
</WorkUnit>
</WorkCell>
</ProductionLine>
</Area>
</Site>
</Enterprise>
</AssetTree>
// ISA-95 Level-based Tag Provider Configuration
const TagProviders = {
Level0_1: {
provider: "OPCUAProvider",
endpoint: "opc.tcp://plc1:4840",
updateRate: 1000,
tags: "/Plant/*/Sensors/*"
},
Level2: {
provider: "SCADAProvider",
endpoint: "http://scada:8080",
updateRate: 5000,
tags: "/Control/*/*"
},
Level3: {
provider: "MESProvider",
endpoint: "http://mes:9090",
updateRate: 60000,
tags: "/MES/*/*"
},
Level4_5: {
provider: "ERPProvider",
endpoint: "http://erp:8443",
updateRate: 300000,
tags: "/Enterprise/*/*"
}
};
UNS Optimization Settings:
Level0_1:
BufferSize: 10000
Compression: true
DeadbandType: Absolute
DeadbandValue: 0.5
Level2:
BufferSize: 5000
StoreAndForward: true
Priority: High
Level3:
BufferSize: 1000
BatchingInterval: 60s
Priority: Normal
Level4_5:
BufferSize: 100
BatchingInterval: 300s
Priority: Low
Level 4-5 (ERP) <--> REST/SOAP
?
Level 3 (MES) <--> OData/GraphQL
?
Level 2 (SCADA) <--> OPC UA
?
Level 0-1 (PLC) <--> EtherNet/IP
Pattern: Publish/Subscribe via MQTT
Publisher: /Plant/Production/Cell1/Reactor1/Temperature
Subscribers:
- /Control/Loops/TIC-1001 (Control)
- /MES/Batch/Current/Temperature (MES)
- /Maintenance/Monitoring/Reactor1 (Maintenance)
// Level 3 to Level 2 Transaction
async function sendProductionOrder(order) {
const transaction = {
id: generateUUID(),
timestamp: new Date().toISOString(),
source: "/MES/Orders",
target: "/Control/Production",
type: "ProductionOrderRequest",
payload: {
orderId: order.id,
product: order.product,
quantity: order.quantity,
recipe: order.recipe,
scheduledStart: order.startTime
},
requiresAck: true,
timeout: 30000
};
await publishToUNS(transaction);
await waitForAcknowledgment(transaction.id);
}
? Maintain ISA-95 level separation - Clear boundaries between levels ? Use semantic naming - Self-describing paths and attributes ? Implement data contracts - Defined schemas between levels ? Version your models - Track changes to data structures ? Monitor data quality - Include quality indicators with data ? Design for scalability - Consider future growth
? Skip levels - Direct Level 0 to Level 4 connections ? Mix contexts - Business logic in control systems ? Ignore standards - Custom implementations without ISA-95 alignment ? Forget security - Each level needs appropriate security ? Overlook performance - Consider update rates and data volumes
Assessment Phase:
Design Phase:
Implementation Phase:
Validation Phase:
UNS Design Based on ISA-95 (Reference)
Keep under Industry Standards (Reference) (it already appears there).
Cross-link both from Solution Concepts → Unified Namespace (Foundation) and from the UNS pages in Modules Reference.
ISA-95 — Enterprise–Control Integration (Reference)
Contents (bullets)
What ISA-95 covers (levels, models, when to use).
Levels at a glance (L0–L4) and typical system scope.
Data objects & flows (orders, materials, production, status).
How it maps in FrameworX
UNS concepts you’ll use (Asset Tree, Tags, DataTemplates/UDTs, Enumerations).
Relevant connectors (OPC UA, MQTT/Sparkplug B) for L2↔L3 integration.
Design patterns (area/site/line/equipment decomposition, naming).
Evidence & compliance: what to document and test.
Related How-to Guides (link out): UNS Configuration; Connect OPC UA/MQTT; Map UDTs to equipment models.
UNS Design Based on ISA-95 (Reference)
Contents (bullets)
Why model UNS with ISA-95 (stable topology, clearer ownership).
Asset Tree modeling guide (site → area → line → unit → equipment).
Templates & semantics
Build DataTemplates (UDTs) for equipment classes.
Use Enumerations for states, modes, alarms.
Tag strategy (granularity, names, metadata) and provider choices (OPC UA, MQTT Sparkplug B, SQL, PI, Canary, etc.).
Runtime considerations (historian, KPIs, security zones, redundancy; link to architecture/deployment patterns).
Common anti-patterns (flat tag lists; mixing levels; template drift).
Worked example: map a packaging line to Asset Tree + UDTs, then ingest via OPC UA and publish via MQTT/Sparkplug B.
Cross-links to keep UX tight
From Unified Namespace (Modules Reference) pages—Asset Tree, Tags, DataTemplates, Enumerations, TagProvider Connections—link to both Reference pages above.
From Connectivity Hub (MQTT/Sparkplug B, OPC UA) link to the UNS Design page for modeling guidance.
If you want, I can draft the first page with headers and one-line blurbs so you can paste it directly into the docs.