Skip to content

Latest commit

 

History

History
128 lines (94 loc) · 4.06 KB

code_gen.md

File metadata and controls

128 lines (94 loc) · 4.06 KB

wsopcua DataType Code generator

About

To be able to use custom OPC UA data types one has to generate them for the client side.

The source for the data type generator is/are one or more xxx_NodeSet2.xml files. Alternatively the information for the binary serialization format is also available in .bsd-file (i.e.: Opc.Ua.Types.bsd).

Actually the information of the .bsd-file is part of a NodeSet2.xml file in base64 encoded form.

DataType Generator

wsopcua provides a dataset generator that can handle NodeSet2.xml- and .bsd-files as input to generate DataType classes.

To be able to generate classes from multiple NodeSet2/bsd files with dependencies to different specified locations a data-type-gen.json file is used.

Usage Example (in your project / monorepo):

node ./node_modules/@wsopcua/wsopcua/bin/wsopcua-schema-gen.js -c ./data-type-gen.json

Generator Config Format

To describe how the config file can be used let's look at an example:

You have a monorepo with 2 projects / npm packages (ProjectA, ProjectB). In addition you get 3 NodeSet2.xml files from your OPC UA backend developer: feature_a1.NodeSet2.xml, Feature_a2.NodeSet2.xml, feature_b1_NodeSet2.xml

feature_a*.NodeSet2.xml nodeset types should be generated to ProjectA and feature_b1_NodeSet2.xml types should go to ProjectB.
In addition feature_b1.NodeSet2.xml has types in it that have members of types defined in feature_a1.NodeSet2.xml

To get the imports and dependencies right the configuration contains of multiple target project configurations.

Note that all relative paths of this config file are relative to the config file itself.

{
  "projects": [
    {
      "projectName": "project-a",
      "projectSrcPath": "./packages/ProjectA/src",
      "schemaImports": [
        {
          "pathToSchema": "./nodesets/feature_a1.NodeSet2.xml",
          "modulePath": "/generated/a1"
        },
        {
          "pathToSchema": "../schemas/Opc.Ua.Di.NodeSet2.xml",
          "modulePath": "/generated/a2",
          "namespace": 10
        }
      ]
    },
    {
      "projectName": "project-b",
      "projectSrcPath": "./packages/ProjectB/src",
      "schemaImports": [
        {
            "pathToSchema": "https://files.opcfoundation.org/schemas/UA/1.05/Opc.Ua.Safety.NodeSet2.xml"
            "modulePath": "/generated/safety"
        }
        {
          "pathToSchema": "./nodesets/feature_b1.NodeSet2.xml",
          "modulePath": "/generated/b1"
        },


      ]
    }
  ]
}

The projectName

property contains the name of the project (npm package). It is used for references of other DataTypes from other libraries

Such a generated DataType could look like the following example (notice the import)

import { DataTypeA1 } from 'project-a/generated/a1';

export class DataTypeB1 extends DataTypeA1{ ... }

The projectSrcPath

property defines the path to the src folder of the specific project

The schemaImports

property hold a list schema imports that correspond to different NodeSet2.xml schema files.

pathToSchema can bei either a relative path to the NodeSet2.xml-file or a valid url like https://files.opcfoundation.org/schemas/UA/1.05/Opc.Ua.Types.bsd.xml

modulePath appended to projectSrcPath results in the target directory for the generated classes.

In the above example the generation process results in the following folder structure for ProjectA:

.
+--
+-- packages/ProjectA/src/generated/a1
|   +-- data-type-a1-1.ts
|   +-- data-type-a1-2.ts
|   +-- name-it-a.ts
|   +-- index.ts
+-- packages/ProjectA/src/generated/a2
|   +-- data-type-a2_1.ts
|   +-- data-type-a2_2.ts
|   +-- data-type-a2_3.ts
|   +-- index.ts

Note: the generated index.ts files get generated.
These barrel files are generated to be able to do easier imports.

With the namespace:

property it is possible to define a fixed namespace id for generated types of a given node-set