16:49, EET
December 20, 2021
Hello,
I am trying to create a temperature control device (TCD EUROMAP 82.1).
But the classes generated by codegen not being compiled correctly.
start examples ————————————————————————————
/test1/src/com/prosysopc/ua/types/euromap83/server/DrivesTypeNodeBase.java
The return type is incompatible with BaseNode.getNodeVersion()
/test1/src/com/prosysopc/ua/types/euromap83/client/MouldTypeImplBase.java
The return type is incompatible with UaNodeImpl.getDescription()
/test1/src/com/prosysopc/ua/types/euromap83/VariableIds.java
Duplicate field VariableIds.TemperatureZoneCycleParametersType_ActualTemperature_EngineeringUnits
The return types are incompatible for the inherited methods UaNode.getNodeVersion(), ExternalChannelsTypeNodeBase.getNodeVersion()
/test1/src/com/prosysopc/ua/types/euromap82_1/server/ExternalChannelsTypeNode.java
end examples ————————————————————————————
I used the codegen tool.
Version:
prosys-opc-ua-sdk-for-java-4.6.2-1636-evaluation
Command:
start TCD.xml ————————————————————————–
<codegenConfiguration>
<namespaceMappings>
<namespaceMapping>
<uri>http:// opcfoundation.org/UA/PlasticsRubber/TCD/</uri>
<packageName>com.prosysopc.ua.types.euromap82_1</packageName>
</namespaceMapping>
<namespaceMapping>
<uri>http:// opcfoundation.org/UA/PlasticsRubber/GeneralTypes/</uri>
<packageName>com.prosysopc.ua.types.euromap83</packageName>
</namespaceMapping>
<namespaceMapping>
<uri>http:// opcfoundation.org/UA/DI/</uri>
<packageName>com.prosysopc.ua.types.di</packageName>
</namespaceMapping>
</namespaceMappings>
<modelSources>
<modelSource>${app.home}/models</modelSource>
</modelSources>
<generates>
<generate>
<targets>all</targets>
<uris>
<!–uri>http:// opcfoundation.org/UA/PlasticsRubber/TCD/</uri–>
<!–uri>http:// opcfoundation.org/UA/PlasticsRubber/GeneralTypes/</uri–>
<!–uri>http:// opcfoundation.org/UA/DI/</uri–>
</uris>
<outputs>
<!–code>${app.home}/OUTPUT/output_code</code–>
<resources>${app.home}/OUTPUT/output_resources</resources>
</outputs>
</generate>
</generates>
</codegenConfiguration>
end TCD.xml ————————————————————————–
information models:
- Opc.Ua.Di.NodeSet2.xml (https://files.opcfoundation.org/schemas/DI/1.2/)
- Opc.Ua.NodeSet2.xml (1.04 from SDK)
- Opc.Ua.PlasticsRubber.GeneralTypes.NodeSet2.xml (https://files.opcfoundation.org/schemas/PlasticsRubber/GeneralTypes/1.02/ EUROMAP 83)
- Opc.Ua.PlasticsRubber.TCD.NodeSet2.xml (https://files.opcfoundation.org/schemas/PlasticsRubber/TCD/1.01/ EUROMAP 82.1)
EUROMAP 82.1 DOC:
https://www.euromap.org/euromap82-1
Could you help me, please?
Thanks,
Francesco
17:09, EET
December 20, 2021
14:38, EET
December 21, 2011
Yes, unfortunately some of the names in these models clash with similar names in the base objects. The recommended solution at the moment is to rename the generated methods manually after the code generation. I hope that we will find a more suitable solution to this in future.
Please, take a look at https://www.prosysopc.com/blog/nodeset-file-importing/ – it explains the currently known problems and describes some ways to overcome them.
The Euromap (Plastics & Rubber Machines) specific problems are listed here:
https://www.prosysopc.com/blog/nodeset-file-importing/#plastics-and-rubber-machinery
13:38, EET
April 3, 2012
Hi,
Assuming the clash is with a node that is not a Method (NodeClass Method I mean) node, preferably I would exclude it from the generation rather than rename the generated method (either will work, but subtyping might require you to do that in more places etc. and can be complicated). This is explained in the Codegen manual, section “4.5.4. Excluding sub-nodes under a Type node from generation”.
For example, the NodeVersion can be exclude via:
…
<excludes>
<instanceDeclarations>
<instanceDeclaration>SEE BELOW</instanceDeclaration>
</instanceDeclarations>
</excludes>
</configuration>
(and in the SEE BELOW use “http://opcfoundation.org/UA/:NodeVersion” without quotes…. we should really update this to have better formatting options……)
Note that “the node is still there” in the address space, this just removes the generated accessors (get/set/nodeget) methods from the output. They can be found “manually” via UaNode.getComponent/getProperty etc. And for the NodeVersion it also happens to be that the core SDK API already has a method (from before we had a Codegen) to receive it (hence the clash).
Note that for Method nodes it would also remove the server side stubs for that method and the routing logic to that stub. Technically an implementation could be plugged via listeners (see MyMethodManagerListener in sampleconsoleserver), though that is a bit more complicated way than the generated stub (or the interface generated for the Method which can be plugged via the static methods of the generated XXXTypeNode). So if the clash is between a Method node and another node in the model, exclude the other node. If the clash is between SDK’s own methods then no can do and the “manual” way must be done.
P.S.
Personally I say to a degree that naming a node “Description” is sort of a modelling error, since OPC UA has already an Attribute named Description. Though, that is hard to change for the companion models or well, any model that you do not control.
Some of the newer SDK’s API methods, such as e.g. Structure.specification() etc. intentionally do not use get/set conventions to make that “space” suitable for generation (if some day a Structure would have a field name Specification for example). But most of the methods are from an era before we had a codegen, so they will clash.
Also, the generated output doesn’t have the UA namespace in the methods, thus a subnode with same BrowseName name part, but different index would clash. So far we have not had good ways to use it there (but these clashes have been luckily rare).
15:51, EET
December 20, 2021
Hello and thank you all for your support,
I generated the classes using the following configuration:
<?xml version=”1.0″ encoding=”UTF-8″ standalone=”yes”?>
<codegenConfiguration>
<namespaceMappings>
<namespaceMapping>
<uri>http://opcfoundation.org/UA/PlasticsRubber/TCD/</uri>
<packageName>com.prosysopc.ua.types.tcd</packageName>
</namespaceMapping>
<namespaceMapping>
<uri>http://opcfoundation.org/UA/PlasticsRubber/GeneralTypes/</uri>
<packageName>com.prosysopc.ua.types.generaltypes</packageName>
</namespaceMapping>
<namespaceMapping>
<uri>http://opcfoundation.org/UA/DI/</uri>
<packageName>com.prosysopc.ua.types.di</packageName>
</namespaceMapping>
</namespaceMappings>
<modelSources>
<modelSource>${app.home}/euromap82_1/models</modelSource>
</modelSources>
<generates>
<generate>
<targets>all</targets>
<uris>
<uri>http://opcfoundation.org/UA/PlasticsRubber/TCD/</uri>
<uri>http://opcfoundation.org/UA/PlasticsRubber/GeneralTypes/</uri>
<uri>http://opcfoundation.org/UA/DI/</uri>
</uris>
<outputs>
…
</outputs>
</generate>
</generates>
<enhancements>
<fileHeader>
<line>Generated from EUROMAP 82.1</line>
<line>by Prosys OPC UA Java SDK Codegen</line>
</fileHeader>
</enhancements>
<!– WORKAROUND –>
<excludes>
<instanceDeclarations>
<instanceDeclaration>http://opcfoundation.org/UA/:NodeVersion</instanceDeclaration>
<instanceDeclaration>http://opcfoundation.org/UA/PlasticsRubber/GeneralTypes/:Components</instanceDeclaration>
<instanceDeclaration>http://opcfoundation.org/UA/PlasticsRubber/GeneralTypes/:Description</instanceDeclaration>
</instanceDeclarations>
</excludes>
</codegenConfiguration>
and then I created some TCD instances:
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.SAXException;
import com.prosysopc.ua.ApplicationIdentity;
import com.prosysopc.ua.ModelException;
import com.prosysopc.ua.SecureIdentityException;
import com.prosysopc.ua.StatusException;
import com.prosysopc.ua.UaApplication.Protocol;
import com.prosysopc.ua.UserTokenPolicies;
import com.prosysopc.ua.nodes.UaInstance;
import com.prosysopc.ua.nodes.UaNode;
import com.prosysopc.ua.server.NodeBuilderException;
import com.prosysopc.ua.server.NodeManagerUaNode;
import com.prosysopc.ua.server.ServiceContext;
import com.prosysopc.ua.server.UaServer;
import com.prosysopc.ua.server.UaServerException;
import com.prosysopc.ua.server.instantiation.NodeBuilder;
import com.prosysopc.ua.server.instantiation.NodeBuilderConfiguration;
import com.prosysopc.ua.stack.builtintypes.ExpandedNodeId;
import com.prosysopc.ua.stack.builtintypes.LocalizedText;
import com.prosysopc.ua.stack.builtintypes.NodeId;
import com.prosysopc.ua.stack.cert.PkiDirectoryCertificateStore;
import com.prosysopc.ua.stack.core.ApplicationDescription;
import com.prosysopc.ua.stack.core.ApplicationType;
import com.prosysopc.ua.stack.core.Identifiers;
import com.prosysopc.ua.stack.transport.security.SecurityMode;
import com.prosysopc.ua.types.tcd.server.OperationTypeNode;
import com.prosysopc.ua.types.tcd.server.OperationTypeNodeBase;
import com.prosysopc.ua.types.tcd.server.OperationTypeSwitchOnMethod;
import com.prosysopc.ua.types.tcd.server.TCD_InterfaceTypeNode;
public class Main {
private static Logger logger = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) throws UaServerException, SecureIdentityException, IOException, SAXException,
ModelException, URISyntaxException, StatusException, NodeBuilderException {
// ———————————————————————
// create server
logger.info("create server…");
UaServer server = new UaServer();
// ———————————————————————
// protocol
logger.info("protocol…");
server.setPort(Protocol.OpcTcp, 4040);
server.setServerName("OPCUA/SimpleServer");
// ———————————————————————
// security
logger.info("security…");
server.getSecurityModes().add(SecurityMode.NONE);
server.addUserTokenPolicy(UserTokenPolicies.ANONYMOUS);
// ———————————————————————
// identity
logger.info("identity…");
String applicationName = "SimpleServer";
ApplicationDescription appDescription = new ApplicationDescription();
appDescription.setApplicationName(new LocalizedText(applicationName + "@hostname"));
appDescription.setApplicationUri("urn:hostname:OPCUA:" + applicationName);
appDescription.setProductUri("urn:prosysopc.com:OPCUA:" + applicationName);
appDescription.setApplicationType(ApplicationType.Server);
final PkiDirectoryCertificateStore applicationCertificateStore = new PkiDirectoryCertificateStore("PKI/CA");
File privatePath = new File(applicationCertificateStore.getBaseDir(), "private");
int[] keySizes = new int[] { 2048 };
final ApplicationIdentity identity = ApplicationIdentity.loadOrCreateCertificate( //
appDescription, //
"Sample Organisation", //
"opcua", //
privatePath, //
null, //
keySizes, //
true);
server.setApplicationIdentity(identity);
// ———————————————————————
// init
logger.info("init…");
server.init();
// ———————————————————————
// address space
logger.info("address space…");
// ———————————————————————
// Register generated classes
// server.registerModel(com.prosysopc.ua.types.opcua.server.ServerInformationModel.MODEL);
// Automatic Discovery of Generated Models
// /project1/src/META-INF/services/com.prosysopc.ua.server.ServerCodegenModelProvider
// server.registerModel(com.prosysopc.ua.types.di.server.ServerInformationModel.MODEL);
// server.registerModel(com.prosysopc.ua.types.generaltypes.server.ServerInformationModel.MODEL);
// server.registerModel(com.prosysopc.ua.types.tcd.server.ServerInformationModel.MODEL);
// ———————————————————————
// Load the information model
// name space index 2
// uri http://opcfoundation.org/UA/DI/
String informatioModel = "/com/prosysopc/ua/types/di/server/Opc.Ua.Di.NodeSet2.xml";
URI informatioModelURI = Main.class.getResource(informatioModel).toURI();
System.out.println("loading model " + informatioModelURI + "…");
server.getAddressSpace().loadModel(informatioModelURI);
// name space index 3
// uri http://opcfoundation.org/UA/PlasticsRubber/GeneralTypes/
informatioModel = "/com/prosysopc/ua/types/generaltypes/server/Opc.Ua.PlasticsRubber.GeneralTypes.NodeSet2.xml";
informatioModelURI = Main.class.getResource(informatioModel).toURI();
System.out.println("loading model " + informatioModelURI + "…");
server.getAddressSpace().loadModel(informatioModelURI);
// name space index 4
// uri http://opcfoundation.org/UA/PlasticsRubber/TCD/
informatioModel = "/com/prosysopc/ua/types/tcd/server/Opc.Ua.PlasticsRubber.TCD.NodeSet2.xml";
informatioModelURI = Main.class.getResource(informatioModel).toURI();
System.out.println("loading model " + informatioModelURI + "…");
server.getAddressSpace().loadModel(informatioModelURI);
// ———————————————————————
// create TCD by generated classes
NodeManagerUaNode nodeManager = ((NodeManagerUaNode) server.getAddressSpace().getNodeManager(4));
NodeBuilderConfiguration conf = new NodeBuilderConfiguration();
ExpandedNodeId expNodeId = com.prosysopc.ua.types.tcd.Ids.TCD_InterfaceType_DeviceZone_ActualProcessPower;
conf.addOptional(expNodeId);
expNodeId = com.prosysopc.ua.types.tcd.Ids.TCD_InterfaceType_DeviceZone_ActualProcessPower_EngineeringUnits;
conf.addOptional(expNodeId);
NodeBuilder<TCD_InterfaceTypeNode> nodeBuilder = //
nodeManager.createNodeBuilder(TCD_InterfaceTypeNode.class, conf);
nodeBuilder.setName("TCD_man1_sn1");
TCD_InterfaceTypeNode tcd = nodeBuilder.build();
tcd.getDeviceZoneNode().setActualProcessPower(12.3);
// UaNode deviceSet = nodeManager.getNode(new NodeId(2, 5001));
int index = server.getAddressSpace().getNodeManager("http://opcfoundation.org/UA/DI/").getNamespaceIndex();
UaNode deviceSet = nodeManager.getNode(new NodeId(index, 5001));
deviceSet.addReference(tcd, Identifiers.Organizes, false);
// ———————————————————————
// methods
OperationTypeNodeBase.setSwitchOnMethodImplementation(new OperationTypeSwitchOnMethod() {
@Override
public void switchOn(ServiceContext serviceContext, OperationTypeNode node) throws StatusException {
logger.info("switchOn node: " + node);
}
});
// ———————————————————————
// create TCD by information model
NodeBuilder<UaInstance> nodeBuilder2 = nodeManager.createNodeBuilder(new NodeId(4, 1012), conf);
nodeBuilder2.setName("TCD_man1_sn2");
UaInstance tcd2 = nodeBuilder2.build();
deviceSet.addReference(tcd2, Identifiers.Organizes, false);
// ———————————————————————
// start
logger.info("start…");
server.start();
}
}
Most Users Ever Online: 1919
Currently Online:
11 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: 735
Moderators: 7
Admins: 1
Forum Stats:
Groups: 3
Forums: 15
Topics: 1523
Posts: 6449
Newest Members:
rust, christamcdowall, redaahern07571, nigelbdhmp, travistimmons, AnnelCib, dalenegettinger, howardkennerley, Thomassnism, biancacraft16Moderators: Jouni Aro: 1026, Pyry: 1, Petri: 0, Bjarne Boström: 1026, Jimmy Ni: 26, Matti Siponen: 346, Lusetti: 0
Administrators: admin: 1