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 halves β€” JobOrderControl (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 traceability β€” AsBuiltBOM 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 pattern β€” JobManagement 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