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