Information modeling features in the upcoming UA SDK

Update 20.5.2014: Edited things that have changed recently.

The release of the 2.0 version of our Java SDK is just around the corner. In the new version, we are introducing new features that should help you to use information models in your UA applications. In this blog post, I will tell you about how to

  • generate Java classes from your UA models
  • create instances of UA types in your server applications
  • read instances of UA types in your client applications

Code generation

The new SDK has an option to include a code generation tool which basically converts your information models from NodeSet2.xml-format to Java classes. You can create NodeSet2.xml files with UaModeler design tool.

The generator has its own codegen-folder:

codegen\
  lib\
    *.NodeSet2.xml     --  dependent NodeSet2.xml-files
    *.package          --  Java packages of the dependent models
    *.package.clj      --  Used when model has multiple packages
  templates\           --  Mustache templates used in code generation
    common\            --  templates common to both server and client
      *.java.mustache  --  template for each generated class
      partials\
        *.mustache     --  partials included in the templates
    client\            --  client only templates
    server\            --  server only templates
  build.xml            --  Apache Ant task for code generation
  codegen.properties   --  configuration used by build.xml
  codegen-*.jar        --  code generator executable
  Readme.md            --  generic notes and instructions
  ReadmeSample.md      --  an example on how to use the generator  
  set-package.bat      --  script for defining packages (Windows)
  set-package.sh       --  script for defining packages (Linux/Mac)

To initially setup your code generation infrastructure, you have to edit the codegen.properties file:

  1. add path to your source NodeSet2.xml file
  2. add Java package for your model or use the set-package scripts
  3. select templates you want to generate code from
  4. add paths where code should be generated to

And that’s it! Now you can just run the Ant build tool and source code will appear in the output folder. By executing the Ant task in your build script, you do not have to worry about code generation afterwards; code is generated each time the source NodeSet2.xml file changes!

Currently, code generation supports the following features:

  • Object types and variable types
    • Getters and setters for child objects and variables
    • Getters and setters for child variable values
  • Method calls and implementations
  • Custom structures and enumerations

Create instances on UA server

To integrate the generated code to your UA server application, follow these steps:

// 1. Register classes on your UaServer object.
// The Information model class is generated for each information model.
server.useModel(InformationModel.MODEL);

// 2. Load type nodes from the SampleTypes.xml NodeSet2.xml file.
server.getNodeManagerTable().loadModel(this.getClass().getResource("SampleTypes.xml").toURI());

// 3. Now you can create an instance of a ValveType
// with a NodeManagerUaNode:
ValveType valve = manager.createInstance(ValveType.class, "Valve1");

// 4. Use the instance.
// e.g., set the value of Flow variable.
UaNode objNode = server.getNodeManagerTable().getNode(Identifiers.ObjectsFolder);
objNode.addComponent(valve);
double i = 0;
while (true) {
	i = i + 1;
	valve.setFlowValue(i);
	Thread.sleep(1000);
}

Read instances on UA client

Reading instances with UA client is now really simple:

// 1. Register classes on your UaClient object.
client.useModel(InformationModel.MODEL);

// 2. Get a node from server with an AddressSpace object.
// Give the nodeId of the instance as a parameter.
ValveType valve =
(ValveType) addressSpace.getNode(nodeId);

// 3. Read value of the Flow variable.
valve.getFlowValue();

Additional reading

In the codegen folder, there are Readme.md and ReadmeSample.md files that contain up to date instructions for use.

Java source code generation from OPC UA information models

Leave a Reply