15:39, EEST
April 7, 2016
I have created an XML file in NodeSet2 form with the definition of a datatype derived from structure (XY-Position), for which codegen fails.
The relevant part is:
<UADataType NodeId=”ns=1;i=8008″ BrowseName=”1:XYPosition”>
<DisplayName>XYPosition</DisplayName>
<Description>Describes a position in the plane</Description>
<References>
<Reference ReferenceType=”HasSubtype” IsForward=”false”>i=22</Reference>
</References>
<Definition Name=”XYPosition”>
<Field DataType=”Double” Name=”x”/>
<Field DataType=”Double” Name=”y”/>
</Definition>
</UADataType>
CodeGeneration fails if this DataType is included in the XML file; if it’s removed, other elements (e.g. UAObjectTypes) are created.
Codegen fails with:
[java] ERROR occured during generation.
[java] Exception in thread “main” java.lang.NullPointerException
[java] at clojure.core$with_meta.invoke(core.clj:214)
[java] at clojure.data.zip$mapcat_chain.invoke(zip.clj:86)
Which does not help me any further. Is this a (known?) bug, or am I missing something here?
Thanks a lot!
17:06, EEST
April 17, 2013
Hello,
Thanks for contacting us. Indeed, the error message in this case does not help you further.
Probably the error occurs because encoding nodes Default Binary and Default XML have not been defined for the DataType in question. The XML shown above seems to be correct otherwise.
Here is an example definition of these missing nodes:
<DisplayName>Default Binary</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=76</Reference>
<Reference ReferenceType="HasEncoding" IsForward="false">ns=1;i=3001</Reference>
<Reference ReferenceType="HasDescription">ns=1;i=6005</Reference>
</References>
</UAObject>
<UAObject SymbolicName="DefaultXml" NodeId="ns=1;i=5002" BrowseName="Default XML">
<DisplayName>Default XML</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=76</Reference>
<Reference ReferenceType="HasEncoding" IsForward="false">ns=1;i=3001</Reference>
<Reference ReferenceType="HasDescription">ns=1;i=6006</Reference>
</References>
</UAObject>
Here the NodeId ns=1;i=3001 refers to my custom structure type.
Let us know if this helps.
By the way, are you generating the XML by hand? Ready made tools are valuable, especially with larger information models. Please see UA Modeler for reference https://prosysopc.com/products/opc-ua-modeler/
12:37, EEST
April 7, 2016
Thank you, this helped!
I’ve implemented that test in the UA modeler, which adds these information in the exported XML. This compiles fine.
So far I’ve been using vim to edit the xml manually based on samples (OpcUa, DI, …). This allows good control of every detail, and worked quite well on another, larger example.
However, creating these structured data types convinced me to use this UA modeler tool, despite its quite frequent crashes, instead of manually editing the xml, because it seems a really large effort to maintain these structured data types (e.g. to provide the base64-encoded xml “ByteString” Value version as well…).
Furthermore, I found an error in the “Opc.Ua.Di.Nodeset2.xml” file provided in the lib directory of the codegenerator: the NodeId “ns=1;i=6164″ has DataType=”Boolean”, it should be “String” according to DI standard.
14:50, EEST
April 17, 2013
Hello,
Good to know that the original issue was resolved.
You are correct about the Opc.Ua.Di.Nodeset2.xml file. I looked at the mantis bug tracker of OPC Foundation and it seems that this is already reported and actually should be fixed in the current development version of the Opc.Ua.Di.Nodeset2.xml. If you are interested, see https://opcfoundation.org/resources/issue-tracking/ for more information about the bug tracking. Issue 3290: “Issues in OPC DI UANodeSet XML file” describes this error in the Nodeset file.
Thanks for letting us know about this. We will update the Nodeset files in the SDK as soon as they are published.
Let us know if you have some further questions or comments.
17:36, EEST
July 27, 2016
Hi,
I’m still having the same problem.
I created the address space in UaModeler(version 1.4.2) and a the following structured datatype.
<DisplayName>InspectionInfo</DisplayName>
<Description>a</Description>
<References>
<Reference ReferenceType="HasEncoding">ns=1;i=5001</Reference>
<Reference ReferenceType="HasEncoding">ns=1;i=5006</Reference>
<Reference ReferenceType="HasSubtype" IsForward="false">i=22</Reference>
</References>
<Definition Name="1:InspectionInfo">
<Field DataType="DateTime" Name="StartTime"/>
<Field DataType="DateTime" Name="FinishTime"/>
<Field DataType="Int32" Name="ID"/>
</Definition>
</UADataType>
Related encondig nodes:
<DisplayName>Default Binary</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=76</Reference>
<Reference ReferenceType="HasEncoding" IsForward="false">ns=1;i=3004</Reference>
<Reference ReferenceType="HasDescription">ns=1;i=6050</Reference>
</References>
</UAObject>
<UAObject SymbolicName="DefaultXml" NodeId="ns=1;i=5006" BrowseName="Default XML">
<DisplayName>Default XML</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=76</Reference>
<Reference ReferenceType="HasEncoding" IsForward="false">ns=1;i=3004</Reference>
<Reference ReferenceType="HasDescription">ns=1;i=6051</Reference>
</References>
</UAObject>
the codegen does not report errors, but java files from StructuredDataType are not created.
I am using ‘Prosys-OPC-UA-Java-SDK-Client-Server-Evaluation-2.2.2-638’ version of SDK.
thanks in advance
15:34, EEST
April 17, 2013
Hi,
Sorry to hear that you are having problems.
Are you able to generate some code successfully and only this structured data type is not produced? Or is the problem that the code generator is not producing anything?
This sounds like some kind of a configuration issue as the code generator does not produce errors and also no Java files are generated.
15:53, EEST
July 27, 2016
13:37, EEST
April 17, 2013
Hi,
Well, this sounds a little strange. The XML snippets that you posted earlier look correctly formatted and you are able to use the code generator otherwise normally.
One detail to note is that the code generator will make an up-to-date check for the input files and will not generate code if the source files have not changed. This can sometimes cause confusion. In case you wish to force the generation, you can remove the hidden ‘.codegen’ file from the destination directory. This is handled in the part “Up-to-date check” of the Readme.md file.
The name of the ID field in the InspectionInfo structure probably needs to be changed to something else because the code generator generates field named ID into the generated Java class. However, this should not stop the code generator from working so you should worry about this only later when you use the generated Java class.
We’ll need to have some information to help you further. Could you for example post the output that you get from the code generator?
17:20, EEST
July 27, 2016
Hi,
First of all, i think that there is no problem with “up-todate check”, since i have deleted the output file every time before call code generator.
So, it must generate all files from scratch.
One example of generated code of :
– public abstract class InspectionItemTypeImplBase extends BaseObjectTypeImpl implements InspectionItemType
@Override
public InspectionInfo[] getInspections() {
UaVariable node = getInspectionsNode();
if (node == null)
throw new RuntimeException("Mandatory node Inspections does not exist");
Object value = node.getValue().getValue().getValue();
return (InspectionInfo[]) value;
}
The returned type ‘InspectionInfo’ cannot be found because was not generated. But for other types, like String or NodeId, worked fine.
Besides StructuresDataTypes, I would like to recall that code for Objects, Methods were not generated as well.
9:02, EEST
April 17, 2013
Hi,
I understand that something is going wrong. However, it’s hard to say what’s going wrong based on this information. The XML snippets that you posted earlier are valid and the code generator should work with them. The conditions “java files are not created” or “InspectionInfo cannot be found ” are just too vague to make any meaningful guessing.
To inspect this further, we would need to know how to reproduce your issue or at least get the output from the code generator. This log may show what is going wrong.
If you would like to share us your information model and steps to reproduce the issue but you don’t like to post them here on the forum, you can also share them with us by emailing them to uajava-support@prosysopc.com.
19:26, EEST
July 27, 2016
Hi,
I’m sorry about last post. I did not mean to be rude.
I gave up working with codegeneretor but i can send the model information and more details later.
But came a new question regarding: how to write a structured variable?
I always get bad enconding exception.
consider the code below:
v.setStartTime(new DateTime());
v.setFinishTime(new DateTime());
v.setId(1);
EncoderContext encoderContext = myClient.getEncoderContext();
ExtensionObject extensionObject = ExtensionObject.binaryEncode(v, encoderContext);
=class=
public static final ExpandedNodeId TYPE_ID;
public static final ExpandedNodeId BINARY;
public static final ExpandedNodeId XML;
private DateTime startTime;
private DateTime finishTime;
private int id;
public InspectionInfoClass(){
}
public InspectionInfoClass clone() {
InspectionInfoClass a = new InspectionInfoClass();
return a;
}
public int hashCode() {
byte var2 = 1;
int var3 = 31 * var2 + (this.startTime == null?0:this.startTime.hashCode());
var3 = 31 * var3 + (this.finishTime == null?0:this.finishTime.hashCode());
var3 = 31 * var3 + (this.id == 0 ?0:new Integer(this.id).hashCode());
return var3;
}
public DateTime getStartTime() {
return startTime;
}
public void setStartTime(DateTime startTime) {
this.startTime = startTime;
}
public DateTime getFinishTime() {
return finishTime;
}
public void setFinishTime(DateTime finishTime) {
this.finishTime = finishTime;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public ExpandedNodeId getTypeId() {
return TYPE_ID;
}
@Override
public ExpandedNodeId getXmlEncodeId() {
return XML;
}
@Override
public ExpandedNodeId getBinaryEncodeId() {
return BINARY;
}
static {
TYPE_ID = new ExpandedNodeId(new NodeId(1, UnsignedInteger.getFromBits(3004)));
BINARY = new ExpandedNodeId(new NodeId(1, UnsignedInteger.getFromBits(5006)));
XML = new ExpandedNodeId(new NodeId(1, UnsignedInteger.getFromBits(5001)));
}
}
13:49, EEST
December 21, 2011
At least, you must define the ExpandedNodeId constant using the NamespaceUris, instead of NamespaceIndex:s (=1 in your example), since the actual Index may be whatever in practice.
As you can see, writing the code manually is not very simple either, so I would still recommend working with the code generation.
The code generator should generate the structure types to the common interface part. It does not generate any instances, such as Objects. The instances are to be generated in code – or they will also be created when you read the information model from the Nodeset.xml into your application.
17:29, EET
July 27, 2016
Hi,
let me see if i can summarise.
I have two related problems. One is about the codegen and the second is about the java client framework.
1- when i use the output xml genereted by UaModeler, the codegen was not able to generate the class related to the structured type, but could generate other classes. (post from August). No error is shown, but it is incomplete.
So, i created a new model with only one strutured type (with same children types) and the codegen could generate the class.
I do not understand why it does not work when i use my xml with the complete AddressSpace.
2- I want to write a structured type. I am able to write simple data types using java framework on Android app, but i could write a structured type only using the .Net framework and C# code generated by UaModeler.
So, based on the code generated (when it worked with only one structured type), i wrote the class manually and used the classes EncoderContext and ExtensionObject (like my last post). In the client side i have not read Nodeset.xml.
How can i write a structured type using client java framework?
Where can i find an example?
9:23, EET
April 17, 2013
Hello,
Sorry to hear that you keep experiencing issues.
1. To inspect this issue further, we would need to know how to reproduce your issue or at least get the output from the code generator. Preferably, send the information model that causes problems to uajava-support mailing list. This way we can reproduce and fix the issue in the best way.
2. Have you looked at the tutorial documents that are supplied together with the Java SDK? These are available in the doc-folder. As a start to use generated classes in the OPC UA client application, please take a look at the client tutorial chapter 15 (more specifically 15.1-15.4.).
Also, the code generator is supplied together with sample UaNodeset file called SampleTypes.xml. You can start by generating code from this sample and then using the generated example classes in your client and server application code.
Most Users Ever Online: 1919
Currently Online:
18 Guest(s)
Currently Browsing this Page:
1 Guest(s)
Top Posters:
Heikki Tahvanainen: 402
hbrackel: 144
rocket science: 88
pramanj: 86
Francesco Zambon: 83
Ibrahim: 78
Sabari: 62
kapsl: 57
gjevremovic: 49
Xavier: 43
Member Stats:
Guest Posters: 0
Members: 737
Moderators: 7
Admins: 1
Forum Stats:
Groups: 3
Forums: 15
Topics: 1524
Posts: 6450
Newest Members:
fannielima, kristiewinkle8, rust, christamcdowall, redaahern07571, nigelbdhmp, travistimmons, AnnelCib, dalenegettinger, howardkennerleyModerators: Jouni Aro: 1026, Pyry: 1, Petri: 0, Bjarne Boström: 1026, Jimmy Ni: 26, Matti Siponen: 346, Lusetti: 0
Administrators: admin: 1