From PPR prototype to community tooling
DIAMOND built useful AutomationML software. The project ended. Now we are turning its reusable core into community-owned tooling.
David Hoffmann · Oussama Jarrar
Otto von Guericke University Magdeburg · Volkswagen AG
20 years of AutomationML · Conference 2026 · Hochschule Pforzheim, 22–23 September
We built it. We demonstrated it. Almost nobody else used it. That is the problem.
The project succeeded on paper. By our transfer goal, the editor never arrived in this community.
DIAMOND linked five engineering disciplines through shared concepts in AutomationML.
Five tools describe one plant. Each is correct, but the models do not connect.
AutomationML carries the common concepts. PPR gives every discipline the same view.
Shared information can be checked, processed and reused across disciplines and projects.
The papers are public. The reusable capability beneath them still needs a community home.
The documents explain the capability. They do not deliver software the community can use.
A result becomes community software when it has:
The record is public. The capability still needs a community home.
The editor was the demo. Its reusable value sits in the six layers below.
We showed the editor in papers, posters and demos. Nobody outside the project received a usable tool.
Package these six layers as an SDK, and the editor becomes one application built on top.
The format was never the sticking point. What a developer could actually pick up was. Of four questions, we could answer one.
The association owns the specification. I could send one clear link.
Examples were scattered across papers and project repositories.
DIAMOND contained the pieces, but no named, installable release.
The PPR editor ran at our institute. Nobody else could install it.
The gap became my job.
A specification is only the first of four layers a developer needs.
AML-JSON needs more than a JSON document.
The model is documented and conformant. AutomationML already does this well.
Developers need to load, navigate, edit, validate and write models without building another parser.
Versions, changelogs, tests, CI and planned deprecation turn a library into a production dependency.
Issues need owners. User needs need a route into the roadmap. Maintenance needs continuity.
The Python SDK starts from AML-JSON and proves compatibility through a round-trip in the AutomationML Editor.
from automationml import (attribute, caex_file, dump_json, dump_xml,
instance_hierarchy, internal_element, load_xml)
doc = caex_file("cell.aml")
robot = internal_element("Robot RB-10", id="ie-robot-01",
attributes=[attribute("payload", 210, unit="kg", data_type="xs:double")],
role_paths=["AutomationMLDMIRoleClassLib/Resource"])
doc.instance_hierarchies.append(
instance_hierarchy("Cell 01", internal_elements=[robot]))
# snake_case in Python, canonical CAEX names in the file
dump_json(doc, "cell.amljson") # no conversion: this IS the model
{ "SuperiorStandardVersion": ["AutomationML 2.1"],
"InstanceHierarchy": [{ "Name": "Cell 01",
"InternalElement": [{ "ID": "ie-robot-01", "Name": "Robot RB-10",
"Attribute": [{ "Name": "payload", "Value": "210", "Unit": "kg",
"AttributeDataType": "xs:double" }],
"RoleRequirements": [{ "RefBaseRoleClassPath": "…/Resource" }] }] }],
"SchemaVersion": "3.0", "FileName": "cell.aml" }
# SourceDocumentInformation elided
dump_xml(doc, "cell.aml") # CAEX 3.0 for the XML toolchain
<CAEXFile xmlns="http://www.dke.de/CAEX" SchemaVersion="3.0">
<InstanceHierarchy Name="Cell 01">
<InternalElement ID="ie-robot-01" Name="Robot RB-10">
<Attribute Name="payload" Unit="kg" AttributeDataType="xs:double">
<Value>210</Value>
<RoleRequirements RefBaseRoleClassPath="…/Resource"/>
# one logical model, two representations. ChangeMode elided.
cell.aml opens in the AutomationML Editor# saved again from the Editor, by the Editor's own writer
back = load_xml("cell_from_editor.aml")
# load_xml upgrades CAEX 2.15 input on the way in, so an
# older Editor file still comes back as a 3.0 model
doc = build_cell()
dump_xml(doc, tmp_path / "cell.aml")
back = load_xml(EDITOR_OUT / "cell.aml")
assert back.to_aml_dict() == doc.to_aml_dict()
# tests/test_xml_roundtrip.py, on every push:
def test_generated_xml_is_valid_caex_3_against_xsd(): ...
def test_xml_json_xml_keeps_semantic_references_valid(): ...
Instead of inventing another format, we use a purpose-built PPR editor. Its SDK foundation is reusable by other AutomationML applications.
Selecting the process shows what it takes in, what it hands on, and which resource performs it — with quantities. CAEX stays out of the interface.
AutomationML, SysML v2 or a process specification — all four exports are the SDK validating and serialising one model. Any application can reuse the same foundation.
Working software answered the four questions. Volkswagen chose AML-JSON for a toolchain its engineers already know, and the decision is being documented.
The specification opened the door. Working software closed the decision.
Volkswagen and Oussama Jarrar's doctoral research are moving ahead with AutomationML-JSON. Direct work resolved the open questions.
With Oussama Jarrar · abstract submitted, awaiting acceptance
The core reasonA modern toolchain: Python, JSON and pip. Incoming engineers already know it; the XML/C# stack requires extra onboarding.
An industrial member is back in the AutomationML conversation. Maintained software made that possible.
We need a repeatable transfer route for project software, papers, Application Recommendations and Best Practice Recommendations.
The project hands over documentation. The capability stays in the consortium.
Tried. We received the tip.
A community mini-job extracts and packages each result after the team moves on.
Works. Loses a year and momentum.
A full-time community role converts results while the authors are available.
Untested. Faster and far more expensive.
Which route becomes our default, and who owns it?
The SDK and editor are going open source under MIT. The browser demo is live today.
Find it here: github.com/DHoffmannOVGU/PPR-Editor
Thank you. Questions, issues and pull requests all mean someone is using it.