Skip to main content

From YAML to a nodeset

One model in, three artefacts out.

NodeSet2.xml

The deliverable. NodeSet2.xml is the interchange format defined by OPC 10000-6, and every OPC UA server, SDK and tool consumes it — open62541, the .NET SDK, node-opcua, your vendor's stack.

Nothing about the file says it came from us. That is deliberate: the YAML is a convenience for authoring, not a format anyone downstream has to adopt.

symbols.csv — and why you commit it

A mapping from BrowseName to the NodeId the generator assigned.

It is an input as well as an output. On the next run the generator reads it and reuses the same NodeIds for the same BrowseNames. Without it, NodeIds are free to shift — and any client that cached one breaks, silently, in a way that looks like a server fault rather than a build change.

Commit it

symbols.csv belongs in version control next to the model. It is the only thing standing between an innocuous edit and a renumbered address space.

documentation.md

A Markdown specification of the model — types, members, data types, and class diagrams. opcua-modeler viewer renders it in a browser, and --pdf produces a companion-specification document you can send to someone.

This is generated from the same model as the nodeset, so it cannot describe a version of the model that does not exist.

Validation happens first

Nothing is written until the model compiles. The compiler resolves every companion specification you declared, builds the full address space in memory, and checks your model against it — which is why it can tell you that a type does not exist, or that a value is in the wrong place under DI rules, rather than producing a nodeset that fails later in a server.

Diagnostics carry stable codes; see the diagnostics catalogue.

Where this runs

The same engine, in three places:

Desktop CLIopcua-modeler generate, entirely offline
REST APIPOST /api/v1/generate with an API key
MCPopcua_model_generate, for agents

The browser editor runs the same validation live as you type, which is why the problems panel and the CLI agree.