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:

  1. Send production orders to a machine (recipes, programs, metadata)
  2. Control execution — start, pause, resume, abort
  3. Track progress — runs completed, quantities produced, time elapsed
  4. 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

TermDefinition
Job OrderA unit of scheduled work dispatched for execution (ISA-95). Contains programs/recipes, parameters, and metadata.
RunA completed execution (or subset) of a job order. A job may have multiple runs.
ItemAn 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:

  1. State — only jobs in AllowedToStart can execute
  2. StartTime — earliest StartTime goes first
  3. Priority — highest priority breaks ties
  4. 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)

ParameterTypeDescription
JobNameLocalizedText[]Human-readable name
OrderNumbersString[]ERP order references
CustomersString[]Customer names
JobExecutionModeEnumSimulation / Test / Production
RunsPlannedUInt32Number of planned runs (0 = continuous)
PlannedProductionTimeDurationPure production time
PlannedSetupTimeDurationSetup time before production
PlannedQuantityPerRunDoubleExpected output per run
PlannedOrderQuantityDoubleTotal planned quantity (lot size)
OverproductionBooleanContinue past nominal output?
JobAnnotationLocalizedText[]Operator instructions

Output Parameters (Machine → MES)

ParameterTypeDescription
RunsCompletedUInt32Counter of completed runs
RunsStartedUInt32Counter of started runs
ActualQuantityCurrentRunDoubleCurrent run output
ActualUnitBusyTimeDurationElapsed time since production start
ActualProductionTimeDurationValue-adding time only
ProducedQuantityDoubleTotal produced (good + scrap + rework)
GoodQuantityDoubleQuantity meeting quality requirements
EstimatedRemainingTimeDurationApproximate time to completion
JobResultEnumUnknown / Successful / Unsuccessful
AsBuiltBOMBOMInformationDataType[]Bill of materials of produced output
OutputPerformanceInfoOutputPerformanceInfoDataType[]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

DataTypePurpose
JobExecutionModeEnum: SimulationMode (0), TestMode (1), ProductionMode (2)
JobResultEnum: Unknown (0), Successful (1), Unsuccessful (2)
OutputInformationDataTypeIdentifies output by ItemNumber + optional OrderNumber, LotNumber, SerialNumber
OutputInfoTypeBitmask selecting which ID fields are used
BOMComponentInformationDataTypeOne component in the bill of materials (Identification + Quantity + Unit)
BOMInformationDataTypeFull BOM: Identification + ComponentInformation[]
OutputPerformanceInfoDataTypePerformance record: Identification + StartTime + EndTime + Parameters[]
ProcessIrregularityEnum: 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:

  1. MES calls StoreAndStart() with ISA95JobOrderDataType containing material requirements (1 tree input, planned outputs with dimensions)
  2. Job enters AllowedToStart → machine picks it up → Running
  3. During execution, JobOrderResults provides intermediate data (runs completed, quantities)
  4. On completion → Ended state, final ISA95JobResponseDataType includes MaterialActuals (what was actually produced), AsBuiltBOM (traceability), OutputPerformanceInfo
  5. MES retrieves results and calls remove to clean up

Key Takeaways

  1. Built on ISA-95 — reuses ISA95JobOrderReceiverObjectType and ISA95JobResponseProviderObjectType from OPC 10031-4
  2. Two halvesJobOrderControl (send & control jobs) + JobOrderResults (get execution data)
  3. State machine controls lifecycle — Store → Start → Running → Ended/Aborted/Stopped
  4. Standardized parameters — 25+ predefined key-value pairs for planning inputs and production outputs, aligned with ISO 22400 KPIs
  5. Full traceabilityAsBuiltBOM tracks every component used; OutputPerformanceInfo records process parameters
  6. Flexible identification — outputs tracked by ItemNumber, OrderNumber, LotNumber, and/or SerialNumber
  7. Multiple jobs — machines can run several jobs in parallel; ordering by StartTime then Priority
  8. AddIn patternJobManagement plugs into any MachineryItem via MachineryBuildingBlocks
  9. Multiple instances — a machine can have several JobManagement instances for different state machines
  10. 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