Coder Social home page Coder Social logo

opcfoundation / ua-modelcompiler Goto Github PK

View Code? Open in Web Editor NEW
150.0 25.0 93.0 22.83 MB

ModelCompiler converts XML files into C# and ANSI C

License: MIT License

Batchfile 1.02% C# 95.40% C 2.29% C++ 0.01% Dockerfile 0.02% Shell 0.07% TypeScript 1.18%

ua-modelcompiler's Introduction

Model Compiler

The OPC Foundation Model Compiler will generate C# and ANSI C source code from XML files which include the UA Services, data-types, error codes, etc.; and numerous CSV files that contain NodeIds, error codes, and attributes etc.

The input format for the tool is a file that conforms to the schema defined in UA Model Design.xsd.

2022-10-15: the tool now supports Part 6 Annex F (a.k.a. NodeSet2) as a syntax for the input files see schema.

The output of the tool includes:

  1. A NodeSet which conforms to the schema defined in Part 6 Annex F;
  2. An XSD and BSD (defined in Part 3 Annex C) that describes any datatypes;
  3. Class and constant definitions suitable for use with the .NET sample libraries;
  4. Other data files used to load an information model into a Server built with the .NET sample libraries;
  5. A CSV file which contains numeric identifiers.

The UA Model Design.xsd has more information about the schema itself.

The .NET sample libraries has a sample Model Design file that illustrate how to create a user defined model. This batch file is used to regenerate the files used in the sample after changes.

The tool only produces ANSI C output for the stack.

All of the standard outputs are published in the Nodeset GitHub repository

Developers should never need to build the standard outputs themselves.

2022-10-15: out of date due to changes needed to support NodeSet2 as an input format
Tutorial by Stefan Profanter here.

Command line parameters for ModelDesigns or NodeSets:

Takes an OPC UA ModelDesign file and generates a NodeSet and code for the .NETStandard stack.

Usage: ModelCompiler compile [options]

Options:
  -?|-h|--help       Show help information.
  -d2                The path to the ModelDesign or NodeSet2 file which contains the UA information model. The first
                     file specified is the model to generate. The rest are included models. The file path may be
                     followed by the namespace prefix and a short name for model. Commas seperate each field.
  -c                 The path to the CSV file which contains the unique identifiers for the types defined in the UA
                     information model. Not used if the target is a NodeSet2 file.
  -cg                Creates the identifier file if it does not exist (used instead of the -c option).
  -o2                The output directory for the generated files.
  -ansic             The path to use when generating ANSI C stack code (internal use only).
  -stack             The path to use when generating .NET stack code (internal use only).
  -version           Selects the source for the input files. v103 | v104 | v105 are supported.
  -useAllowSubtypes  When subtypes are allowed for a field, C# code with the class name from the model is created
                     instead of ExtensionObject. No effect when subtypes are not allowed.
  -id                The first identifier to use when assigning new ids to nodes.
  -exclude           Comma seperated list of ReleaseStatus values to exclude from output.
  -mv                The version of the model to produce.
  -pd                The publication date of the model to produce.
  -rc                Indicates that a release candidate nodeset is being generated.

Example

Opc.Ua.ModelCompiler compile -d2 .\Opc.Ua.Machinery.NodeSet2.xml,Opc.Ua.Machinery,Machinery -d2 Opc.Ua.Di.NodeSet2.xml,Opc.Ua.DI,DI -version v105 -exclude Draft -o2 .\output

Command line parameters for NodeSets based on URIs rather than files:

Searches a directory tree for nodesets and generates code for the specified model URIs.

Usage: ModelCompiler compile-nodesets [options]

Options:
  -?|-h|--help  Show help information.
  -input        The path to the directory containing the nodesets.
  -o2           The path to the directory to use to write the generated files.
  -uri          The URI of the model to generate.

Example

Opc.Ua.ModelCompiler compile-nodesets -input .\v105\ -o2 .\Tests -uri http://opcfoundation.org/UA/Machinery/ -uri http://opcfoundation.org/UA/IA/ -uri http://opcfoundation.org/UA/DI/

Version History

Version Changes
2.0 Intial release with version tracking and .NET 5.0 support.
2.1 Added UA 1.05.00 support.
Switched to Microsoft.Extensions.CommandLineUtils.
Arguments are the same, however, the command 'compile' must be specified.
Use --help for more details.
Fixed bug in generating the 'uanodes' input for the .NET codebase.
2.2 Added UA 1.05.02 support.
Added support for NodeSet2 input format.
Added DisplayName to enumeration fields.
Add Union/OptionalFields Support.
Add IJsonEncodeable interface.
Remove unnecessary descriptions in autogenerated code.
Add -compile-nodesets command
2.3 Added UA 1.05.03 support.
Numerous fixes needed for 1.05.03.
Upgrade to .NET 8.0.
Generate constants in TypeScript.
2.4 Added 1.04.12 Hotfix and updated NuGets

The executable file version has the form 2.0.YYMM.DDHH where the last two fields are based on the time that it was built.

About this Repository

This repository contains sub-modules, which are independently tracked. Please clone this repository as shown:

git clone https://github.com/OPCFoundation/UA-ModelCompiler --recursive

If access to the submodules is denied then leave --recursive flag off and only use the 'ModelCompiler Solution.sln' which uses NuGet packages instead of the submodules.

This repository is not updated directly. All changes are first made in a member-only version that can be found here.

The version in the member-only repository includes content that is only available to OPC Foundation members such as draft versions of the specifications. When a new version of the OPC UA specification is released, the member-only content is removed and copied to the public repository.

In many cases, updates to the UA-ModelCompiler will require updates to UA-.NETStandard codebase. This means a complete release of the UA-ModelCompiler will need to wait for a update to UA-.NETStandard NuGet packages. The member only version links to a member only fork of UA-.NETStandard allows the changes to be viewed before they are merged with the public baseline.

The public repository is updated as frequently as the OPC UA Specification (once every 3-5 months). When a release starts, all issues reported on the public repository will be reviewed and, if appropricate, incorporated into the member-only codebase. This includes any pull requests to this public repository, which are subject to the OPC Foundation Contributor License Agreement (CLA). When the process completes all accepted public contributions will be merged back into the public codebase along with updates from the member-only codebase.

License Model

The ModelCompiler code is MIT license, however, it links to the UA-.NETStandard NuGet packages which is covered under the OPC Foundation Redistributables licence.

Docker Build

A Docker build with the UA Model Compiler is available in GitHub as ua-modelcompiler.

It can be downloaded with this command:

docker pull ghcr.io/opcfoundation/ua-modelcompiler:latest

You may need to use this command before downloading the docker image:

docker login ghcr.io -u <user> -p <person access token>

Running the image requires a local directory with the source files which is specified with the -v option (the ${pwd} is using bash/powershell syntax. Use %CD% if using Windows CMD). The following command is run from the directory where the source files are:

docker run -v ${pwd}:/data --rm ghcr.io/opcfoundation/ua-modelcompiler:latest compile -d2 /data/Opc.Ua.Di.NodeSet2.xml,Opc.Ua.DI,DI -o2 /data/generated 

The tool can also automatically find all NodeSet dependencies if it is run from a directory with all necessary NodeSets (i.e. UA-Nodeset). The command to run from the nodeset directory is:

docker run -v ${pwd}:/nodesets --rm ghcr.io/opcfoundation/ua-modelcompiler:latest compile-nodesets -input /nodesets -o2 /nodesets/generated -uri http://opcfoundation.org/UA/Machinery/ -uri http://opcfoundation.org/UA/DI/

The docker image can be rebuilt from source with this command:

docker build -t opcua-modelcompiler .

Example Generation

The following process will demonstrate how to generate code using the supplied nodeset files:

  1. Clone the repository and then build the source in Visual Studio 2022, in Release mode.
  2. Open a Command prompt and then launch the BuildStandardTypes.bat
  3. After the script completes, navigate to the .\Published folder to view the output.
  4. Optionally, modify the BAT file and specify the location of your UA Stack(s) to automatically copy the generated files.

XML Files

Model Design example

An excerpt of the Model Design file is shown here:

?xml version="1.0" encoding="utf-8" ?>
<opc:ModelDesign
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:opc="http://opcfoundation.org/UA/ModelDesign.xsd"
  xmlns:ua="http://opcfoundation.org/UA/"
  xmlns="http://opcfoundation.org/UA/"
  xmlns:uax="http://opcfoundation.org/UA/2008/02/Types.xsd"
  TargetNamespace="http://opcfoundation.org/UA/"
  TargetNamespaceVersion="1.02"
>
  <opc:Namespaces>
    <opc:Namespace Name="OpcUa" Prefix="Opc.Ua" InternalPrefix="Opc.Ua.Server" XmlNamespace="http://opcfoundation.org/UA/2008/02/Types.xsd">http://opcfoundation.org/UA/</opc:Namespace>
  </opc:Namespaces>

  <opc:Property SymbolicName="NodeVersion" DataType="ua:String" PartNo="3">
    <opc:Description>The version number of the node (used to indicate changes to references of the owning node).</opc:Description>
  </opc:Property>

  <opc:Property SymbolicName="ViewVersion" DataType="ua:UInt32" PartNo="3">
    <opc:Description>The version number of the view.</opc:Description>
  </opc:Property>

Other Repositories

This ModelCompiler is used to generate the content of the Nodeset GitHub repository.

This ModelCompiler is used to generate the content of the .NET Samples GitHub repository.

ua-modelcompiler's People

Contributors

alinmoldovean avatar benjamin1988 avatar benkinooby avatar dependabot[bot] avatar dongmingsun avatar fbarresi avatar jimluth avatar mpostol avatar mregen avatar nathanpocock avatar opcfoundation-org avatar pro avatar randy-armstrong avatar randy-armstrong-alias avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ua-modelcompiler's Issues

Units are not generated

Hi
I tried to create an EUInformation property. It seems to me that either I did a mistake or the compiler is not generating the code for the Units not correctly.
In case I did something wrong, it would be great to add an example to the existing models.

It tested it with the following snippet:

 <opc:Variable SymbolicName="SetPoint1" DataType="ua:Double" AccessLevel="ReadWrite" Historizing="true" TypeDefinition="ua:BaseVariableType" WriteAccess="0">
   <opc:Children>
     <opc:Property SymbolicName="ua:EngineeringUnits" DataType="ua:EUInformation" ModellingRule="Mandatory">
        <opc:Fields>
          <opc:Field Name="ua:NamespaceUri" DataType="tns:String">http://www.opcfoundation.org/UA/units/un/cefact</opc:Field>
          <opc:Field Name="ua:UnitId" DataType="tns:String" Value="4408652">4408652</opc:Field>
          <opc:Field Name="ua:DisplayName" DataType="tns:String">ยฐC</opc:Field>
        </opc:Fields>
     </opc:Property>
   </opc:Children>
 </opc:Variable>

[question] How to ModelCompile v105 nodeset + own model?

The BuildStandardTypes.bat uses ModelCompiler.Design.v104. Commit Fix 1.04 vs 1.05 duplication includes removal of the ModelCompiler.Design folder and defaulting to v104 for BuildStandardTypes.bat. The master branch of UA-Nodeset is v1.05 according to the readme.md so where is the Design.v105 folder used to create this or am I missing something? I wanted to check before doing something stupid like recreating the design folder by extracting the files from the UA-Nodeset repository and stripping out copyrights info added by scripts.

Invalid enums generation

I've declared the enum:

<opc:DataType SymbolicName="SiemensPlcType" BaseType="ua:Enumeration">
	<opc:Fields>
		<opc:Field Name="Common" Identifier="0" />
		<opc:Field Name="S7_1200" Identifier="1" />
		<opc:Field Name="S7_1500" Identifier="2" />
		<opc:Field Name="LOGO" Identifier="3" />
	</opc:Fields>
</opc:DataType>

Generated C# code is next:

public enum SiemensPlcType
{
    /// <summary>
    /// A description for the Common field.
    /// </summary>
    [EnumMember(Value = "Common_0")]
    Common = 0,

    /// <summary>
    /// A description for the S7_1200 field.
    /// </summary>
    [EnumMember(Value = "S7_1200")]
    S7_1200 = 1200,

    /// <summary>
    /// A description for the S7_1500 field.
    /// </summary>
    [EnumMember(Value = "S7_1500")]
    S7_1500 = 1500,

    /// <summary>
    /// A description for the LOGO field.
    /// </summary>
    [EnumMember(Value = "LOGO_3")]
    LOGO = 3,
}

Mistakes are in lines:

    S7_1200 = 1200,
    ...
    S7_1500 = 1500,

Should be:

    S7_1200 = 1,
    ...
    S7_1500 = 2,

XML Schema Explorer

Are there any sources of help or tutorials on using the XML Schema Explorer available?

Cant Compile Models using UANodeSet.xsd schema

Hello,

I want to generate C# source files with the ModelCompiler out of an InformationModel that was compiled as .xml using the UANodeSet.xsd. According to the description the ModelCompiler should be able to do that.

Following the instructions and the help file to generate the files, I get the follow Exception:

modelcompilerexception

The XML file starts like this:

informationmodel

I marked the line, that causes the Exception.

Did I miss something?

I would appreciate any help on this.

Thanks in advance!
Best regards

How to add "HasDescription" reference to a DataType?

I am currently trying to create an information model using UA-ModelCompiler. When I create my own Structured DataType I see that in the generated NodeSet file is preventing the FreeOPC-UA https://github.com/FreeOpcUa/python-opcua server to be able to get an "object" of that type (get_ua_class). When I create the same DataType using UAModeler it works.

After comparing and hacking into the NodeSet files I found that the reason for that is the missing HasDescription reference on the Types>DataTypes>OPC Binary>[NAMESPACE_DIC]>[DATA_TYPE]

  <UAVariable NodeId="ns=1;i=15013" BrowseName="1:versionDataType" ParentNodeId="ns=1;i=15009" DataType="String">
    <DisplayName>versionDataType</DisplayName>
    <References>
      <Reference ReferenceType="HasTypeDefinition">i=69</Reference>
      <!-- added manually start... -->
      <Reference ReferenceType="HasDescription" IsForward="false">ns=1;i=15008</Reference>
      <!-- ... added manually end  -->
      <Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=15009</Reference>
    </References>
    <Value>
      <String xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">versionDataType</String>
    </Value>
  </UAVariable>

where ns=1;i=15008 is the DeafultBinary Object.

When I manually set it it works.

'''So my question is: what is necessary to make in the ModelDesign in order to get that reference?'''

regards

TypeDefinition for Method node

The ModelDesign schema is used as the syntax definition of a language used to represent the UA Information Model. Each language must have also semantics definition that couples together the meaning (knowledge how to apply the text) and syntax constructs. Someone could say that the spec is a good description of the semantics. Partially it is true, but how to learn using the spec what it means TaypeDefinition attribute for the Method element in the example below:

          <Method SymbolicName="ADI:SetConfiguration" TypeDefinition="ADI:AnalyserDeviceTypeSetConfigurationMethodType">
            <Description>Write the complete configuration of the AnalyserDevice and all of its components to the analyzer server and make the new configuration active.</Description>
          </Method>

From my experience, I know that it is required for the compiler to generate arguments and return value.

FYI, the topic model life-cycle is covered by the section of my ebook available for free:

Address Space Model Life-cycle

It seems there are the following options:

  1. Make the compiler and its entry language compliant with the specification (not sure but it could be hard task)
  2. Provide an additional description of this language specification (should be included in the specification) - we discussed this topic many years - consider revisiting it.

The precise definition of the compiler language is important for the recovery process (disassembly) based on the UANodeSet in case the UANodeSet xml file must be customized. In other words, the recovery process makes sense only in the case we know the target we are going to restore.

I will appreciate any your opinion.

What happened to UA-TypeRepository

Hi, I am from GE, one of the members of OPCFoundation.

Last week there was a Repo called UA-TypeRepository. I was using the README's to learn OPCUA hierarchy.

Where did it go? Can you bring it back?

The generated code for IsEqual() does not call base.IsEqual() in some cases

The generated code for public override bool IsEqual(IEncodeable encodeable) does not call "if (!base.IsEqual(encodeable)) return false;" for some generated classes.
This seems to happen for classes without private members declared.
e.g.

        /// <summary cref="IEncodeable.IsEqual(IEncodeable)" />
        public override bool IsEqual(IEncodeable encodeable)
        {
            if (Object.ReferenceEquals(this, encodeable))
            {
                return true;
            }

            InstanceNode value = encodeable as InstanceNode;

            if (value == null)
            {
                return false;
            }


            return true;
        } 


        /// <summary cref="IEncodeable.IsEqual(IEncodeable)" />
        public override bool IsEqual(IEncodeable encodeable)
        {
            if (Object.ReferenceEquals(this, encodeable))
            {
                return true;
            }

            TypeNode value = encodeable as TypeNode;

            if (value == null)
            {
                return false;
            }


            return true;
        }

How to use DataTypes specified in Companion Specification

I need to use a Structure Data Type defined in a 3rd party companion specification in my model. The companion specification is available as NodeSet2.xml file.

I have declared the companion specification as an additional namespace in my model but I still get an error form the model compiler:

The DataType reference for node My_Node is not valid: CustomDataType.

How can I use the custom DataType in my Model. The goal is to generate a Nodeset2.xml file.

Building proxy classes from NodeSet2.xml file

I know, the model compiler does require the corresponding *model.xml file in order to create the NodeSet2.xml file and proxy classes.

Since companion specs must not provide the valid model.xml file, the UA-ModelCompiler is useless in that case. Unless we write the companion spec model by ourselves.
I am talking about the machinery companion spec, which can be found here: https://github.com/OPCFoundation/UA-Nodeset/tree/v1.04/Machinery

My question is, is there any official OPCFoundation tool which is capable in creating the c# proxy classes based on the NodeSet2.xml files? or will there be support in the UA-ModelCompiler?

What i see is that we seem to be forced to used any commercial sdk which creates different proxy classes incompatible to the official OPCFoundation c# stack.

So whats the purpose of the C# Stack on github, by providing an incomplete toolchain?

If somebody has any information about the intention/current sate, i would be very thankful!

In the meantime we have managed to write the corresponding model for a few companion specs we want to support. But once the companion specs changes, we need to manually adjust those models...

ValueRank serialization works incorrectly

The Save and GetAttributesToSave methods of BaseVariableState and BaseVariableTypeState won't serialize ValueRank if it's value is -2 (Any). This causes Update method to not initialize ValueRank at all, leaving it's value to default int value 0 (OneOrMoreDimensions). This can be fixed by omitting ValueRank from the serialization if it's value is 0 (OneOrMoreDimensions) instead of -2 (Any).

This issue causes invalid initialization strings for types which default ValueRank is Any when generating Opc.Ua.Classes file.

What tool generates the xml and csv file

Unified Automation have a UAModeller tool is their a tool that is used by the UA-ModelCompiler to generate the xml and csv file that will ultimately be used to generate the C# code. Can i ask to be pointed in the direction of the tool that is used to generate the xml and csv files that are consumed by UA-ModelCompiler?

UAModeller does not give me an xml file with the correct structure can you point me at what tool everyone is using in order to get xml in the correct format so UA-ModelCompiler can generate C#

thanks

Generated code should not have explicit namespace prefixes

        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)
        {
            return Opc.Ua.NodeId.Create(Boiler.ObjectTypes.GenericSensorType, Boiler.Namespaces.Boiler, namespaceUris);
        }

In this code NodeId and the Opc.Ua.NodeId are the seme type.

It makes the real problem if the code is not to be used in the Opc.Ua environment where the referenced classes are replaced by different once.

NodeId of type and instances are the same

Hello everyone

I use the model compiler to create dynamically an object from a generated type.
From what I understood, if I create a type in the xml, let's say EquipmentServiceType, the software automatically generates a c# class named EquipmentServiceState that will be used to create an instance of the object.
When I try to use it, the EquipmentServiceType node in the Address Space and the object EquipmentServices that have EquipmentServiceState as typeDefinition have the same NodeId.

Here is the code I wrote:
`

     var equipmentService = new EquipmentServiceState(null);
    // The equipment service type node has a NodeId of 1048, I checked before

     // nodeId not given yet
    equipmentService.Create(SystemContext, null, new QualifiedName("Equipment Services", NamespaceIndex), null, true);
    // if i check the nodeid of the equipment service, it is also 1048
    
    // Add references to the node so that it can be seen in the Address Space
    IList<IReference> references = null;

    if (!externalReferences.TryGetValue(Opc.Ua.ObjectIds.ObjectsFolder, out references))
    {
      references = new List<IReference>();
      externalReferences[Opc.Ua.ObjectIds.ObjectsFolder] = references;
    }

    equipmentService.AddReference(ReferenceTypeIds.Organizes, true, Opc.Ua.ObjectIds.ObjectsFolder);
    references.Add(new NodeStateReference(ReferenceTypeIds.Organizes, false, equipmentService.NodeId));

    // store it and all of its children in the pre-defined nodes dictionary for easy look up.
    AddPredefinedNode(SystemContext, equipmentService);`

What did I do wrong ?

HasAddIn reference wrong BaseType

OPC 10001-7: Interfaces and AddIns 9 Release 1.04 states:

The HasAddIn ReferenceType is a concrete ReferenceType and can be used directly. It is a subtype of the HasComponent ReferenceType.

So the BaseType here:

<opc:ReferenceType SymbolicName="HasAddIn" BaseType="ua:NonHierarchicalReferences" PartNo="5" ReleaseStatus="Released">
<opc:InverseName>AddInOf</opc:InverseName>
</opc:ReferenceType>

Should be HasComponent instead of NonHierarchicalReferences

Invalid ValueRank in some NodeState initialization strings

ModelCompiler generates initialization strings with invalid ValueRanks. This happens when NodeState has a ValueRank Any (-2). There is a check in GetAttributesToSave method of BaseVariableTypeState and BaseVariableState that if the ValueRank is -2 then it won't be stored in initialization string. When creating the state and the ValueRank is missing from the initialziation string then it is initialized to value 0. So all states with ValueRank -2 are incorrectly initialized with ValueRank 0.

To fix the bug, the check should be that if ValueRank is OneOrMoreDimensions (0) then it can be omitted from the initialization string.

Patch to fix the bug can be found as an attachment.
fix.txt

Wrong running the BuildStandardTypes.bat

When I run this batch file, there will always be a hint that the
The SymbolicId is already used by another node: CurrencyUnitType.
I make sure I download it alright.

AccessLevel enumeration lacks entries for the purpose of HistoryWrite

The UA Model Design.xsd specifies that the AccessLevel type can adopt one of "none", "Read", "Write", "ReadWrite".
However, the OPC-UA specification, part 3, paragraph 8.57 also specifies fields HistoryRead (bit 2) and HistoryWrite (bit 3) and some more. The HistoryWrite bit

"Indicates if the history of the value is writable. It also indicates if the history of the Variable is available via the OPC UA Server."

I wish to activate historizing and would therefore want to activate HistoryRead and HistoryWrite.

I'm aware of the "historizing" XML-attribute of the VariableTypeDesign. However, this would implement the OPC-UA attribute "historizing" which indicates that (paragraph 5.6.2.) :

...the Server is actively collecting data for the history of the Variable. This differs from the AccessLevel Attribute which identifies if the Variable has any historical data. A value of TRUE indicates that the Server is actively collecting data

Presently, my server refuses to historise data and I don't know how to activate it.

Yours,
Bob

help text inconsistent

The built in help text at
https://github.com/OPCFoundation/UA-ModelCompiler/blob/master/ModelCompiler/HelpFile.txt
seems to be inconsistent or incomplete.

Example command indicates possible use of -oi which is not explained. In what case is -oi preferable over -o?

Example command indicates possible use of -oe which is not explained. What does it do?

No explanation for -ansic

No explanation for -stack

No explanation for -useXmlInitializers

-version According to the example document in the help, -version seems to be an optional flag. Which values is the default value, if the flag is not set?

Kind regards

Wrong code at ModelDesignerValidator

UA-ModelCompiler/ModelCompiler/ModelDesignerValidator.cs has mistake at lines 5180..5184 at commit 647dda2 (and earlier):

if (hierarchyNode.Identifier is uint)
                        {
                            hierarchyNode.Instance.NumericId = (uint)hierarchyNode.Identifier;
                            hierarchyNode.Instance.NumericIdSpecified = false;
                        }

IT should be hierarchyNode.Instance.NumericIdSpecified = true; there.

Correct docker container link

@randy-armstrong thanks for merging #36

After that it would make sense that you enable automated docker container builds for your own OPCF account. Otherwise the Readme still links to my docker builds:
https://github.com/OPCFoundation/UA-ModelCompiler/blame/master/README.md#L34

Its very easy and can be done in 5 minutes.

  1. Create a personal account for you
  2. Create a new organization on docker cloud: https://hub.docker.com/orgs OPCFoundation would make sense here as a name
  3. Create a new repository UA-ModelCompiler
  4. Link that docker repo to the github repo: https://docs.docker.com/docker-hub/builds/link-source/
  5. Enable automated builds or just use the settings below: https://docs.docker.com/docker-hub/builds/

Here are the Settings I'm using, you can just use the same and you are done:

Branch: master
Tag: latest

image

  1. Update the readme link
  2. Just push to your repository, and it will automatically build a new docker container

You can also contact me directly if you have further issues or if I can support you in that direction
https://opcua.rocks/contact/

Can not compile empty namespace

Hi,

I want to compile the ModelDesign of an empty namespace but it fails with

PS C:\UA-ModelCompiler\Bin\Release> .\Opc.Ua.ModelCompiler.exe -d2 C:\opcua-modeling-tutorial\FooFltModel.xml -cg C:\opcua-modeling-tutorial\FooFltModel.csv -o C:\opcua-modeling-tutorial\FooFltModel -console
Object reference not set to an instance of an object.
   at Opc.Ua.ModelCompiler.ModelCompilerValidator.Validate2(IList`1 designFilePaths, String identifierFilePath, Boolean generateIds) in C:\UA-ModelCompiler\ModelCompiler\ModelDesignerValidator.cs:line 1099
   at Opc.Ua.ModelCompiler.ModelGenerator2.ValidateAndUpdateIds(IList`1 designFilePaths, String identifierFilePath, UInt32 startId, String specificationVersion) in C:\UA-ModelCompiler\ModelCompiler\ModelGenerator2.cs:line 95
   at Opc.Ua.ModelCompiler.Program.ProcessCommandLine2(List`1 tokens) in C:\UA-ModelCompiler\ModelCompiler\Program.cs:line 422

Here is the ModelDesign file I am trying to compile.

<?xml version="1.0" encoding="utf-8"?>

<ModelDesign
  xmlns:uax="http://opcfoundation.org/UA/2008/02/Types.xsd"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:ua="http://opcfoundation.org/UA/"
  xmlns:FooZbrFlt="https://new.foo.com/zebra-compression/flattening-and-subspacefolding/UA/"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  TargetNamespace="https://new.foo.com/zebra-compression/flattening-and-subspacefolding/UA/"
  TargetVersion="0.9.0"
  TargetPublicationDate="2020-05-01T00:00:00Z"
  xmlns="http://opcfoundation.org/UA/ModelDesign.xsd">

  <Namespaces>
    <!--No space allowed at the beginning of the namespace URL!
      Prefix sets the filenames of the generated files. -->
    <Namespace Name="FooZbrFlt" Prefix="FooFlt">https://new.foo.com/zebra-compression/flattening-and-subspacefolding/UA/</Namespace>
    <Namespace Name="OpcUa" Version="1.03" PublicationDate="2013-12-02T00:00:00Z">http://opcfoundation.org/UA/</Namespace>
  </Namespaces>
    
  <!-- Instantiate at least one variable (or object, or view, or ...) in namespace.
    Compiling an empty namespace will fail with error message:
	Object reference not set to an instance of an object.
    Uncomment to following view and the ModelDesign will compile successfully. -->
  
  <!-- 
  <View SymbolicName="FooZbrFlt:MyView">
    <Description>Dummy view.</Description>
    <References>
      <Reference IsInverse="true">
        <ReferenceType>ua:Organizes</ReferenceType>
        <TargetId>ua:ObjectsFolder</TargetId>
      </Reference>
    </References>
  </View>
  -->
</ModelDesign>

The model design file will compile successfully, if the view is uncommented and the namespace therefore is not empty.

Is this a bug of UA-ModelCompiler?

How to overwrite methods from BaseType

Is it possible to overwite a method from a BaseType? Let's say I have an object who's base type is TemporaryFileTransferType, can I overwrite it's method GenerateFileForRead?

  <ObjectType SymbolicName="MyNS:SubTypeObj" BaseType="ua:TemporaryFileTransferType" >
    <Children>
      <Method SymbolicName="MyNS:GenerateFileForRead" TypeDefinition="MyNS:GenerateFileForReadMethodType" ModellingRule="Mandatory">                
      </Method>   
    </Children>    
  </ObjectType>

I would like to do this so I can provide a method definition like so:

  <Method SymbolicName="MyNS:GenerateFileForReadMethodType">
    <InputArguments>
      <Argument Name="GenerateOptions" DataType="ua:String"></Argument>
    </InputArguments>
    <OutputArguments>
      <Argument Name="FileNodeId" DataType="ua:NodeId"></Argument>
      <Argument Name="FileHandle" DataType="ua:UInt32"></Argument>
      <Argument Name="CompletionStateMachine" DataType="ua:NodeId"></Argument>      
    </OutputArguments>
  </Method>

But when I try to do this, in the generated NodeSet2, the MethodDeclarationId is the id for the GenerateFileForRead in the TemporaryFileTransferType.

The reason for asking is because the machine vision companion specification asks to overwrite these methods and I would like to know how this could be done through a UA Model Design

current master broken (git commit ID c75b5bf)

Hi,

UA-ModelCompiler fails to build models it was capable of building before.
current git commit ID: c75b5bf
last working commit ID: 3754f9b ( tag: UA-1.04.7-2020-07-15)

PS C:\UA-ModelCompiler\Bin\Release> .\Opc.Ua.ModelCompiler.exe -d2 C:\opcua-animal-cs\animalModel.xml -cg C:\opcua-animal-cs\animalModel.csv -o C:\opcua-animal-cs\output -console

Error parsing file C:\opcua-animal-cs\animalModel.xml
   at ModelCompiler.ModelCompilerValidator.Validate2(IList`1 designFilePaths, String identifierFilePath, Boolean generateIds) in C:\UA-ModelCompiler\ModelCompiler\ModelDesignerValidator.cs:line 1115
   at ModelCompiler.ModelGenerator2.ValidateAndUpdateIds(IList`1 designFilePaths, String identifierFilePath, UInt32 startId, String specificationVersion) in C:\UA-ModelCompiler\ModelCompiler\ModelGenerator2.cs:line 99
   at ModelCompiler.Program.ProcessCommandLine2(List`1 tokens) in C:\UA-ModelCompiler\ModelCompiler\Program.cs:line 424

I am testing with
https://github.com/Pro/opcua-modeling-tutorial
https://github.com/Pro/opcua-animal-cs

Optional fields in DataTypes.

Hi

How is it possible to describe in ModelDesign format a DataTypes which contains Optional Fields. So for instance in in the NodeSet2 format i have something like that (from the VDMA Machine Vision companion specification

>  <UADataType IsAbstract="true" NodeId="ns=1;i=3019" BrowseName="1:BinaryIdBaseDataType">
>         <DisplayName>BinaryIdBaseDataType</DisplayName>
>         <References>
>             <Reference ReferenceType="HasSubtype" IsForward="false">i=22</Reference>
>             <Reference ReferenceType="HasEncoding">ns=1;i=5027</Reference>
>             <Reference ReferenceType="HasEncoding">ns=1;i=5271</Reference>
>         </References>
>         <Definition Name="1:BinaryIdBaseDataType">
>             <Field DataType="TrimmedString" Name="Id">
>                 <Description>Id is a system-wide unique name for identifying the recipe.</Description>
>             </Field>
>             <Field **IsOptional**="true" DataType="TrimmedString" Name="Version">
>                 <Description>Represents an optional version number of the identified recipe. It is recommended to be of the format Major.minor.patch.build or a subset thereof, but the actual format is implementation defined.</Description>
>             </Field>
>             <Field **IsOptional**="true" DataType="ByteString" Name="Hash">
>                 <Description>Represents an optional hash of the binary content of the actual recipe (as it would be transmitted by the transfer methods).
> The hash is supposed to be provided by the environment if existing. The environment shall use the same hash function on all recipes so that a difference in the hash indicates a difference in the recipe. It is recommended to use the SHA-256 algorithm for computing the hash, however, the actual algorithm is implementation-defined.</Description>
>             </Field>
>             <Field **IsOptional**="true" DataType="String" Name="HashAlgorithm">
>                 <Description>Name of the hash function used. Required if internally and externally computed hashes are to be compared.</Description>
>             </Field>
>             <Field **IsOptional**="true" DataType="LocalizedText" Name="Description">
>                 <Description>Optional short human readable description of the configuration.</Description>
>             </Field>
>         </Definition>
>     </UADataType>

So in the model design format do we have something to describe that fields are optional. The problem is that the encoders/decoders are not generated correctly in C# since it is written in part 6 we should generate a 4 bytes (UInt32) at the beginning of the encoding.

Is there something missing in the modelcompiler?

Thanks

Combining OPC UA - DI NodeSet with OPC UA PubSub NodeSet defined in IoT Gateway - OPC UA Publisher github repo

Hi,
I recently am experimenting for my university project on OPC UA DI nodeset and I wonder if I could give new feature like OPC UA PubSub to my UA Server application. I want to integrate both NodeSet to make my UA Server PubSub enabled. However, for that as per my knowledge I need to prepare a new NodeSet which collaborates both DI and PubSub NodeSets. How can I do this collaboration with UA Model-Compiler? Thanks and please correct me if I misunderstood the technology.

  • Jayesh

Ua Defined Types.xml has wrong supertypes for some types

The Ua Defined Types.xml in ModelCompiler/Design/UA Defined Types.xml has wrong supertypes for PermissionType and EventNotifierType. As the issues are the same the current NodeSet2 has, I will refer to the issues raised in that project:

PermissionType: OPCFoundation/UA-Nodeset#8
EventNotifier: OPCFoundation/UA-Nodeset#9

The EventNotifier is in my opinion quite critical, see my comments on the UA-Nodeset project issues. But both should be fixed.

Core library functionality

The local library Core contains functionality not required by the compiler. It seems similar to the library Core included in the project OPCFoundation/UA-.NET. It causes code synchronization and maintenance issues. We have also problem with license compatibility.
Proposal:

  • decouple the projects by creating a common component for the stack and compiler to be maintained separately;
  • cerate Nuget package that will be added to both projects.
  • the package should have compatible license.

Enumerations

Hello, we're using UA-ModelCompiler and actually we're solving issues with Enumerations.

Here's our XML description, focus on

  • opc:DataType TestEnum
  • opc:Method TestVoidEnumMethodType
  • opc:Variable testEnum
  • opc:Method TestVoidWithEnum
<opc:DataType SymbolicName="TestEnum" BaseType="ua:Enumeration">
  <opc:Fields>
    <opc:Field Name="State1" Identifier="1" Value="1"></opc:Field>
    <opc:Field Name="State2" Identifier="2" Value="2"></opc:Field>
    <opc:Field Name="State3" Identifier="3" Value="3"></opc:Field>
    <opc:Field Name="State4" Identifier="4" Value="4"></opc:Field>
    <opc:Field Name="State5" Identifier="5" Value="5"></opc:Field>
  </opc:Fields>
</opc:DataType>
...
<opc:Method SymbolicName="TestVoidEnumMethodType">
  <opc:Description>test method</opc:Description>
  <opc:InputArguments>
    <opc:Argument Name="testEnum" DataType="TestEnum"> </opc:Argument>
  </opc:InputArguments>
</opc:Method>
...
<opc:ObjectType SymbolicName="PluginExample" BaseType="CpiServerDeviceBaseType">
  <opc:Description>Description from model.txt for PluginExample</opc:Description>
  <opc:Children>
    <opc:Object SymbolicName="ExampleObject" TypeDefinition="ExampleObjectType" SupportsEvents="true" MinimumSamplingInterval="500">
      <opc:DisplayName>ExampleObject</opc:DisplayName>
    </opc:Object>
    <opc:Variable SymbolicName="testString" DataType="ua:String" MinimumSamplingInterval="1000" AccessLevel="ReadWrite"></opc:Variable>
    <opc:Variable SymbolicName="testInt" DataType="ua:Int32" MinimumSamplingInterval="1000" AccessLevel="ReadWrite"></opc:Variable>
    <opc:Variable SymbolicName="testLong" DataType="ua:Int64" MinimumSamplingInterval="1000" AccessLevel="ReadWrite"></opc:Variable>
    <opc:Variable SymbolicName="testDouble" DataType="ua:Double" MinimumSamplingInterval="1000" AccessLevel="ReadWrite"></opc:Variable>
    <opc:Variable SymbolicName="testEnum" DataType="TestEnum" AccessLevel="ReadWrite" MinimumSamplingInterval="500"></opc:Variable>
    <opc:Property SymbolicName="arrayOfInt" DataType="ua:Int32" ValueRank="Array" AccessLevel="Read" MinimumSamplingInterval="500"/>
    <opc:Method SymbolicName="Test"  TypeDefinition="ExampleTestMethodType"  ModellingRule="Optional"></opc:Method>
    <opc:Method SymbolicName="TestVoidStringMethod"  TypeDefinition="TestVoidStringMethodType"  ModellingRule="Optional"></opc:Method>
    <opc:Method SymbolicName="TestVoidVoidMethod"  TypeDefinition="TestVoidVoidMethodType"  ModellingRule="Optional"></opc:Method>
    <opc:Method SymbolicName="TestVoidWithEnum" TypeDefinition="TestVoidEnumMethodType"  ModellingRule="Optional"></opc:Method>
  </opc:Children>
</opc:ObjectType>

This leads to defining new enum type:
image

image

First issue is with Variable testEnum:
image
I supposed that it should be Enum type, so changing value should suggest combobox with enum values or something like that.
But nevermind, this is not critical.

Second and for our purpose critical issue is method with enum argument:
image

Argument is again filled with number (no combobox) and what's more whole method can't be invoked, because UA Expert "Could not convert argument 0 to variant type TestEnum".

Are we missing something?
I would be glad for any help or point to correct this.

Thank You
Martin

Default Values in Model Compiler instances

How can I set the Value attribute of an object type I define in a model xml file?

I am using the Model Compiler to create Object Types which contain hierarchies including Variables, I would like to set the Value on the object instances based on the model. I am setting DefaultValue in the model. When instantiating the object and initializing with NodeState.Create, Value does not get set. Should it be set to DefaultValue? Is there some way to set Value from the model? It seems to be prevented from the initialization string. Is there something I am missing?

(Moving this issue here from the UA-.NETStandard repository as requested.)

Generate code from UaNodeset file

I am trying to generate C#.NET code from a model defined as a XML file conforming to the "UANodeSet.xsd" format. Since this is the standard format for describing an OPC UA model I would expect that it is possible to generate code using the XML file as input. However the ModelCompiler expects an XML file conforming to the "UA Model Design.xsd".

Is there an easy way of converting a UaNodesSet XML file to a UA Model Design XML file. Or is there any other way to generate C#.NET code from a UaNodeSet XML file?

Parsing Error in XML File

I am new to OPC-UA. I have created basic XML file for the following hierarchy but I am getting parsing Error can you please identify my mistake.
(Nodes Hierarchy )
Plant
Line Number
Sensor1
Voltage A
Voltage B

Following is my XML code.

<?xml version='1.0' encoding='utf-8'?> <UANodeSet xmlns="http://opcfoundation.org/UA/2011/03/UANodeSet.xsd" xmlns:uax="http://opcfoundation.org/UA/2008/02/Types.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <NamespaceUris> <Uri>http://opcfoundation.org/UA/Sensor/</Uri> </NamespaceUris> <Aliases> <Alias Alias="Float">i=10</Alias> <Alias Alias="Organizes">i=35</Alias> <Alias Alias="HasTypeDefinition">i=40</Alias> <Alias Alias="HasProperty">i=46</Alias> </Aliases> <UAObject BrowseName="0:Plant" NodeId="i=20001" ParentNodeId="i=85"> <DisplayName>Plant</DisplayName> <Description>Plant</Description> <References> <Reference IsForward="false" ReferenceType="Organizes">i=85</Reference> <Reference ReferenceType="HasTypeDefinition">i=61</Reference> <Reference ReferenceType="Organizes">i=20002</Reference> </References> </UAObject> <UAObject BrowseName="0:LineNumber" NodeId="i=20002" ParentNodeId="i=20001"> <DisplayName>LineNumber</DisplayName> <Description>LineNumber</Description> <References> <Reference IsForward="false" ReferenceType="Organizes">i=20001</Reference> <Reference ReferenceType="HasTypeDefinition">i=61</Reference> <Reference ReferenceType="Organizes">i=20003</Reference> </References> </UAObject> <UAObject BrowseName="0:Sensor1" NodeId="i=20003" ParentNodeId="i=20002"> <DisplayName>Sensor1</DisplayName> <Description>The base type for all object nodes.</Description> <References> <Reference IsForward="false" ReferenceType="Organizes">i=20002</Reference> <Reference ReferenceType="HasTypeDefinition">i=58</Reference> <Reference ReferenceType="HasProperty">i=20004</Reference> <Reference ReferenceType="HasProperty">i=20005</Reference> </References> </UAObject> <UAVariable BrowseName="0:VoltageA" DataType="Float" NodeId="i=20004" ParentNodeId="i=20003"> <DisplayName>VoltageA</DisplayName> <Description>VoltageA</Description> <References> <Reference IsForward="false" ReferenceType="HasProperty">i=20003</Reference> <Reference ReferenceType="HasTypeDefinition">i=68</Reference> </References> <Value> <uax:Float>9.99</uax:Float> </Value> </UAVariable> <UAVariable BrowseName="0:VoltageB" DataType="Float" NodeId="i=20005" ParentNodeId="i=20003"> <DisplayName>VoltageB</DisplayName> <Description>VoltageB</Description> <References> <Reference IsForward="false" ReferenceType="HasProperty">i=20003</Reference> <Reference ReferenceType="HasTypeDefinition">i=68</Reference> </References> <Value> <uax:Float>9.99</uax:Float> </Value> </UAVariable> </UANodeSet>

I will also attach screenshot of error message I am getting.
parsingerror

Methods defined as "Draft" added in generated code without corresponding Method definition

Methods children defined as "Draft" in ModelDesign files are added in generated code without corresponding MethodState definition.
An example is GetEncryptingKeyMethodType defined in StandardTypes.xml.
This causes a compilation error in Opc.Ua.Classes.cs :

  <opc:Method SymbolicName="GetEncryptingKeyMethodType" PartNo="12" ReleaseStatus="Draft">
    <opc:InputArguments>
      <opc:Argument Name="CredentialId" DataType="ua:String" />
      <opc:Argument Name="RequestedSecurityPolicyUri" DataType="ua:String" />
    </opc:InputArguments>
    <opc:OutputArguments>
      <opc:Argument Name="PublicKey" DataType="ua:ByteString"></opc:Argument>
      <opc:Argument Name="RevisedSecurityPolicyUri" DataType="ua:NodeId"></opc:Argument>
    </opc:OutputArguments>
  </opc:Method>

  <opc:ObjectType SymbolicName="KeyCredentialConfigurationType" BaseType="ua:BaseObjectType" PartNo="12">
    <opc:Children>
      <opc:Property SymbolicName="ResourceUri"  DataType="ua:String" ValueRank="Scalar" ModellingRule="Mandatory" />
      <opc:Property SymbolicName="ProfileUri"  DataType="ua:String" ValueRank="Scalar" ModellingRule="Mandatory" />
      <opc:Property SymbolicName="EndpointUrls"  DataType="ua:String" ValueRank="Array" ModellingRule="Optional" />
      <opc:Property SymbolicName="ServiceStatus"  DataType="ua:StatusCode" ValueRank="Scalar" ModellingRule="Optional" />
      <opc:Method SymbolicName="GetEncryptingKey" TypeDefinition="GetEncryptingKeyMethodType" ModellingRule="Optional" ReleaseStatus="Draft" />
      <opc:Method SymbolicName="UpdateCredential" TypeDefinition="KeyCredentialUpdateMethodType" ModellingRule="Optional" />
      <opc:Method SymbolicName="DeleteCredential" ModellingRule="Optional" />
    </opc:Children>
  </opc:ObjectType>

option to create string instead of numeric NodeId

The model compiler by default generates a Predefined Nodes XML file where NodeIds have numerical identifiers like so
<uax:Identifier>ns=1;i=15301</uax:Identifier>.

I have a use case for string identifiers like
<uax:Identifier>ns=1;s=myThing</uax:Identifier>

Now, the model design XML file offers a StringId attribute element but this doesn't produce a string nodeId. I would suggest that use of this attribute produce a nodeId with string identifier rather than a numeric identifier.

Bob

Wrong command line help for `-cg`

-cg Generates the unique identifier CSV file instead of reading it (used instead of the -c option).

The only difference between -c and -cg is that -c throws an exception if the specified CSV file is not found. -cg reads the specified CSV if exists as well as -c. "instead of reading it" is wrong. Please improve the explanations.

Parse error in the loaded model xml file.

I get the following error when the attached xml file is loaded.
Error parsing file D:\ModelCompiler\ReducedCI874TypesTest.xml
at Opc.Ua.ModelCompiler.ModelCompilerValidator.Validate2(IList1 designFilePaths, String identifierFilePath, Boolean generateIds) in D:\UA-ModelCompiler-master\ModelCompiler\ModelDesignerValidator.cs:line 1001 at Opc.Ua.ModelCompiler.ModelGenerator2.ValidateAndUpdateIds(IList1 designFilePaths, String identifierFilePath, UInt32 startId, String specificationVersion) in D:\UA-ModelCompiler-master\ModelCompiler\ModelGenerator2.cs:line 96 at Opc.Ua.ModelCompiler.Program.ProcessCommandLine2(List1 tokens) in D:\UA-ModelCompiler-master\ModelCompiler\Program.cs:line 424 There is an error in XML document (2, 2). at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events) at System.Xml.Serialization.XmlSerializer.Deserialize(TextReader textReader) at Opc.Ua.Schema.SchemaValidator.LoadFile(Type type, String path) in D:\UA-ModelCompiler-master\Core\Types\Schemas\SchemaValidator.cs:line 254 at Opc.Ua.ModelCompiler.ModelCompilerValidator.Validate2(IList1 designFilePaths, String identifierFilePath, Boolean generateIds) in D:\UA-ModelCompiler-master\ModelCompiler\ModelDesignerValidator.cs:line 991

There is an error in XML document (2, 2).
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events) at System.Xml.Serialization.XmlSerializer.Deserialize(TextReader textReader) at Opc.Ua.Schema.SchemaValidator.LoadFile(Type type, Stream stream) in D:\UA-ModelCompiler-master\Core\Types\Schemas\SchemaValidator.cs:line 272 at Opc.Ua.CodeGenerator.TypeDictionaryValidator.Validate(Stream stream) in D:\UA-ModelCompiler-master\ModelCompiler\StackGenerator\Validators\TypeDictionaryValidator.cs:line 147 at Opc.Ua.ModelCompiler.ModelCompilerValidator.ImportTypeDictionary(Stream stream, String resourcePath) in D:\UA-ModelCompiler-master\ModelCompiler\ModelDesignerValidator.cs:line 632 at Opc.Ua.ModelCompiler.ModelCompilerValidator.ImportTypeDictionary(String filePath, String resourcePath) in D:\UA-ModelCompiler-master\ModelCompiler\ModelDesignerValidator.cs:line 624 at Opc.Ua.ModelCompiler.ModelCompilerValidator.Validate2(IList`1 designFilePaths, String identifierFilePath, Boolean generateIds) in D:\UA-ModelCompiler-master\ModelCompiler\ModelDesignerValidator.cs:line 997

ReducedCI874TypesTest.zip

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.