Skip to content

Module Type Package (VDI/VDE/NAMUR 2658)

The Module Type Package (MTP) is a vendor-neutral, file-based package format defined by the VDI/VDE/NAMUR 2658 multi-part series. An MTP describes a Process Equipment Assembly (PEA), a skid or module that arrives pre-engineered with its own internal control logic, in enough detail that a plant-level orchestrator can integrate it without bespoke engineering work for each new piece of equipment. The underlying file format is AutomationML (AML), and the runtime communication path between module and orchestrator is OPC UA.

For normative text, see the VDI/VDE/NAMUR 2658 standard itself.

What the standard covers

The series organizes a module's exposed surface into four aspects:

Aspect Purpose
Process Control The set of services a module offers, their parameters, and the state machine each service follows.
HMI The graphical representation a module provides for a plant operator screen, including faceplates and process pictures.
Diagnostics and Maintenance Diagnostic information, alarms, and maintenance interactions the module exposes for upkeep workflows.
Alarm Management The alarms the module raises, their priorities, and how they are surfaced upward to the plant alarm system.

The package is a self-contained AML file. An orchestrator that implements an MTP-conformant integration point can in principle accept a module from any vendor whose product ships a valid package.

Service-based interaction model

MTP treats each PEA as a provider of named services. A service has parameters, one or more procedures (self-completing or continuous), and a mandatory, non-configurable state machine: 16 states in five levels, driven by ten commands with a fixed bitwise coding, defined normatively in VDI/VDE/NAMUR 2658 Part 4. The standard describes this model as similar to the ISA-88 concept, and the similarity stops short of identity. Two MTP commands (Restart, Complete) have no ISA-88 counterpart, and the joint NAMUR/ISA-88 working group's alignment of the two models is not yet unified. Cloud-Native DCS therefore carries the MTP vocabulary natively and declares its ISA-88 correspondence in one place (ADR 0045). The two models are never treated as interchangeable.

The orchestrator's job is to invoke services in the right order, with the right parameters, as a recipe is executed. The module's internal control logic (sequences, interlocks, lower-level loops) stays inside the module and is not the orchestrator's concern.

Adherence posture

Aligned at the architecture level. Native MTP package import is implemented. The Part 5.1 runtime binding, MTP export and certification are not. No round trip against a vendor PEA has been run.

Cloud-Native DCS is designed around the same service-based abstraction MTP uses to expose modules to an orchestrator. The mapping from MTP concepts to our CRDs is direct:

MTP concept Cloud-Native DCS equivalent
ModuleTypePackage (PEA description) Unit + EquipmentCapability
ModuleService PhaseTemplate (phase definition)
MTP service state machine pkg/mtpservice — the Part 4 vocabulary (16 states, 10 commands, Table 14 codings, Figure 3 transitions) with a declared correspondence onto the pkg/statemachine ISA-88 model
ServiceControl interface Service-plane recognition signature in device discovery — a node exposing the ServiceControl variable shape pre-classifies as a Unit (ADR 0045) — and, once declared on the Unit, the addresses phase logic drives through MTP_COMMAND / MTP_STATE / MTP_COMMAND_ENABLED and the Unit detail reads back through GET /units/{name}/mtp-services
ServiceParameter Phase parameter (recipe parameter binding)
HMI aspect Gateway HMI runtime (Web UI)
Alarm Management aspect alarm CRD group (Alarm Management)
Diagnostics and Maintenance aspect Historian + audit trail (Historian, Batch Records)

When a recipe phase drives a module service, it does so through the standard's own interface, with no translation layer. A step action writes one of the ten Part 4 commands to the service's command channel with MTP_COMMAND, gated on the live CommandEn word the module publishes. The following transition guards on MTP_STATE, the state the module reports. The module keeps its state machine and we read its feedback, which is the POL role the standard describes. See Structured Text for the authoring shape and examples/smart-skid/phase-templates-mtp-dosing.yaml for a worked pair of phase templates, one per procedure kind.

The same feedback pair is readable outside a phase run. A smart Unit's detail page lists its declared services with the state the module reports and the commands its CommandEn word currently enables, read on demand. Nothing is mirrored into status. That is the surface an engineer uses to answer why a phase held on a command the module refused: the refusal is visible as the accepts-list that did not contain it. The panel reads only. Commanding a service is done from phase logic, where the run that owns the module is the thing issuing the command. See API Reference → MTP Module Services.

What is not yet implemented

The architectural alignment is in place, but specific MTP artifacts are not:

  • The Part 5.1 runtime binding. Recognition and addressing key on the ServiceControl variable shape browsed from the live server. The manifest-declared node binding of Part 5.1 (currently a draft edition) plays no part yet. See ADR 0045 for what changes if that is adopted.
  • MTP export. Producing an MTP package that describes a unit Cloud-Native DCS itself manages (so that another orchestrator could consume it) is also not implemented.
  • Certification. The system has not been tested against an MTP conformance test lab. No certification claim is made.
  • A proven round trip against a vendor PEA. Both halves are proven against real artifacts: the parser against two vendor manifests from different revisions of the format, and the generated resources against the live CRDs. What no test covers is a vendor PEA answering a declaration this product imported, because no such module has been on the bench. The gap belongs to the ServiceControl interaction, and it closes the first time a design partner puts a skid in front of it.

These are tracked as roadmap items. They do not block real-world integration with a vendor module today, because the underlying service surface is the same regardless of whether the description arrived as an AML file or as a hand-authored CRD set.

Reading a vendor's package

Package import landed in #1497. dcs mtp import and the gateway's POST /api/v1/import/mtp parse the AutomationML/CAEX container and generate the IOModule, Unit and ControlModule set an engineer used to transcribe. What the file declares and this product cannot represent is reported per item rather than dropped, because a partial import that silently discards a service is worse than a refusal. The engineer's walkthrough, including the four findings worth expecting, is on the OEM skids page.

Two properties of the format are worth recording here, since neither is obvious from the standard's prose and both were settled against real vendor exports.

A manifest carries a namespace URI. A namespace index is assigned by the server at startup, so a file written months earlier could not carry one. Imported addresses are therefore emitted in the URI form nsu=<uri>;s=<identifier>, which resolves against the server's NamespaceArray at connect time.

Files in the field speak two incompatible service vocabularies. The current revision declares a ServiceProcedure with a ProcedureID. The older one declares a ServiceStrategy with a StrategyID and renames the ServiceControl channels to match. The channels correspond one for one, and they are still not treated as aliases: the older file does not say which coding its state and command words use, and this product writes the mandatory Table 14 coding. Services from an older file are recognized and refused by name, which is a different outcome from a file that declares no services at all. Its control modules import normally.

One parser detail an integrator can hit. A manifest is read as UTF-8, US-ASCII or ISO-8859-1 (also spelled latin1). Any other declared encoding is refused by name. A Latin-1 file is transcoded on the way in, because Go's XML decoder reads UTF-8 and nothing else. Handing it those bytes unchanged ended the parse at the first accented character (#1515).

Import produces CRs the engineer then owns. Nothing re-reads the file and nothing binds to it, matching how the device discovery wizard already behaves. A live binding that tracks a vendor's revised package is a separate question and is not implemented.

  • ADR 0045 — the MTP service model decision: ServiceControl-shape recognition, the native vocabulary, and the conformance posture.
  • IEC 63280 — the international IEC rollup of MTP.
  • NAMUR NE 148 — the orchestrator-side recommendation that complements MTP's module-side scope.
  • Control Modules — the device-level abstraction below the phase.
  • Phases — the orchestrator's view of a service invocation.
  • Structured Text — the builtins that drive a declared module service from phase logic.
  • ISA-88 traceability — formal mapping of ISA-88 requirements to CRDs and code.