Information Model Standards
MicroDCS uses established industrial information-model standards and schema-driven code generation to keep application payloads typed, consistent, and transport-independent. This page summarizes the standards and model-generation patterns that shape the framework's data layer.
OPC UA
OPC UA information models and companion specifications provide much of the semantic structure used by MicroDCS.
JSON Schemas representing OPC UA information models can be generated from NodeSet XML files. These schemas are then used to generate Python dataclasses through datamodel-code-generator. MicroDCS uses a custom generation template to add framework-specific behavior, including:
Configinner class for mashumaro- custom attributes
x-*inConfiginner class
uv run microdcs dataclassgen dataclasses \
--imports microdcs.dataclass.DataClassConfig \
--imports microdcs.dataclass.DataClassResponseMixin \
--imports microdcs.dataclass.DataClassMixin \
--imports microdcs.models.machinery_jobs_mixin.JobStateMixin \
--imports dataclasses.field \
--base-class microdcs.dataclass.DataClassMixin \
--config-base-class microdcs.dataclass.DataClassConfig \
--add-mixin 'ISA95JobOrderDataType->JobStateMixin' \
machinery_jobs.schema.json
OPC 40001-3: Machinery Job Management
For OPC UA Machinery Job Management, the custom template also generates:
opcua_state_machinewith serialized python dict from JSON Schema (useast.literal_eval()to deserialize str to dict)- custom attributes
opcua_state_machine_statesandopcua_state_machine_transitionswith ready to use dictionaries for usage withtransitionslibrary - custom attribute
opcua_state_machine_effectsstoring transition events
Some manual additions are still required for Machinery Job Management support:
MethodReturnStatusenum- additional
JobOrderControlExtclass that adds the dotted states and transitions from the specification, without the meta statePrepared - fix missing transition name for
Run - add initial states to sub-state machines
- helpers to map between state names and state IDs
Links:
EUInformation
Engineering-unit metadata is derived from the OPC UA EUInformation model and related mapping tables.
ISA-88/ISA-95
ISA-88 and ISA-95 provide the manufacturing-domain concepts used by the framework's sequence control and job-management examples.
ISA-95 Introduction
ISA-95 vs. ISA-88
- ISA-88 and ISA-95 integrated consulting
- What is ISA-88 manufacturing
- Using ISA-88 and ISA-95 together
Custom Models
The code generator also exposes options for extending generated models for application-specific protocols and behaviors.
Supported customization patterns include:
- Add
__custom_metadata__: InitVar[dict[str, Any] | None] = Nonefor use in__post_init__(). It is populated from the CloudEvent.
- Add additional
InitVarfields for use in__post_init__(). These can be populated through response helpers such asevent.response(mystatus=MyStatus.OKAY).
uv run microdcs dataclassgen dataclasses \
--init-fields 'mystatus->MyStatus' \
--init-fields 'init->dict[str,str]' \
my.schema.json
- Add hidden fields.
uv run microdcs dataclassgen dataclasses \
--hidden-fields '_hidden_str->str' \
--hidden-fields '_hidden_obj->Obj1|Obj2' \
my.schema.json
- Enable root-union generation workaround for schemas with top-level
oneOf/anyOfwhere root collapsing causes unwanted flattening.
- Schema file names are converted into safe Python module names automatically (for example,
My Schema.schema.json->my_schema.py).
Example: generate the greetings models:
uv run microdcs dataclassgen dataclasses \
--imports microdcs.dataclass.DataClassConfig \
--imports microdcs.dataclass.DataClassResponseMixin \
--imports microdcs.models.greetings_mixin.GreetingsDataClassMixin \
--imports dataclasses.field \
--base-class microdcs.models.greetings_mixin.GreetingsDataClassMixin \
--config-base-class microdcs.dataclass.DataClassConfig \
--hidden-fields '_hidden_str->str' \
--hidden-fields '_hidden_obj->HiddenObject' \
--validation \
--request-object \
--custom-metadata \
greetings.schema.json