TL;DR — OPC UA for Machinery: Job Management (OPC 40001-3)
Full spec: reference.opcfoundation.org/Machinery/Jobs/v100/docs
What Is It?
OPC UA Machinery Job Management defines a standardized building block for dispatching, controlling, and monitoring production jobs on machinery items. It builds on ISA-95 Job Control (OPC 10031-4) and extends it with machinery-specific parameters, data types, and integration patterns.
Think of it as the "work order interface" between your MES/MOM system and individual machines on the shop floor.
The Problem It Solves
Without a standard job management interface, every machine vendor invents their own way to:
- Send production orders to a machine (recipes, programs, metadata)
- Control execution — start, pause, resume, abort
- Track progress — runs completed, quantities produced, time elapsed
- Retrieve results — good/scrap quantities, BOM traceability, performance data
This spec standardizes all of that into a single, vendor-independent OPC UA model.
Core Concepts
| Term | Definition |
|---|---|
| Job Order | A unit of scheduled work dispatched for execution (ISA-95). Contains programs/recipes, parameters, and metadata. |
| Run | A completed execution (or subset) of a job order. A job may have multiple runs. |
| Item | An object produced as one quantity unit (1 piece, 5.6 kg, 10 m, etc.). |
Architecture Overview
flowchart TB
MES["MES / MOM System<br/>(Client)"]
subgraph Machine ["MachineryItem"]
JM["JobManagement<br/>(AddIn)"]
JOC["JobOrderControl<br/>ISA95JobOrderReceiverObjectType"]
JOR["JobOrderResults<br/>ISA95JobResponseProviderObjectType"]
JM --> JOC
JM --> JOR
end
MES -->|"Store / StoreAndStart<br/>(ISA95JobOrderDataType)"| JOC
MES -->|"Start / Pause / Resume<br/>Abort / Stop / Cancel"| JOC
JOR -->|"Results<br/>(ISA95JobResponseDataType)"| MES
style MES fill:#1d3557,color:#fff
style JM fill:#2d6a4f,color:#fff
style JOC fill:#264653,color:#fff
style JOR fill:#264653,color:#fff
Integration into a MachineryItem
The JobManagement object is added as an AddIn into the machine's MachineryBuildingBlocks folder. A machine may have multiple JobManagement instances to support different state machines for different job types.
JobManagementType — The Central ObjectType
JobManagement (JobManagementType)
├── JobOrderControl (ISA95JobOrderReceiverObjectType) [Mandatory]
│ ├── Store() ← Submit a job order
│ ├── StoreAndStart() ← Submit + immediately allow execution
│ ├── Start() ← Set job to AllowedToStart
│ ├── Pause() ← Pause execution
│ ├── Resume() ← Resume paused job
│ ├── Abort() ← Abort execution
│ ├── Stop() ← Graceful stop
│ ├── Cancel() ← Cancel before execution
│ ├── Update() ← Update job order data
│ ├── RevokeStart() ← Revoke AllowedToStart
│ └── JobOrderList[] ← All current job orders with states
│
└── JobOrderResults (ISA95JobResponseProviderObjectType) [Mandatory]
├── JobOrderResponseList[] ← Results for running/completed jobs
└── (Method/Event/Variable to expose results)
Job Order Lifecycle (State Machine)
stateDiagram-v2
[*] --> NotAllowedToStart: Store()
NotAllowedToStart --> AllowedToStart: Start()
AllowedToStart --> NotAllowedToStart: RevokeStart()
AllowedToStart --> Running: Machine starts
Running --> Interrupted: Pause()
Interrupted --> Running: Resume()
Running --> Ended: Completed
Running --> Aborted: Abort()
Interrupted --> Aborted: Abort()
Running --> Stopped: Stop()
NotAllowedToStart --> Cancelled: Cancel()
AllowedToStart --> Cancelled: Cancel()
Execution Order Priority
When multiple jobs are AllowedToStart, the machine picks the next job using:
- State — only jobs in
AllowedToStartcan execute - StartTime — earliest
StartTimegoes first - Priority — highest priority breaks ties
- Application-specific — if still tied, machine decides
The JobOrderList array reflects this ordering.
Predefined Job Parameters (Key-Value Pairs)
The spec standardizes 25+ parameters as key-value pairs in JobOrderParameters (input) and JobResponseData (output):
Input Parameters (MES → Machine)
| Parameter | Type | Description |
|---|---|---|
JobName | LocalizedText[] | Human-readable name |
OrderNumbers | String[] | ERP order references |
Customers | String[] | Customer names |
JobExecutionMode | Enum | Simulation / Test / Production |
RunsPlanned | UInt32 | Number of planned runs (0 = continuous) |
PlannedProductionTime | Duration | Pure production time |
PlannedSetupTime | Duration | Setup time before production |
PlannedQuantityPerRun | Double | Expected output per run |
PlannedOrderQuantity | Double | Total planned quantity (lot size) |
Overproduction | Boolean | Continue past nominal output? |
JobAnnotation | LocalizedText[] | Operator instructions |
Output Parameters (Machine → MES)
| Parameter | Type | Description |
|---|---|---|
RunsCompleted | UInt32 | Counter of completed runs |
RunsStarted | UInt32 | Counter of started runs |
ActualQuantityCurrentRun | Double | Current run output |
ActualUnitBusyTime | Duration | Elapsed time since production start |
ActualProductionTime | Duration | Value-adding time only |
ProducedQuantity | Double | Total produced (good + scrap + rework) |
GoodQuantity | Double | Quantity meeting quality requirements |
EstimatedRemainingTime | Duration | Approximate time to completion |
JobResult | Enum | Unknown / Successful / Unsuccessful |
AsBuiltBOM | BOMInformationDataType[] | Bill of materials of produced output |
OutputPerformanceInfo | OutputPerformanceInfoDataType[] | Performance data (pressure, temp, etc.) |
Parameters also reuse ISA-95 structures for Personnel (operators), Equipment (machine components), Physical Assets, and Material (inputs/outputs with quantities, tracking IDs, locations).
Key Data Types
| DataType | Purpose |
|---|---|
| JobExecutionMode | Enum: SimulationMode (0), TestMode (1), ProductionMode (2) |
| JobResult | Enum: Unknown (0), Successful (1), Unsuccessful (2) |
| OutputInformationDataType | Identifies output by ItemNumber + optional OrderNumber, LotNumber, SerialNumber |
| OutputInfoType | Bitmask selecting which ID fields are used |
| BOMComponentInformationDataType | One component in the bill of materials (Identification + Quantity + Unit) |
| BOMInformationDataType | Full BOM: Identification + ComponentInformation[] |
| OutputPerformanceInfoDataType | Performance record: Identification + StartTime + EndTime + Parameters[] |
| ProcessIrregularity | Enum: CapabilityUnavailable (0), Detected (1), NotDetected (2), NotYetDetermined (3) |
Concrete Example: Woodworking
A tree trunk is broken down into 1 shelf floor, 4 table legs, and a bag of chips:
flowchart LR
subgraph Input
T["🌲 Tree Trunk<br/>1 pcs"]
end
subgraph Machine ["Woodworking Machine"]
JO["Job Order #12345"]
end
subgraph Output
SF["📐 Shelf Floor<br/>1 pcs<br/>2500×1500×15.8mm"]
TL["🦵 Table Legs<br/>4 pcs<br/>125×855×125mm"]
CH["🪵 Chips<br/>1.75 m³<br/>Spruce"]
end
T --> JO
JO --> SF
JO --> TL
JO --> CH
Flow:
- MES calls
StoreAndStart()withISA95JobOrderDataTypecontaining material requirements (1 tree input, planned outputs with dimensions) - Job enters
AllowedToStart→ machine picks it up →Running - During execution,
JobOrderResultsprovides intermediate data (runs completed, quantities) - On completion →
Endedstate, finalISA95JobResponseDataTypeincludesMaterialActuals(what was actually produced),AsBuiltBOM(traceability),OutputPerformanceInfo - MES retrieves results and calls remove to clean up
Key Takeaways
- Built on ISA-95 — reuses
ISA95JobOrderReceiverObjectTypeandISA95JobResponseProviderObjectTypefrom OPC 10031-4 - Two halves —
JobOrderControl(send & control jobs) +JobOrderResults(get execution data) - State machine controls lifecycle — Store → Start → Running → Ended/Aborted/Stopped
- Standardized parameters — 25+ predefined key-value pairs for planning inputs and production outputs, aligned with ISO 22400 KPIs
- Full traceability —
AsBuiltBOMtracks every component used;OutputPerformanceInforecords process parameters - Flexible identification — outputs tracked by ItemNumber, OrderNumber, LotNumber, and/or SerialNumber
- Multiple jobs — machines can run several jobs in parallel; ordering by StartTime then Priority
- AddIn pattern —
JobManagementplugs into anyMachineryItemviaMachineryBuildingBlocks - Multiple instances — a machine can have several
JobManagementinstances for different state machines - Vendor-independent — same interface whether it's glass production, woodworking, or any other machinery
Relationship to Other Specs
flowchart TB
ISA["OPC 10031-4<br/>ISA-95 Job Control<br/>(base types & state machine)"]
BBB["OPC 40001-1<br/>Machinery Basic Building Blocks<br/>(MachineryItem, AddIns)"]
JOBS["OPC 40001-3<br/>Machinery Job Management<br/>(this spec)"]
CS["Companion Specs<br/>(MachineTool, Robotics, etc.)"]
ISO["ISO 22400<br/>(KPI definitions)"]
ISA -->|"ISA95JobOrderReceiverObjectType<br/>ISA95JobResponseProviderObjectType"| JOBS
BBB -->|"MachineryItem<br/>MachineryBuildingBlocks"| JOBS
JOBS -->|"standardized job interface"| CS
ISO -->|"KPI parameter names<br/>(APT, AUBT, GQ, PQ, etc.)"| JOBS
style JOBS fill:#2d6a4f,color:#fff