| /* |
| * Copyright (c) 2022 CEA LIST. |
| * |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * Florian Pauker (TU Wien) pauker@ift.at |
| * Thomas Fruhwirth (TU Wien) thomas.fruehwirth@tuwien.ac.at |
| * Saadia Dhouib (CEA LIST) saadia.dhouib@cea.fr |
| * Fadwa Tmar (CEA LIST) fadwa.tmar@cea.fr |
| *******************************************************************************/ |
| |
| library Properties; |
| |
| import Common.Helpers; |
| import ClassDiagram.References; |
| import ClassDiagram.Operations; |
| //import ClassDiagram.Enumerations; |
| |
| modeltype UML uses uml('http://www.eclipse.org/uml2/5.0.0/UML'); |
| modeltype OPCUA uses set('http://opcfoundation.org/UA/2011/03/UANodeSet.xsd'); |
| modeltype TYPES uses types('http://opcfoundation.org/UA/2008/02/Types.xsd'); |
| modeltype ecore "strict" uses 'http://www.eclipse.org/emf/2002/Ecore'; |
| modeltype OPCUA_Robotics_Profile uses 'http://Papyrus/OPCUARoboticsProfile'; |
| |
| |
| |
| helper UML::Class::transformPropertiesAndLinkToUANode(inout uanode : OPCUA::UANode, inout nodeset : OPCUA::UANodeSetType) { |
| // transform primitive properties of the class |
| nodeset.uAVariable += self.ownedElement->selectByType(UML::Property)->select(x| x.type.oclIsKindOf(UML::PrimitiveType))->map property2UAVariable(uanode)->asOrderedSet(); |
| |
| //TODO transform primitiveType from OPC UA Library |
| |
| nodeset.uAVariable += self.ownedElement->selectByType(UML::Property)->select(x| x.type.name.find('Int16') > 0)->map property2UAVariable(uanode)->asOrderedSet(); |
| |
| // transform non-primitive properties of the class |
| // case 1a: property that represents an instance of a class --> property2UAObject |
| nodeset.uAObject += self.ownedElement->selectByType(UML::Property)->select(x| x.association = null and x.type.oclIsTypeOf(UML::Class))->map property2UAObject(uanode, nodeset); |
| |
| // case 1b: property that represents an instance of a state machine --> property2UAObject |
| nodeset.uAObject += self.ownedElement->selectByType(UML::Property)->select(x| x.association = null and x.type.oclIsTypeOf(UML::StateMachine))->map property2UAObject(uanode, nodeset); |
| |
| // case 2a: aggregation --> property2UAObject |
| nodeset.uAObject += self.ownedElement->selectByType(UML::Property)->select(x| x.association <> null and x.aggregation = UML::AggregationKind::composite)->map property2UAObject(uanode, nodeset); |
| |
| // case 2b: composition --> property2UAObject |
| nodeset.uAObject += self.ownedElement->selectByType(UML::Property)->select(x| x.association <> null and x.aggregation = UML::AggregationKind::shared)->map property2UAObject(uanode, nodeset); |
| |
| // case 3: association --> property2UAReference |
| uanode._references.reference += self.ownedElement->selectByType(UML::Property)->select(x| x.association <> null and x.aggregation = UML::AggregationKind::none)->map property2UAReference(nodeset); |
| |
| // if the class inherits from another class, also the properties of the parent class need to be added to the uanode |
| // moved to Classes.qvto and Instances.qvto |
| /* |
| if(self.generalization->size() > 0 and self.generalization->asList()->first().general.oclIsTypeOf(UML::Class)) { |
| self.generalization->asList()->first().general.oclAsType(UML::Class).transformPropertiesAndLinkToUANode(uanode, nodeset); |
| }; |
| */ |
| |
| // transform ports typed by primitive types |
| nodeset.uAVariable += self.ownedElement->selectByType(UML::Port)->select(x| x.type.oclIsKindOf(UML::PrimitiveType))->map port2UAVariable(uanode)->asOrderedSet(); |
| nodeset.uAVariable += self.ownedElement->selectByType(UML::Port)->select(x| x.type.toString().find("Int16")>0)->map port2UAVariable(uanode)->asOrderedSet(); |
| //transform ports typed by enumeration |
| nodeset.uAVariable += self.ownedElement->selectByType(UML::Port)->select(x| x.type.oclIsKindOf(UML::Enumeration))->map port2UAVariableEnum(uanode,nodeset)->asOrderedSet(); |
| //self.ownedElement->selectByType(UML::Port)->select(x| x.type.oclIsKindOf(UML::Enumeration))->forEach(portTypedByEnumeration){ |
| |
| |
| //} |
| //TODO transform ports typed by Interface |
| |
| } |
| |
| mapping UML::Property::property2UAVariable(inout parent : OPCUA::UANode ) : OPCUA::UAVariable { |
| log("property2UAVariable for UML element " + self.name); |
| |
| // set attributs of the OPCUA::UAVariable |
| nodeId := self.createNodeId(false); |
| browseName := self.createBrowseName(); |
| displayName := object OPCUA::LocalizedText{value := browseName}; |
| |
| // set the datatype and maybe the value of the UA::Variable |
| if(self.type.toString().find("Int16") > 0) { |
| dataType := getIdOrAlias("Int16"); |
| if(self.defaultValue <> null) { |
| var feature := TYPES::DocumentRoot.oclAsType(EClass).getEStructuralFeature("int16"); |
| value := object OPCUA::ValueType1{}; |
| value.oclAsType(EObject).eSet(feature, self.defaultValue.oclAsType(UML::LiteralInteger).value); |
| }; |
| } else if (self.type.toString().find("Int") > 0) { |
| dataType := getIdOrAlias("Int32"); |
| if(self.defaultValue <> null) { |
| var feature := TYPES::DocumentRoot.oclAsType(EClass).getEStructuralFeature("int32"); |
| value := object OPCUA::ValueType1{}; |
| value.oclAsType(EObject).eSet(feature, self.defaultValue.oclAsType(UML::LiteralString).value); |
| }; |
| }else if (self.type.toString().find("String") > 0) { |
| dataType := getIdOrAlias("String"); |
| if(self.defaultValue <> null) { |
| var feature := TYPES::DocumentRoot.oclAsType(EClass).getEStructuralFeature("string"); |
| value := object OPCUA::ValueType1{}; |
| value.oclAsType(EObject).eSet(feature, self.defaultValue.oclAsType(UML::LiteralString).value); |
| }; |
| } else if (self.type.toString().find("Real") > 0 or self.type.toString().find("Double") > 0 or self.type.toString().find("Float") > 0) { |
| dataType := getIdOrAlias("Double"); |
| if(self.defaultValue <> null) { |
| var feature := TYPES::DocumentRoot.oclAsType(EClass).getEStructuralFeature("double"); |
| value := object OPCUA::ValueType1{}; |
| value.oclAsType(EObject).eSet(feature, self.defaultValue.oclAsType(UML::LiteralReal).value); |
| }; |
| } else if (self.type.toString().find("Boolean") > 0) { |
| dataType := getIdOrAlias("Boolean"); |
| if(self.defaultValue <> null) { |
| var feature := TYPES::DocumentRoot.oclAsType(EClass).getEStructuralFeature("boolean"); |
| value := object OPCUA::ValueType1{}; |
| value.oclAsType(EObject).eSet(feature, self.defaultValue.oclAsType(UML::LiteralBoolean).value); |
| }; |
| } else { |
| raise Exception("Unkown datatype for parameter " + self.name + ": " + self.type.toString()); |
| }; |
| |
| // link the OPCUA::UAVariable to the parent via a HasComponent reference |
| parent._references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := nodeId}; |
| parentNodeId := parent.nodeId; |
| |
| // add references |
| _references := object OPCUA::ListOfReferences{}; |
| _references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := getIdOrAlias("BaseDataVariableType")}; |
| _references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasModellingRule"); value := getIdOrAlias("ModellingRule_Mandatory")}; // TODO replace with correct modelling rule |
| _references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := parent.nodeId; isForward := false}; |
| } |
| |
| mapping UML::Port::port2UAVariableEnum(inout parent : OPCUA::UANode, inout nodeset : OPCUA::UANodeSetType) : OPCUA::UAVariable { |
| log("port2UAVariable for UML element " + self.name); |
| |
| // set attributs of the OPCUA::UAVariable |
| nodeId := self.createNodeId(); |
| browseName := self.createBrowseName(); |
| displayName := object OPCUA::LocalizedText{value := browseName}; |
| // create the Enumeration UADataType |
| var enumDataType :OPCUA::UADataType:=self.type.oclAsType(UML::Enumeration)->enumeration2OPCUADataType(nodeset)->asSequence()->first(); |
| nodeset.uADataType+=enumDataType; |
| // set the datatype and maybe the value of the UA::Variable |
| log("enum nodeID : "+ enumDataType.nodeId); |
| dataType :=enumDataType.nodeId; |
| if(self.defaultValue <> null) { |
| var feature := TYPES::DocumentRoot.oclAsType(EClass).getEStructuralFeature("int16"); |
| value := object OPCUA::ValueType1{}; |
| value.oclAsType(EObject).eSet(feature, self.defaultValue.oclAsType(UML::LiteralInteger).value); |
| }; |
| // link the OPCUA::UAVariable to the parent via a HasComponent reference |
| parent._references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := nodeId}; |
| parentNodeId := parent.nodeId; |
| |
| // add references |
| _references := object OPCUA::ListOfReferences{}; |
| _references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := getIdOrAlias("BaseDataVariableType")}; |
| _references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasModellingRule"); value := getIdOrAlias("ModellingRule_Mandatory")}; // TODO replace with correct modelling rule |
| _references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := parent.nodeId; isForward := false}; |
| |
| } |
| mapping UML::Port::port2UAVariable(inout parent : OPCUA::UANode) : OPCUA::UAVariable { |
| log("port2UAVariable for UML element " + self.name); |
| |
| // set attributs of the OPCUA::UAVariable |
| nodeId := self.createNodeId(false); |
| browseName := self.createBrowseName(); |
| displayName := object OPCUA::LocalizedText{value := browseName}; |
| |
| // set the datatype and maybe the value of the UA::Variable |
| if(self.type.toString().find("Int16") > 0) { |
| dataType := getIdOrAlias("Int16"); |
| if(self.defaultValue <> null) { |
| var feature := TYPES::DocumentRoot.oclAsType(EClass).getEStructuralFeature("int16"); |
| value := object OPCUA::ValueType1{}; |
| value.oclAsType(EObject).eSet(feature, self.defaultValue.oclAsType(UML::LiteralInteger).value); |
| }; |
| } else if (self.type.toString().find("Int") > 0) { |
| dataType := getIdOrAlias("Int32"); |
| if(self.defaultValue <> null) { |
| var feature := TYPES::DocumentRoot.oclAsType(EClass).getEStructuralFeature("int32"); |
| value := object OPCUA::ValueType1{}; |
| value.oclAsType(EObject).eSet(feature, self.defaultValue.oclAsType(UML::LiteralString).value); |
| }; |
| } else if (self.type.toString().find("String") > 0) { |
| dataType := getIdOrAlias("String"); |
| if(self.defaultValue <> null) { |
| var feature := TYPES::DocumentRoot.oclAsType(EClass).getEStructuralFeature("string"); |
| value := object OPCUA::ValueType1{}; |
| value.oclAsType(EObject).eSet(feature, self.defaultValue.oclAsType(UML::LiteralString).value); |
| }; |
| } else if (self.type.toString().find("Real") > 0 or self.type.toString().find("Double") > 0 or self.type.toString().find("Float") > 0) { |
| dataType := getIdOrAlias("Double"); |
| if(self.defaultValue <> null) { |
| var feature := TYPES::DocumentRoot.oclAsType(EClass).getEStructuralFeature("double"); |
| value := object OPCUA::ValueType1{}; |
| value.oclAsType(EObject).eSet(feature, self.defaultValue.oclAsType(UML::LiteralReal).value); |
| }; |
| } else if (self.type.toString().find("Boolean") > 0) { |
| dataType := getIdOrAlias("Boolean"); |
| if(self.defaultValue <> null) { |
| var feature := TYPES::DocumentRoot.oclAsType(EClass).getEStructuralFeature("boolean"); |
| value := object OPCUA::ValueType1{}; |
| value.oclAsType(EObject).eSet(feature, self.defaultValue.oclAsType(UML::LiteralBoolean).value); |
| }; |
| } else { |
| raise Exception("Unkown datatype for parameter " + self.name + ": " + self.type.toString()); |
| }; |
| |
| // link the OPCUA::UAVariable to the parent via a HasComponent reference |
| parent._references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := nodeId}; |
| parentNodeId := parent.nodeId; |
| |
| // add references |
| _references := object OPCUA::ListOfReferences{}; |
| _references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := getIdOrAlias("BaseDataVariableType")}; |
| _references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasModellingRule"); value := getIdOrAlias("ModellingRule_Mandatory")}; // TODO replace with correct modelling rule |
| _references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := parent.nodeId; isForward := false}; |
| } |
| // the property is more complex than a simple primitive type or variable, e.g., it represents some class, state machine, composition or aggregation |
| mapping UML::Property::property2UAObject(inout parent : OPCUA::UANode, inout nodeset : OPCUA::UANodeSetType) : OPCUA::UAObject { |
| if(self.name <> null) { |
| log("property2UAObject for UML element " + self.name); |
| } else { |
| log("property2UAObject for unnamed UML element " + self.toString()); |
| }; |
| |
| // set attributs of the OPCUA::UAObject |
| nodeId := self.createNodeId(false); |
| if(self.name <> null) { // compositions and aggregations possibly are not named, use the name of the referenced class instead |
| browseName := self.createBrowseName(); |
| } else { |
| browseName := self.type.name; |
| }; |
| displayName := object OPCUA::LocalizedText{value := browseName}; |
| |
| // link the OPCUA::UAObject to the parent via a HasComponent reference |
| parent._references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := nodeId}; |
| parentNodeId := parent.nodeId; |
| |
| // add references |
| _references := object OPCUA::ListOfReferences{}; |
| _references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := self.type.createNodeId()}; // it is assumed that the corresponding type (e.g., the class or state machine) is transformed elsewhere |
| _references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := parent.nodeId; isForward := false}; |
| |
| // set the modelling rule; note that -1 means infitiy (*); therefore, for 0..* the limits are lower=0 and upper=-1 |
| var modelingRuleReference := object OPCUA::Reference{referenceType := getIdOrAlias("HasModellingRule")}; |
| if(self.lower = 0 and self.upper = 1) { |
| modelingRuleReference.value := getIdOrAlias("ModellingRule_Optional"); |
| } |
| else if(self.lower = 1 and self.upper = 1) { |
| modelingRuleReference.value := getIdOrAlias("ModellingRule_Mandatory"); |
| } |
| else if(self.lower = 0 and self.upper = -1) { |
| modelingRuleReference.value := getIdOrAlias("ModellingRule_OptionalPlaceholder"); |
| } |
| else if(self.lower = 1 and self.upper = -1) { |
| modelingRuleReference.value := getIdOrAlias("ModellingRule_MandatoryPlaceholder"); |
| }; |
| _references.reference += modelingRuleReference; |
| |
| // if the property refers to a state machine, the current state variable needs to be added to the opc ua object |
| // TODO: maybe in the future it would be useful to automatically add all mandatory OPC UA Nodes of all supertypes, e.g. the CurrentState Variable for any custom StateMachineType |
| // TODO: maybe this should be moved to Classes.qvto and Instances.qvto |
| if(self.type.oclIsTypeOf(UML::StateMachine)) { |
| log("property is a state machine"); |
| var currentState := object OPCUA::UAVariable{}; |
| currentState.nodeId := self.createNodeId(false); |
| currentState.browseName := "CurrentState"; |
| currentState.displayName := object OPCUA::LocalizedText{value := currentState.browseName}; |
| currentState.dataType := getIdOrAlias("LocalizedText"); |
| currentState.parentNodeId := nodeId; |
| |
| currentState._references := object OPCUA::ListOfReferences{}; |
| currentState._references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := nodeId; isForward := false}; |
| currentState._references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := getIdOrAlias("FiniteStateVariableType")}; |
| currentState._references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasModellingRule"); value := getIdOrAlias("ModellingRule_Mandatory")}; |
| |
| // link the OPCUA::UAVariable currentState to the parent via a HasComponent reference |
| _references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := currentState.nodeId}; |
| |
| // add the currentState variable to the nodeset |
| nodeset.uAVariable += currentState; |
| |
| // and also add the Id Property of the CurrentStateVariable |
| var id := object OPCUA::UAVariable{}; |
| id.nodeId := self.createNodeId(false); |
| id.browseName := "Id"; |
| id.displayName := object OPCUA::LocalizedText{value := currentState.browseName}; |
| id.dataType := getIdOrAlias("NodeId"); |
| id.parentNodeId := currentState.nodeId; |
| |
| id._references := object OPCUA::ListOfReferences{}; |
| id._references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasProperty"); value := currentState.nodeId; isForward := false}; |
| id._references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := getIdOrAlias("PropertyType")}; |
| id._references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasModellingRule"); value := getIdOrAlias("ModellingRule_Mandatory")}; |
| |
| // link the OPCUA::UAVariable id to the parent via a HasProperty reference |
| currentState._references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasProperty"); value := id.nodeId}; |
| |
| // add the id variable to the nodeset |
| nodeset.uAVariable += id; |
| } else { |
| log("property is not a state machine"); |
| |
| }; |
| } |
| mapping UML::Property::property2SafetyStateObject(inout safetyStateFolder: OPCUA::UAObject, inout nodeset : OPCUA::UANodeSetType) : OPCUA::UAObject { |
| if(self.name <> null) { |
| log("property2UAObject for UML element " + self.name); |
| } else { |
| log("property2UAObject for unnamed UML element " + self.toString()); |
| }; |
| |
| // set attributs of the OPCUA::UAObject |
| nodeId := self.createNodeId(false); |
| if(self.name <> null) { // compositions and aggregations possibly are not named, use the name of the referenced class instead |
| browseName := self.createBrowseName(); |
| } else { |
| browseName := self.type.name; |
| }; |
| displayName := object OPCUA::LocalizedText{value := browseName}; |
| |
| // link the OPCUA::UAObject to the parent via a HasComponent reference |
| safetyStateFolder._references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := nodeId}; |
| parentNodeId := safetyStateFolder.nodeId; |
| |
| // add references |
| //TODO generate ns dinamically |
| _references := object OPCUA::ListOfReferences{}; |
| _references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := "ns=3;i=1013"}; |
| _references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := safetyStateFolder.nodeId; isForward := false}; |
| |
| |
| } |
| mapping UML::Property::property2MotionDeviceObject(inout motionDevicesFolder: OPCUA::UAObject, inout nodeset : OPCUA::UANodeSetType) : OPCUA::UAObject { |
| if(self.name <> null) { |
| log("property2UAObject for UML element " + self.name); |
| } else { |
| log("property2UAObject for unnamed UML element " + self.toString()); |
| }; |
| |
| // set attributs of the OPCUA::UAObject |
| nodeId := self.createNodeId(false); |
| if(self.name <> null) { // compositions and aggregations possibly are not named, use the name of the referenced class instead |
| browseName := self.createBrowseName(); |
| } else { |
| browseName := self.type.name; |
| }; |
| displayName := object OPCUA::LocalizedText{value := browseName}; |
| |
| // link the OPCUA::UAObject to the parent via a HasComponent reference |
| motionDevicesFolder._references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := nodeId}; |
| parentNodeId := motionDevicesFolder.nodeId; |
| |
| // add references |
| //TODO generate ns dinamically |
| _references := object OPCUA::ListOfReferences{}; |
| _references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := "ns=3;i=1004"}; |
| _references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := motionDevicesFolder.nodeId; isForward := false}; |
| |
| |
| //Create a floder Axes and add Axes inside the stereotype properties inside it |
| var AxesFolder := object OPCUA::UAObject{parentNodeId:=result.nodeId;nodeId := self.createNodeId(false);browseName:="3:Axes"}; |
| AxesFolder._references:= object OPCUA::ListOfReferences{}; |
| AxesFolder._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := getIdOrAlias("FolderType")}; |
| AxesFolder.displayName:= (object OPCUA::LocalizedText {value := "Axes"})->asOrderedSet(); |
| AxesFolder.description:=(object OPCUA::LocalizedText {value := "Axes is a container for one or more instances of the AxisType"})->asOrderedSet(); |
| AxesFolder._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); isForward:=false; value := nodeId}; |
| |
| _references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := AxesFolder.nodeId}; |
| |
| nodeset.uAObject+=AxesFolder; |
| |
| //add axes to the axesFolder |
| //TODO make a choice if we apply AxesType on the property or the type or both ? |
| //Add non CS variables to parameterSet AxisType |
| //add AxisState |
| //create Enumeration AxisStateEnumeation as a DataType |
| |
| |
| |
| |
| //AddAxisStateEnumeration(nodeset,AxisStateEnum, self); |
| var NewAxisStateEnumeration : UADataType := object OPCUA::UADataType{browseName:="1:AxisStateEnumeration";nodeId := self.createNodeId(false) }; |
| NewAxisStateEnumeration.displayName:=object OPCUA::LocalizedText {value := "AxisStateEnumeration" }; |
| NewAxisStateEnumeration._references:= object OPCUA::ListOfReferences{}; |
| NewAxisStateEnumeration._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasSubtype"); isForward:=false;value := getIdOrAlias("Enumeration")}; |
| |
| var def :DataTypeDefinition:= object OPCUA::DataTypeDefinition{name:="NewAxisStateEnumeration"}; |
| var dataField :DataTypeField:=object OPCUA::DataTypeField{value:= 236; name:="JOINT_SHUTTING_DOWN_MODE" }; |
| def.field+=dataField; |
| dataField :=object OPCUA::DataTypeField{value:=237 ; name:="JOINT_PART_D_CALIBRATION_MODE" }; |
| def.field+=dataField; |
| dataField :=object OPCUA::DataTypeField{value:=238 ; name:="JOINT_BACKDRIVE_MODE" }; |
| def.field+=dataField; |
| dataField :=object OPCUA::DataTypeField{value:=239 ; name:="JOINT_POWER_OFF_MODE" }; |
| def.field+=dataField; |
| dataField :=object OPCUA::DataTypeField{value:=245 ; name:="JOINT_NOT_RESPONDING_MODE" }; |
| def.field+=dataField; |
| dataField :=object OPCUA::DataTypeField{value:=246 ; name:="JOINT_MOTOR_INITIALISATION_MODE" }; |
| def.field+=dataField; |
| dataField :=object OPCUA::DataTypeField{value:=247 ; name:="JOINT_BOOTING_MODE" }; |
| def.field+=dataField; |
| dataField :=object OPCUA::DataTypeField{value:=248 ; name:="JOINT_PART_D_CALIBRATION_ERROR_MODE" }; |
| def.field+=dataField; |
| dataField :=object OPCUA::DataTypeField{value:=249 ; name:="JOINT_BOOTLOADER_MODE" }; |
| def.field+=dataField; |
| dataField :=object OPCUA::DataTypeField{value:=250 ; name:="JOINT_CALIBRATION_MODE" }; |
| def.field+=dataField; |
| dataField :=object OPCUA::DataTypeField{value:=252 ; name:="JOINT_FAULT_MODE" }; |
| def.field+=dataField; |
| dataField :=object OPCUA::DataTypeField{value:=253 ; name:="JOINT_RUNNING_MODE" }; |
| def.field+=dataField; |
| dataField :=object OPCUA::DataTypeField{value:=255 ; name:="JOINT_IDLE_MODE" }; |
| def.field+=dataField; |
| |
| NewAxisStateEnumeration.definition:=def; |
| //Add literals |
| |
| nodeset.uADataType+=NewAxisStateEnumeration; |
| |
| //create a Varibale "EnumStrings" as a property of the data Enum |
| var StringVariable := object OPCUA::UAVariable{dataType:=getIdOrAlias("LocalizedText");parentNodeId:=NewAxisStateEnumeration.nodeId;nodeId := self.createNodeId(false);browseName:="EnumStrings"; accessLevel:=3;arrayDimensions:="0";valueRank:=1}; |
| StringVariable._references:= object OPCUA::ListOfReferences{}; |
| StringVariable._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := "i=68"}; |
| StringVariable.displayName:= (object OPCUA::LocalizedText {value := "EnumStrings"})->asOrderedSet(); |
| StringVariable._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasProperty"); isForward:=false; value := NewAxisStateEnumeration.nodeId}; |
| var listLiterals :=object ListOfLocalizedText{ |
| localizedText+= object TYPES::LocalizedText{ text:="JOINT_SHUTTING_DOWN_MODE"; locale:=""}; |
| localizedText+= object TYPES::LocalizedText{ text:="JOINT_PART_D_CALIBRATION_MODE"; locale:=""}; |
| localizedText+= object TYPES::LocalizedText{text:="JOINT_BACKDRIVE_MODE"; locale:=""}; |
| localizedText+= object TYPES::LocalizedText{text:="JOINT_POWER_OFF_MODE"; locale:=""}; |
| localizedText+= object TYPES::LocalizedText{text:="JOINT_NOT_RESPONDING_MODE"; locale:=""}; |
| localizedText+= object TYPES::LocalizedText{text:="JOINT_MOTOR_INITIALISATION_MODE"; locale:=""}; |
| localizedText+= object TYPES::LocalizedText{text:="JOINT_BOOTING_MODE"; locale:=""}; |
| localizedText+= object TYPES::LocalizedText{text:="JOINT_PART_D_CALIBRATION_ERROR_MODE"; locale:=""}; |
| localizedText+= object TYPES::LocalizedText{text:="JOINT_BOOTLOADER_MODE"; locale:=""}; |
| localizedText+= object TYPES::LocalizedText{text:="JOINT_CALIBRATION_MODE"; locale:=""}; |
| localizedText+= object TYPES::LocalizedText{text:="JOINT_FAULT_MODE"; locale:=""}; |
| localizedText+= object TYPES::LocalizedText{text:="JOINT_RUNNING_MODE"; locale:=""}; |
| localizedText+= object TYPES::LocalizedText{text:="JOINT_IDLE_MODE"; locale:=""}; |
| |
| |
| }; |
| // var setOfEnumString := object OrderedSet(String){}; |
| // setOfEnumString+="JOINT_PART_D_CALIBRATION_MODE"; |
| // setOfEnumString+="JOINT_BACKDRIVE_MODE"; |
| // |
| var feature := TYPES::DocumentRoot.oclAsType(EClass).getEStructuralFeature("listOfLocalizedText"); |
| StringVariable.value := object OPCUA::ValueType1{}; |
| StringVariable.value.oclAsType(EObject).eSet(feature, listLiterals); |
| |
| |
| nodeset.uAVariable+=StringVariable; |
| NewAxisStateEnumeration._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasProperty"); value := StringVariable.nodeId}; |
| |
| |
| nodeset.uAObject+=self.type.ownedElement -> selectByType(UML::Property) -> select(p|(p.getAppliedStereotypes()->exists(s|s.name='AxisType')))-> map property2AxesObject(AxesFolder, nodeset, NewAxisStateEnumeration); |
| |
| |
| |
| //Create a floder PowerTrains and add PowerTrains inside the stereotype properties inside it |
| var PowerTrainsFolder := object OPCUA::UAObject{parentNodeId:=result.nodeId;nodeId := self.createNodeId(false);browseName:="3:PowerTrains"}; |
| PowerTrainsFolder._references:= object OPCUA::ListOfReferences{}; |
| PowerTrainsFolder._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := getIdOrAlias("FolderType")}; |
| PowerTrainsFolder.displayName:= (object OPCUA::LocalizedText {value := "PowerTrains"})->asOrderedSet(); |
| PowerTrainsFolder.description:=(object OPCUA::LocalizedText {value := "PowerTrains is a container for one or more instances of the PowerTrainType."})->asOrderedSet(); |
| PowerTrainsFolder._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); isForward:=false; value := nodeId}; |
| |
| _references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := PowerTrainsFolder.nodeId}; |
| |
| nodeset.uAObject+=PowerTrainsFolder; |
| |
| //add PowerTrains to the PowerTrainsFolder |
| //TODO make a choice if we apply PowerTrainsType on the property or the type or both ? |
| nodeset.uAObject+=self.type.ownedElement -> selectByType(UML::Property) -> select(p|(p.getAppliedStereotypes()->exists(s|s.name='PowerTrainType')))-> map property2PowerTrainsObject(PowerTrainsFolder, nodeset); |
| |
| |
| // create ParameterSet of MotionDeviceType UAObject and add reference to it |
| |
| var ParameterSet_MotionDeviceType := object OPCUA::UAObject{parentNodeId:=result.nodeId;nodeId := self.createNodeId(false);browseName:="2:ParameterSet"}; |
| ParameterSet_MotionDeviceType._references:= object OPCUA::ListOfReferences{}; |
| ParameterSet_MotionDeviceType._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := "i=58"}; |
| ParameterSet_MotionDeviceType.displayName:= (object OPCUA::LocalizedText {value := "ParameterSet"})->asOrderedSet(); |
| ParameterSet_MotionDeviceType.description:=(object OPCUA::LocalizedText {value := "Flat list of Parameters"})->asOrderedSet(); |
| ParameterSet_MotionDeviceType._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); isForward:=false; value := nodeId}; |
| |
| _references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := ParameterSet_MotionDeviceType.nodeId}; |
| |
| nodeset.uAObject+=ParameterSet_MotionDeviceType; |
| // var EnumDataType =self.oclAsType(OPCUA_Robotics_Profile::MotionDeviceType).ParameterSetMotionDeviceType.Mode.oclAsType(Property).type.oclAsType(UML::Enumeration)->enumeration2OPCUADataType(nodeset); |
| |
| |
| log ("enumeration :"+ self.oclAsType(OPCUA_Robotics_Profile::MotionDeviceType).ParameterSetMotionDeviceType.Mode.toString()); |
| addVariableToParameterSet("Mode", "Int16" ,ParameterSet_MotionDeviceType, self, nodeset); |
| addVariableToParameterSet("RobotIntensity", "Int16" ,ParameterSet_MotionDeviceType, self, nodeset); |
| addVariableToParameterSet("isPowerButtonPressed", "Boolean" ,ParameterSet_MotionDeviceType, self, nodeset); |
| addVariableToParameterSet("isTeachButtonPressed", "Boolean" ,ParameterSet_MotionDeviceType, self, nodeset); |
| addVariableToParameterSet("isPowerOnRobot", "Boolean" ,ParameterSet_MotionDeviceType, self, nodeset); |
| //ParameterSet_MotionDeviceType. |
| |
| |
| //Add ModeEnum and varibale to parameterSet |
| |
| //Add ModeEnumType(nodeset,AxisStateEnum, self); |
| var NewModeEnumType : UADataType := object OPCUA::UADataType{browseName:="1:ModeEnumType";nodeId := self.createNodeId(false) }; |
| NewModeEnumType.displayName:=object OPCUA::LocalizedText {value := "ModeEnumType" }; |
| NewModeEnumType._references:= object OPCUA::ListOfReferences{}; |
| NewModeEnumType._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasSubtype"); isForward:=false;value := getIdOrAlias("Enumeration")}; |
| |
| |
| var enumDef :DataTypeDefinition:= object OPCUA::DataTypeDefinition{name:="ModeEnumerationType"}; |
| var dataFieldMode :DataTypeField:=object OPCUA::DataTypeField{value:= 236; name:="JOINT_SHUTTING_DOWN_MODE" }; |
| enumDef.field+=dataFieldMode; |
| dataFieldMode :=object OPCUA::DataTypeField{value:=0 ; name:="DISCONNECTED" }; |
| enumDef.field+=dataFieldMode; |
| dataFieldMode :=object OPCUA::DataTypeField{value:=1 ; name:="CONFIRM_SAFETY" }; |
| enumDef.field+=dataFieldMode; |
| dataFieldMode :=object OPCUA::DataTypeField{value:=2 ; name:="BOOTING" }; |
| enumDef.field+=dataFieldMode; |
| dataFieldMode :=object OPCUA::DataTypeField{value:=3 ; name:="POWER_OFF" }; |
| enumDef.field+=dataFieldMode; |
| dataFieldMode :=object OPCUA::DataTypeField{value:=4 ; name:="POWER_ON" }; |
| enumDef.field+=dataFieldMode; |
| dataFieldMode :=object OPCUA::DataTypeField{value:=5 ; name:="IDLE" }; |
| enumDef.field+=dataFieldMode; |
| dataFieldMode :=object OPCUA::DataTypeField{value:=6 ; name:="BACKDRIVE" }; |
| enumDef.field+=dataFieldMode; |
| dataFieldMode :=object OPCUA::DataTypeField{value:=7 ; name:="RUNNING" }; |
| enumDef.field+=dataFieldMode; |
| |
| |
| NewModeEnumType.definition:=enumDef; |
| //Add literals |
| |
| nodeset.uADataType+=NewModeEnumType; |
| |
| //create a Varibale "EnumStrings" as a property of the data Enum |
| var StringVar := object OPCUA::UAVariable{dataType:=getIdOrAlias("LocalizedText");parentNodeId:=NewModeEnumType.nodeId;nodeId := self.createNodeId(false);browseName:="EnumStrings"; accessLevel:=3;arrayDimensions:="0";valueRank:=1}; |
| StringVar._references:= object OPCUA::ListOfReferences{}; |
| StringVar._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := "i=68"}; |
| StringVar.displayName:= (object OPCUA::LocalizedText {value := "EnumStrings"})->asOrderedSet(); |
| StringVar._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasProperty"); isForward:=false; value := NewModeEnumType.nodeId}; |
| var literalList :=object ListOfLocalizedText{ |
| localizedText+= object TYPES::LocalizedText{ text:="DISCONNECTED"; locale:=""}; |
| localizedText+= object TYPES::LocalizedText{ text:="CONFIRM_SAFETY"; locale:=""}; |
| localizedText+= object TYPES::LocalizedText{text:="BOOTING"; locale:=""}; |
| localizedText+= object TYPES::LocalizedText{text:="POWER_OFF"; locale:=""}; |
| localizedText+= object TYPES::LocalizedText{text:="POWER_ON"; locale:=""}; |
| localizedText+= object TYPES::LocalizedText{text:="IDLE"; locale:=""}; |
| localizedText+= object TYPES::LocalizedText{text:="BACKDRIVE"; locale:=""}; |
| localizedText+= object TYPES::LocalizedText{text:="RUNNING"; locale:=""}; |
| }; |
| |
| var featurevar := TYPES::DocumentRoot.oclAsType(EClass).getEStructuralFeature("listOfLocalizedText"); |
| StringVar.value := object OPCUA::ValueType1{}; |
| StringVar.value.oclAsType(EObject).eSet(featurevar, literalList); |
| |
| |
| nodeset.uAVariable+=StringVar; |
| NewModeEnumType._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasProperty"); value := StringVar.nodeId}; |
| |
| //add modeVarible typed by ModeEnumerateion to ParameterSet of MotionDeviceType |
| |
| var ModeVariable := object OPCUA::UAVariable{dataType:=NewModeEnumType.nodeId;parentNodeId:=ParameterSet_MotionDeviceType.nodeId;nodeId := self.createNodeId(false);browseName:="1:ModeEnum"; accessLevel:=3}; |
| ModeVariable._references:= object OPCUA::ListOfReferences{}; |
| ModeVariable._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := "i=63"}; |
| ModeVariable.displayName:= (object OPCUA::LocalizedText {value := "ModeEnum"})->asOrderedSet(); |
| ModeVariable._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); isForward:=false; value := ParameterSet_MotionDeviceType.nodeId}; |
| ModeVariable.description:=(object OPCUA::LocalizedText {value := "The ModeVariable variable provides the axis State, it is not a part of CS Robotics."})->asOrderedSet(); |
| nodeset.uAVariable+=ModeVariable; |
| |
| ParameterSet_MotionDeviceType._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := ModeVariable.nodeId}; |
| |
| |
| } |
| |
| mapping UML::Property::property2AxesObject(inout parent: OPCUA::UAObject, inout nodeset : OPCUA::UANodeSetType, inout AxisStateEnum : OPCUA::UADataType) : OPCUA::UAObject { |
| if(self.name <> null) { |
| log("property2AxesObject for UML element " + self.name); |
| } else { |
| log("property2AxesObject for unnamed UML element " + self.toString()); |
| }; |
| |
| // set attributs of the OPCUA::UAObject |
| nodeId := self.createNodeId(); |
| if(self.name <> null) { |
| browseName := self.createBrowseName(); |
| } else { |
| browseName := self.type.name; |
| }; |
| displayName := object OPCUA::LocalizedText{value := browseName}; |
| |
| // link the OPCUA::UAObject to the parent via a HasComponent reference |
| parent._references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := nodeId}; |
| parentNodeId := parent.nodeId; |
| |
| // add references |
| //TODO generate ns dinamically |
| _references := object OPCUA::ListOfReferences{}; |
| _references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := "ns=3;i=16601"}; |
| _references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := parent.nodeId; isForward := false}; |
| |
| |
| // create AdditionalLoad object and add reference to it |
| var AdditionalLoad := object OPCUA::UAObject{parentNodeId:=result.nodeId;nodeId := self.createNodeId(false);browseName:="3:AdditionalLoad"}; |
| AdditionalLoad._references:= object OPCUA::ListOfReferences{}; |
| AdditionalLoad._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := "ns=3;i=1018"}; |
| AdditionalLoad.displayName:= (object OPCUA::LocalizedText {value := "AdditionalLoad"})->asOrderedSet(); |
| AdditionalLoad.description:=(object OPCUA::LocalizedText {value := "The additional load which is mounted on this axis. E.g. for process-need a transformer for welding."})->asOrderedSet(); |
| AdditionalLoad._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); isForward:=false; value := nodeId}; |
| |
| _references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := AdditionalLoad.nodeId}; |
| |
| nodeset.uAObject+=AdditionalLoad; |
| //add mass UAVariable to the AdditionalLoad |
| var Mass := object OPCUA::UAVariable{dataType:="Double";parentNodeId:=AdditionalLoad.nodeId;nodeId := self.createNodeId(false);browseName:="3:Mass"; accessLevel:=3}; |
| Mass._references:= object OPCUA::ListOfReferences{}; |
| Mass._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := "i=17497"}; |
| Mass.displayName:= (object OPCUA::LocalizedText {value := "Mass"})->asOrderedSet(); |
| Mass.description:=(object OPCUA::LocalizedText {value := "The weight of the load mounted on one mounting point."})->asOrderedSet(); |
| Mass._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); isForward:=false; value := AdditionalLoad.nodeId}; |
| |
| |
| AdditionalLoad._references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := Mass.nodeId}; |
| nodeset.uAVariable+=Mass; |
| //add EngineeringUnits Variable to Mass |
| var EngineeringUnits := object OPCUA::UAVariable{dataType:=getIdOrAlias("EUInformation");parentNodeId:=Mass.nodeId;nodeId := self.createNodeId(false);browseName:="EngineeringUnits"; accessLevel:=3}; |
| EngineeringUnits._references:= object OPCUA::ListOfReferences{}; |
| EngineeringUnits._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := "i=68"}; |
| EngineeringUnits.displayName:= (object OPCUA::LocalizedText {value := "EngineeringUnits"})->asOrderedSet(); |
| EngineeringUnits._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); isForward:=false; value := Mass.nodeId}; |
| nodeset.uAVariable+=EngineeringUnits; |
| |
| Mass._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasProperty"); value := EngineeringUnits.nodeId}; |
| |
| |
| // create MotionProfile UAVariable and add reference to it |
| var MotionProfile := object OPCUA::UAVariable{dataType:=getIdOrAlias("AxisMotionProfileEnumeration");parentNodeId:=result.nodeId;nodeId := self.createNodeId(false);browseName:="3:MotionProfile"; accessLevel:=3}; |
| MotionProfile._references:= object OPCUA::ListOfReferences{}; |
| MotionProfile._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := "i=68"}; |
| MotionProfile.displayName:= (object OPCUA::LocalizedText {value := "MotionProfile"})->asOrderedSet(); |
| MotionProfile._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); isForward:=false; value := nodeId}; |
| MotionProfile.description:=(object OPCUA::LocalizedText {value := "The kind of axis motion as defined with the AxisMotionProfileEnumeration."})->asOrderedSet(); |
| |
| nodeset.uAVariable+=MotionProfile; |
| |
| _references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasProperty"); value := MotionProfile.nodeId}; |
| |
| |
| // create ParameterSet of Axes UAObject and add reference to it |
| |
| var AxesParameterSet := object OPCUA::UAObject{parentNodeId:=result.nodeId;nodeId := self.createNodeId(false);browseName:="2:ParameterSet"}; |
| AxesParameterSet._references:= object OPCUA::ListOfReferences{}; |
| AxesParameterSet._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := "i=58"}; |
| AxesParameterSet.displayName:= (object OPCUA::LocalizedText {value := "ParameterSet"})->asOrderedSet(); |
| AxesParameterSet.description:=(object OPCUA::LocalizedText {value := "Flat list of Parameters"})->asOrderedSet(); |
| AxesParameterSet._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); isForward:=false; value := nodeId}; |
| |
| _references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := AxesParameterSet.nodeId}; |
| |
| nodeset.uAObject+=AxesParameterSet; |
| // variables ActualSpeed to ParameterSet of Axes |
| var ActualSpeed := object OPCUA::UAVariable{dataType:=getIdOrAlias("Double");parentNodeId:=AxesParameterSet.nodeId;nodeId := self.createNodeId(false);browseName:="3:ActualSpeed"; accessLevel:=3}; |
| ActualSpeed._references:= object OPCUA::ListOfReferences{}; |
| ActualSpeed._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := "i=17497"}; |
| ActualSpeed.displayName:= (object OPCUA::LocalizedText {value := "ActualSpeed"})->asOrderedSet(); |
| ActualSpeed._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); isForward:=false; value := AxesParameterSet.nodeId}; |
| ActualSpeed.description:=(object OPCUA::LocalizedText {value := "The axis speed on load side (after gear/spindle) inclusive Unit."})->asOrderedSet(); |
| nodeset.uAVariable+=ActualSpeed; |
| |
| AxesParameterSet._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := ActualSpeed.nodeId}; |
| //add EngineeringUnits_ActualSpeed Variable to ActualSpeed |
| var EngineeringUnits_ActualSpeed := object OPCUA::UAVariable{dataType:=getIdOrAlias("EUInformation");parentNodeId:=ActualSpeed.nodeId;nodeId := self.createNodeId(false);browseName:="EngineeringUnits"; accessLevel:=3}; |
| EngineeringUnits_ActualSpeed._references:= object OPCUA::ListOfReferences{}; |
| EngineeringUnits_ActualSpeed._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := "i=68"}; |
| EngineeringUnits_ActualSpeed.displayName:= (object OPCUA::LocalizedText {value := "EngineeringUnits"})->asOrderedSet(); |
| EngineeringUnits_ActualSpeed._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); isForward:=false; value := ActualSpeed.nodeId}; |
| nodeset.uAVariable+=EngineeringUnits_ActualSpeed; |
| |
| ActualSpeed._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasProperty"); value := EngineeringUnits_ActualSpeed.nodeId}; |
| |
| // variables ActualPosition to ParameterSet of Axes |
| var ActualPosition := object OPCUA::UAVariable{dataType:=getIdOrAlias("Double");parentNodeId:=AxesParameterSet.nodeId;nodeId := self.createNodeId(false);browseName:="3:ActualPosition"; accessLevel:=3}; |
| ActualPosition._references:= object OPCUA::ListOfReferences{}; |
| ActualPosition._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := "i=17497"}; |
| ActualPosition.displayName:= (object OPCUA::LocalizedText {value := "ActualPosition"})->asOrderedSet(); |
| ActualPosition._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); isForward:=false; value := AxesParameterSet.nodeId}; |
| ActualPosition.description:=(object OPCUA::LocalizedText {value := "The axis position inclusive Unit and RangeOfMotion.</"})->asOrderedSet(); |
| nodeset.uAVariable+=ActualPosition; |
| |
| AxesParameterSet._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := ActualPosition.nodeId}; |
| //add EngineeringUnits_ActualPosition Variable to ActualPosition |
| var EngineeringUnits_ActualPosition := object OPCUA::UAVariable{dataType:=getIdOrAlias("EUInformation") ;parentNodeId:=ActualPosition.nodeId;nodeId := self.createNodeId(false);browseName:="EngineeringUnits"; accessLevel:=3}; |
| EngineeringUnits_ActualPosition._references:= object OPCUA::ListOfReferences{}; |
| EngineeringUnits_ActualPosition._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := "i=68"}; |
| EngineeringUnits_ActualPosition.displayName:= (object OPCUA::LocalizedText {value := "EngineeringUnits"})->asOrderedSet(); |
| EngineeringUnits_ActualPosition._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); isForward:=false; value := ActualPosition.nodeId}; |
| nodeset.uAVariable+=EngineeringUnits_ActualPosition; |
| |
| ActualPosition._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasProperty"); value := EngineeringUnits_ActualPosition.nodeId}; |
| |
| // variables ActualAcceleration to ParameterSet of Axes |
| var ActualAcceleration := object OPCUA::UAVariable{dataType:=getIdOrAlias("Double");parentNodeId:=AxesParameterSet.nodeId;nodeId := self.createNodeId(false);browseName:="3:ActualAcceleration"; accessLevel:=3}; |
| ActualAcceleration._references:= object OPCUA::ListOfReferences{}; |
| ActualAcceleration._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := "i=17497"}; |
| ActualAcceleration.displayName:= (object OPCUA::LocalizedText {value := "ActualAcceleration"})->asOrderedSet(); |
| ActualAcceleration._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); isForward:=false; value := AxesParameterSet.nodeId}; |
| ActualAcceleration.description:=(object OPCUA::LocalizedText {value := "The ActualAcceleration variable provides the axis acceleration. Applicable acceleration limits of the axis shall be provided by the EURange property of the AnalogUnitType."})->asOrderedSet(); |
| nodeset.uAVariable+=ActualAcceleration; |
| |
| AxesParameterSet._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := ActualAcceleration.nodeId}; |
| //add EngineeringUnits_ActualAcceleration Variable to ActualAcceleration |
| var EngineeringUnits_ActualAcceleration := object OPCUA::UAVariable{dataType:=getIdOrAlias("EUInformation");parentNodeId:=ActualAcceleration.nodeId;nodeId := self.createNodeId(false);browseName:="EngineeringUnits"; accessLevel:=3}; |
| EngineeringUnits_ActualAcceleration._references:= object OPCUA::ListOfReferences{}; |
| EngineeringUnits_ActualAcceleration._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := "i=68"}; |
| EngineeringUnits_ActualAcceleration.displayName:= (object OPCUA::LocalizedText {value := "EngineeringUnits"})->asOrderedSet(); |
| EngineeringUnits_ActualAcceleration._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); isForward:=false; value := ActualAcceleration.nodeId}; |
| nodeset.uAVariable+=EngineeringUnits_ActualAcceleration; |
| |
| ActualAcceleration._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasProperty"); value := EngineeringUnits_ActualAcceleration.nodeId}; |
| |
| |
| |
| |
| //Add Property typed by the AxisStateEnumeration to the AxisType or ParameterSet |
| log("***AxisStateEnum.nodeId : "+AxisStateEnum.toString()); |
| var AxisStateEnumVariable := object OPCUA::UAVariable{dataType:=AxisStateEnum.nodeId;parentNodeId:=AxesParameterSet.nodeId;nodeId := self.createNodeId(false);browseName:="1:AxisStateEnum"; accessLevel:=3}; |
| AxisStateEnumVariable._references:= object OPCUA::ListOfReferences{}; |
| AxisStateEnumVariable._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := "i=63"}; |
| AxisStateEnumVariable.displayName:= (object OPCUA::LocalizedText {value := "AxisStateEnum"})->asOrderedSet(); |
| AxisStateEnumVariable._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); isForward:=false; value := AxesParameterSet.nodeId}; |
| AxisStateEnumVariable.description:=(object OPCUA::LocalizedText {value := "The AxisStateEnumVariable variable provides the axis State, it is not a part of CS Robotics."})->asOrderedSet(); |
| nodeset.uAVariable+=AxisStateEnumVariable; |
| |
| AxesParameterSet._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := AxisStateEnumVariable.nodeId}; |
| |
| |
| //Add Property typed by the AxisStateInt to the AxisType or ParameterSet |
| |
| var AxisStateIntVariable := object OPCUA::UAVariable{dataType:=getIdOrAlias("Int16");parentNodeId:=AxesParameterSet.nodeId;nodeId := self.createNodeId(false);browseName:="1:AxisStateInt"; accessLevel:=3}; |
| AxisStateIntVariable._references:= object OPCUA::ListOfReferences{}; |
| AxisStateIntVariable._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := "i=63"}; |
| AxisStateIntVariable.displayName:= (object OPCUA::LocalizedText {value := "AxisStateInt"})->asOrderedSet(); |
| AxisStateIntVariable._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); isForward:=false; value := AxesParameterSet.nodeId}; |
| AxisStateIntVariable.description:=(object OPCUA::LocalizedText {value := "The AxisStateIntVariable variable provides the axis State, it is not a part of CS Robotics."})->asOrderedSet(); |
| nodeset.uAVariable+=AxisStateIntVariable; |
| |
| AxesParameterSet._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := AxisStateIntVariable.nodeId}; |
| |
| } |
| |
| |
| mapping UML::Property::property2PowerTrainsObject(inout parent: OPCUA::UAObject, inout nodeset : OPCUA::UANodeSetType) : OPCUA::UAObject { |
| if(self.name <> null) { |
| log("property2PowerTrainsObject for UML element " + self.name); |
| } else { |
| log("property2PowerTrainsObject for unnamed UML element " + self.toString()); |
| }; |
| |
| // set attributs of the OPCUA::UAObject |
| nodeId := self.createNodeId(); |
| if(self.name <> null) { |
| browseName := self.createBrowseName(); |
| } else { |
| browseName := self.type.name; |
| }; |
| displayName := object OPCUA::LocalizedText{value := browseName}; |
| |
| // link the OPCUA::UAObject to the parent via a HasComponent reference |
| parent._references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := nodeId}; |
| parentNodeId := parent.nodeId; |
| |
| // add references |
| //TODO generate ns dinamically |
| _references := object OPCUA::ListOfReferences{}; |
| _references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := "ns=3;i=16794"}; |
| _references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := parent.nodeId; isForward := false}; |
| description:=(object OPCUA::LocalizedText {value := "PowerTrains is a container for one or more instances of the PowerTrainType."})->asOrderedSet(); |
| |
| |
| // If the powerTrain has a MotorIdentifier |
| |
| //log("self.getValue: "+self.getValue(self.getAppliedStereotype('OPC_UA_Robotics_CS::PowerTrainType'),'Motor').toString()); |
| //log("self.getValue.oclasType: "+self.getValue(self.getAppliedStereotype('OPC_UA_Robotics_CS::PowerTrainType'),'Motor').oclAsType(OPCUA_Robotics_Profile::MotorType).toString()); |
| |
| if self.hasValue(self.getAppliedStereotype('OPC_UA_Robotics_CS::PowerTrainType'),'Motor') then { |
| nodeset.uAObject+=self.getValue(self.getAppliedStereotype('OPC_UA_Robotics_CS::PowerTrainType'),'Motor').oclAsType(OPCUA_Robotics_Profile::MotorType) -> map property2MotorIdentifier(result, nodeset); |
| |
| }endif; |
| |
| |
| |
| } |
| |
| mapping OPCUA_Robotics_Profile::MotorType::property2MotorIdentifier(inout parent: OPCUA::UAObject, inout nodeset : OPCUA::UANodeSetType) : OPCUA::UAObject { |
| |
| if(self.base_Class.name <> null) { |
| assert error (self.base_Class.name <> null) with log ("property Motor of PowerTrain must be an instance of MotorType = please geev a property isntead of a Block: " + self.base_Class.name.toString()); |
| }; |
| if(self.base_Property.name <> null) { |
| log("property2MotorIdentifierObject for UML element " + self.base_Property.name); |
| } else { |
| log("property2MotorIdentifierObject for unnamed UML element " + self.toString()); |
| }; |
| |
| // set attributs of the OPCUA::UAObject |
| nodeId := self.base_Property.oclAsType(UML::Element).createNodeId(); |
| browseName := "3:MotorIdentifier"; |
| displayName := object OPCUA::LocalizedText{value := "MotorIdentifier"}; |
| |
| // link the OPCUA::UAObject to the parent via a HasComponent reference |
| parent._references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := nodeId}; |
| parentNodeId := parent.nodeId; |
| |
| // add references |
| //TODO generate ns dinamically |
| _references := object OPCUA::ListOfReferences{}; |
| _references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := "ns=3;i=1019"}; |
| _references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := parent.nodeId; isForward := false}; |
| |
| // if (self.Manufacturer<>null ){ |
| // log("Manufacturer is not null"+self.Manufacturer.value); |
| // var manufacturer := object OPCUA::UAVariable{}; |
| // manufacturer.nodeId := self.base_Class.oclAsType(UML::Element).createNodeId(false); |
| // manufacturer.browseName := "2:Manufacturer"; |
| // manufacturer.displayName := object OPCUA::LocalizedText{value := "Manufacturer"}; |
| // manufacturer.dataType := getIdOrAlias("LocalizedText"); |
| // manufacturer.parentNodeId := nodeId; |
| // manufacturer._references := object OPCUA::ListOfReferences{}; |
| // manufacturer._references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := nodeId; isForward := false}; |
| // manufacturer._references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := "i=68"}; |
| // var manufacturerLT:= object TYPES::LocalizedText{text :=self.Manufacturer.value}; |
| // //var manufacturerLT2:= object OPCUA::LocalizedText{value :=self.Manufacturer.value}; |
| // |
| // var feature := TYPES::DocumentRoot.oclAsType(EClass).getEStructuralFeature("localizedText"); |
| // manufacturer.value := object OPCUA::ValueType1{}; |
| // manufacturer.value.oclAsType(EObject).eSet(feature, manufacturerLT); |
| // |
| // // link the OPCUA::UAVariable manufacturer to the parent via a HasComponent reference |
| // _references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := manufacturer.nodeId}; |
| // nodeset.uAVariable+=manufacturer; |
| // }; |
| |
| // add varibale ParameterSet to MotorIdentifier |
| // log("*******"+self.toString()); |
| // log("*******"+self.base_Property.oclAsType(UML::Element).toString()); |
| // log("*******"+self.base_Property.oclAsType(UML::Element).createNodeId(false)); |
| var ParameterSet_MotorIdentifier := object OPCUA::UAObject{parentNodeId:=result.nodeId;nodeId :=self.base_Property.oclAsType(UML::Element).createNodeId(false);browseName:="2:ParameterSet"}; |
| ParameterSet_MotorIdentifier._references:= object OPCUA::ListOfReferences{}; |
| ParameterSet_MotorIdentifier._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := "i=58"}; |
| ParameterSet_MotorIdentifier.displayName:= (object OPCUA::LocalizedText {value := "ParameterSet"})->asOrderedSet(); |
| ParameterSet_MotorIdentifier.description:=(object OPCUA::LocalizedText {value := "Flat list of Parameters"})->asOrderedSet(); |
| ParameterSet_MotorIdentifier._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); isForward:=false; value := result.nodeId}; |
| |
| _references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := ParameterSet_MotorIdentifier.nodeId}; |
| |
| nodeset.uAObject+=ParameterSet_MotorIdentifier; |
| // variables MotorTemperature to ParameterSet_MotorIdentifier of Axes |
| var MotorTemperature := object OPCUA::UAVariable{dataType:=getIdOrAlias("Double");parentNodeId:=ParameterSet_MotorIdentifier.nodeId;nodeId := self.base_Property.oclAsType(UML::Element).createNodeId(false);browseName:="3:MotorTemperature"; accessLevel:=3}; |
| MotorTemperature._references:= object OPCUA::ListOfReferences{}; |
| MotorTemperature._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := "i=17497"}; |
| MotorTemperature.displayName:= (object OPCUA::LocalizedText {value := "MotorTemperature"})->asOrderedSet(); |
| MotorTemperature._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); isForward:=false; value := ParameterSet_MotorIdentifier.nodeId}; |
| MotorTemperature.description:=(object OPCUA::LocalizedText {value := "The motor temperature provides the temperature of the motor. If there is no temperature sensor the value is set to \"null\"."})->asOrderedSet(); |
| nodeset.uAVariable+=MotorTemperature; |
| |
| ParameterSet_MotorIdentifier._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := MotorTemperature.nodeId}; |
| //add EngineeringUnits_MotorTemperature Variable to MotorTemperature |
| var EngineeringUnits_MotorTemperature := object OPCUA::UAVariable{dataType:=getIdOrAlias("EUInformation");parentNodeId:=MotorTemperature.nodeId;nodeId := self.base_Property.oclAsType(UML::Element).createNodeId(false);browseName:="EngineeringUnits"; accessLevel:=3}; |
| EngineeringUnits_MotorTemperature._references:= object OPCUA::ListOfReferences{}; |
| EngineeringUnits_MotorTemperature._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := "i=68"}; |
| EngineeringUnits_MotorTemperature.displayName:= (object OPCUA::LocalizedText {value := "EngineeringUnits"})->asOrderedSet(); |
| EngineeringUnits_MotorTemperature._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); isForward:=false; value := MotorTemperature.nodeId}; |
| nodeset.uAVariable+=EngineeringUnits_MotorTemperature; |
| |
| MotorTemperature._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasProperty"); value := EngineeringUnits_MotorTemperature.nodeId}; |
| |
| |
| |
| |
| |
| // ad a non CS robotics variable MotorIntensity to ParameterSet_MotorIdentifier of Axes |
| var MotorIntensity := object OPCUA::UAVariable{dataType:=getIdOrAlias("Int16");parentNodeId:=ParameterSet_MotorIdentifier.nodeId;nodeId := self.base_Property.oclAsType(UML::Element).createNodeId(false);browseName:="3:MotorIntensity"; accessLevel:=3}; |
| MotorIntensity._references:= object OPCUA::ListOfReferences{}; |
| MotorIntensity._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := "i=17497"}; |
| MotorIntensity.displayName:= (object OPCUA::LocalizedText {value := "MotorIntensity"})->asOrderedSet(); |
| MotorIntensity._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); isForward:=false; value := ParameterSet_MotorIdentifier.nodeId}; |
| MotorIntensity.description:=(object OPCUA::LocalizedText {value := "The motor temperature provides the temperature of the motor. If there is no temperature sensor the value is set to \"null\"."})->asOrderedSet(); |
| nodeset.uAVariable+=MotorIntensity; |
| |
| ParameterSet_MotorIdentifier._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); value := MotorIntensity.nodeId}; |
| //add EngineeringUnits_MotorIntensity Variable to MotorIntensity |
| var EngineeringUnits_MotorIntensity := object OPCUA::UAVariable{dataType:=getIdOrAlias("EUInformation");parentNodeId:=MotorIntensity.nodeId;nodeId := self.base_Property.oclAsType(UML::Element).createNodeId(false);browseName:="EngineeringUnits"; accessLevel:=3}; |
| EngineeringUnits_MotorIntensity._references:= object OPCUA::ListOfReferences{}; |
| EngineeringUnits_MotorIntensity._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := "i=68"}; |
| EngineeringUnits_MotorIntensity.displayName:= (object OPCUA::LocalizedText {value := "EngineeringUnits"})->asOrderedSet(); |
| EngineeringUnits_MotorIntensity._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasComponent"); isForward:=false; value := MotorIntensity.nodeId}; |
| nodeset.uAVariable+=EngineeringUnits_MotorIntensity; |
| |
| MotorIntensity._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasProperty"); value := EngineeringUnits_MotorIntensity.nodeId}; |
| |
| |
| |
| |
| |
| |
| |
| } |
| |
| mapping UML::Enumeration::enumeration2OPCUADataType(inout nodeset : OPCUA::UANodeSetType) : OPCUA::UADataType { |
| log("enumeration2OPCUADataType for UML enumeration " + self.name); |
| |
| // set attributes of the OPCUA::UADataType |
| browseName := self.createBrowseName(); |
| nodeId := self.createNodeId(); |
| displayName := (object OPCUA::LocalizedText {value := browseName})->asOrderedSet(); |
| |
| //TODO Add mapping rule accourding to th applied stereotypes self.getAppliedStereotypes() |
| |
| // create the list of references object |
| _references := object OPCUA::ListOfReferences{}; |
| |
| // if the class has no other supertypes, use the BaseObjectType as supertype |
| _references.reference += object OPCUA::Reference{referenceType := getIdOrAlias("HasSubtype"); value := getIdOrAlias("Enumeration"); isForward := false}; |
| |
| |
| // transform properties of the class |
| // if the class inherits from another class, also the properties of the parent class need to be added to the result |
| // transform primitive-type-properties of the corresponding class that are not defined as slots |
| // and repeat this for all superclasses |
| |
| // transform owned literal to Fields ; |
| |
| definition:= object DataTypeDefinition{name := self.name; |
| field+= self.ownedLiteral -> map Literal2OPCUAField()}; |
| |
| |
| //create a Varibale "EnumStrings" as a property of the data Enum |
| var StringVariable := object OPCUA::UAVariable{dataType:=getIdOrAlias("LocalizedText");parentNodeId:=result.nodeId;nodeId := self.createNodeId(false);browseName:="EnumStrings"; accessLevel:=3;arrayDimensions:="0";valueRank:=1}; |
| StringVariable._references:= object OPCUA::ListOfReferences{}; |
| StringVariable._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasTypeDefinition"); value := "i=68"}; |
| StringVariable.displayName:= (object OPCUA::LocalizedText {value := "EnumStrings"})->asOrderedSet(); |
| StringVariable._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasProperty"); isForward:=false; value := result.nodeId}; |
| //TODO Set the Value of the Variable |
| |
| // .value.any:=createFeatureMapEntry(TYPES::LocalizedText.oclAsType(StructuralFeature),object TYPES::LocalizedText{text:=self.Manufacturer.value}); |
| // StringVariable.value:= object set::ValueType1{any:= createFeatureMapEntry(text,"") }; |
| nodeset.uAVariable+=StringVariable; |
| result._references.reference +=object OPCUA::Reference{referenceType := getIdOrAlias("HasProperty"); value := StringVariable.nodeId}; |
| |
| |
| } |
| mapping UML::EnumerationLiteral::Literal2OPCUAField() : OPCUA::DataTypeField { |
| name:=self.name; |
| value:=1; |
| var l := self.specification; |
| value:= l.oclAsType(LiteralInteger).value; |
| //log("name of the LiteralInteger "+l.oclAsType(LiteralInteger).value.oclAsType(UML::PrimitiveType).); |
| |
| } |
| |
| |
| |
| |
| |
| |
| |
| |