Browse Source

ower bonds

Claudio Gomes 6 years ago
parent
commit
a562c9fce6

+ 19 - 48
HintCO/instances/case_study_double_loop_better.xmi

@@ -10,61 +10,50 @@
       stepSize="1.0E-5"
       outputStepSize="0.001">
     <cosimunits
-        identifier="Scenario"
         xsi:type="hintco:CosimUnitInstance"
+        identifier="Scenario"
         declaration="//@csuDeclarations.0">
       <ports
           xsi:type="hintco:OutputPortInstance"
           identifier="psuvolt"
-          valueTo="//@candidates.0/@cosimunits.2/@ports.1"
-          />
+          valueTo="//@candidates.0/@cosimunits.2/@ports.1"/>
       <ports
           xsi:type="hintco:OutputPortInstance"
           identifier="ref"
-          valueTo="//@candidates.0/@cosimunits.1/@ports.2"
-          />
+          valueTo="//@candidates.0/@cosimunits.1/@ports.2"/>
     </cosimunits>
     <cosimunits
-    	xsi:type="hintco:CosimUnitInstance"
+        xsi:type="hintco:CosimUnitInstance"
         identifier="DLoopController_FixedEuler_1Em6"
         declaration="//@csuDeclarations.1">
-      <adaptation
-          xsi:type="hintco:MultiRateAdaptation"
-          rate="10"/>
       <ports
           xsi:type="hintco:InputPortInstance"
           identifier="VEL_FB@expseu_"
-
           valueFrom="//@candidates.0/@cosimunits.2/@ports.4">
         <adaptation
-            xsi:type="hintco:ExtrapolationAdaptation"
-            order="1"/>
+            xsi:type="hintco:ExtrapolationAdaptation"/>
       </ports>
       <ports
           xsi:type="hintco:InputPortInstance"
           identifier="POS_FB@expseu_"
-
           valueFrom="//@candidates.0/@cosimunits.3/@ports.1">
         <adaptation
-            xsi:type="hintco:ExtrapolationAdaptation"
-            order="1"/>
+            xsi:type="hintco:ExtrapolationAdaptation"/>
       </ports>
       <ports
           xsi:type="hintco:InputPortInstance"
           identifier="REFERENCE@expseu_"
-
           valueFrom="//@candidates.0/@cosimunits.0/@ports.1">
         <adaptation
-            xsi:type="hintco:InterpolationAdaptation"/>
+            xsi:type="hintco:ExtrapolationAdaptation"/>
       </ports>
       <ports
           xsi:type="hintco:OutputPortInstance"
           identifier="OUTPUT@expseu_"
-          valueTo="//@candidates.0/@cosimunits.2/@ports.0"
-          />
+          valueTo="//@candidates.0/@cosimunits.2/@ports.0"/>
     </cosimunits>
     <cosimunits
-    	xsi:type="hintco:CosimUnitInstance"
+        xsi:type="hintco:CosimUnitInstance"
         identifier="EMAPlantNoLoad_FixedEuler_1Em6"
         declaration="//@csuDeclarations.2">
       <adaptation
@@ -73,7 +62,6 @@
       <ports
           xsi:type="hintco:InputPortInstance"
           identifier="torque_input@expseu_"
-
           valueFrom="//@candidates.0/@cosimunits.1/@ports.3">
         <adaptation
             xsi:type="hintco:InterpolationAdaptation"/>
@@ -81,7 +69,6 @@
       <ports
           xsi:type="hintco:InputPortInstance"
           identifier="psu_vol_input_v@expseu_"
-
           valueFrom="//@candidates.0/@cosimunits.0/@ports.0">
         <adaptation
             xsi:type="hintco:InterpolationAdaptation"/>
@@ -89,7 +76,6 @@
       <ports
           xsi:type="hintco:InputPortInstance"
           identifier="V_IN@expseu_"
-
           valueFrom="//@candidates.0/@cosimunits.3/@ports.2">
         <adaptation
             xsi:type="hintco:ExtrapolationAdaptation"
@@ -98,7 +84,6 @@
       <ports
           xsi:type="hintco:InputPortInstance"
           identifier="X_IN@expseu_"
-
           valueFrom="//@candidates.0/@cosimunits.3/@ports.3">
         <adaptation
             xsi:type="hintco:ExtrapolationAdaptation"
@@ -107,16 +92,14 @@
       <ports
           xsi:type="hintco:OutputPortInstance"
           identifier="ang_vel_out_rpm@expseu_"
-          valueTo="//@candidates.0/@cosimunits.1/@ports.0"
-          />
+          valueTo="//@candidates.0/@cosimunits.1/@ports.0"/>
       <ports
           xsi:type="hintco:OutputPortInstance"
           identifier="F_OUT@expseu_"
-          valueTo="//@candidates.0/@cosimunits.3/@ports.0"
-          />
+          valueTo="//@candidates.0/@cosimunits.3/@ports.0"/>
     </cosimunits>
     <cosimunits
-    	xsi:type="hintco:CosimUnitInstance"
+        xsi:type="hintco:CosimUnitInstance"
         identifier="LoadNSensor_FixedEuler_1Em6"
         declaration="//@csuDeclarations.3">
       <adaptation
@@ -125,7 +108,6 @@
       <ports
           xsi:type="hintco:InputPortInstance"
           identifier="F_INPUT@expseu_"
-
           valueFrom="//@candidates.0/@cosimunits.2/@ports.5">
         <adaptation
             xsi:type="hintco:InterpolationAdaptation"
@@ -134,42 +116,31 @@
       <ports
           xsi:type="hintco:OutputPortInstance"
           identifier="X_AFTER_LOAD@expseu_"
-          valueTo="//@candidates.0/@cosimunits.1/@ports.1"
-          />
+          valueTo="//@candidates.0/@cosimunits.1/@ports.1"/>
       <ports
           xsi:type="hintco:OutputPortInstance"
           identifier="V_OUTPUT@expseu_"
-          valueTo="//@candidates.0/@cosimunits.2/@ports.2"
-          />
+          valueTo="//@candidates.0/@cosimunits.2/@ports.2"/>
       <ports
           xsi:type="hintco:OutputPortInstance"
           identifier="X_OUTPUT@expseu_"
-          valueTo="//@candidates.0/@cosimunits.2/@ports.3"
-          />
+          valueTo="//@candidates.0/@cosimunits.2/@ports.3"/>
     </cosimunits>
   </candidates>
   <csuDeclarations
       identifier="Scenario"
       path="resources/Scenario.fmu"
-      guid="{a174734c-d15f-4ef0-838d-06526230b19e}">
-
-  </csuDeclarations>
+      guid="{a174734c-d15f-4ef0-838d-06526230b19e}"/>
   <csuDeclarations
       identifier="DLoopController_FixedEuler_1Em6"
       path="resources/DLoopController_FixedEuler_1Em6.fmu"
-      guid="2761528305">
-
-  </csuDeclarations>
+      guid="2761528305"/>
   <csuDeclarations
       identifier="EMAPlantNoLoad_FixedEuler_1Em6"
       path="resources/EMAPlantNoLoad_FixedEuler_1Em6.fmu"
-      guid="698567049">
-
-  </csuDeclarations>
+      guid="698567049"/>
   <csuDeclarations
       identifier="LoadNSensor_FixedEuler_1Em6"
       path="resources/LoadNSensor_FixedEuler_1Em6.fmu"
-      guid="2810456241">
-
-  </csuDeclarations>
+      guid="2810456241"/>
 </hintco:Candidates>

+ 49 - 0
HintCO/instances/case_study_double_loop_default.hintco

@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="ASCII"?>
+<hintco:Candidates xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:hintco="ua.ansymo.hintco">
+  <candidates identifier="Original" stopTime="2.0" stepSize="1.0E-5" outputStepSize="0.001">
+    <cosimunits xsi:type="hintco:CosimUnitInstance" identifier="Scenario" declaration="//@csuDeclarations.0">
+      <ports xsi:type="hintco:OutputPortInstance" identifier="psuvolt" valueTo="//@candidates.0/@cosimunits.2/@ports.1"/>
+      <ports xsi:type="hintco:OutputPortInstance" identifier="ref" valueTo="//@candidates.0/@cosimunits.1/@ports.2"/>
+    </cosimunits>
+    <cosimunits xsi:type="hintco:CosimUnitInstance" identifier="DLoopController_FixedEuler_1Em6" declaration="//@csuDeclarations.1">
+      <ports xsi:type="hintco:InputPortInstance" identifier="VEL_FB@expseu_" valueFrom="//@candidates.0/@cosimunits.2/@ports.4">
+        <adaptation xsi:type="hintco:ExtrapolationAdaptation"/>
+      </ports>
+      <ports xsi:type="hintco:InputPortInstance" identifier="POS_FB@expseu_" valueFrom="//@candidates.0/@cosimunits.3/@ports.1">
+        <adaptation xsi:type="hintco:ExtrapolationAdaptation"/>
+      </ports>
+      <ports xsi:type="hintco:InputPortInstance" identifier="REFERENCE@expseu_" valueFrom="//@candidates.0/@cosimunits.0/@ports.1">
+        <adaptation xsi:type="hintco:ExtrapolationAdaptation"/>
+      </ports>
+      <ports xsi:type="hintco:OutputPortInstance" identifier="OUTPUT@expseu_" valueTo="//@candidates.0/@cosimunits.2/@ports.0"/>
+    </cosimunits>
+    <cosimunits xsi:type="hintco:CosimUnitInstance" identifier="EMAPlantNoLoad_FixedEuler_1Em6" declaration="//@csuDeclarations.2">
+      <ports xsi:type="hintco:InputPortInstance" identifier="torque_input@expseu_" valueFrom="//@candidates.0/@cosimunits.1/@ports.3">
+        <adaptation xsi:type="hintco:ExtrapolationAdaptation"/>
+      </ports>
+      <ports xsi:type="hintco:InputPortInstance" identifier="psu_vol_input_v@expseu_" valueFrom="//@candidates.0/@cosimunits.0/@ports.0">
+        <adaptation xsi:type="hintco:ExtrapolationAdaptation"/>
+      </ports>
+      <ports xsi:type="hintco:InputPortInstance" identifier="V_IN@expseu_" valueFrom="//@candidates.0/@cosimunits.3/@ports.2">
+        <adaptation xsi:type="hintco:ExtrapolationAdaptation"/>
+      </ports>
+      <ports xsi:type="hintco:InputPortInstance" identifier="X_IN@expseu_" valueFrom="//@candidates.0/@cosimunits.3/@ports.3">
+        <adaptation xsi:type="hintco:ExtrapolationAdaptation"/>
+      </ports>
+      <ports xsi:type="hintco:OutputPortInstance" identifier="ang_vel_out_rpm@expseu_" valueTo="//@candidates.0/@cosimunits.1/@ports.0"/>
+      <ports xsi:type="hintco:OutputPortInstance" identifier="F_OUT@expseu_" valueTo="//@candidates.0/@cosimunits.3/@ports.0"/>
+    </cosimunits>
+    <cosimunits xsi:type="hintco:CosimUnitInstance" identifier="LoadNSensor_FixedEuler_1Em6" declaration="//@csuDeclarations.3">
+      <ports xsi:type="hintco:InputPortInstance" identifier="F_INPUT@expseu_" valueFrom="//@candidates.0/@cosimunits.2/@ports.5">
+        <adaptation xsi:type="hintco:ExtrapolationAdaptation"/>
+      </ports>
+      <ports xsi:type="hintco:OutputPortInstance" identifier="X_AFTER_LOAD@expseu_" valueTo="//@candidates.0/@cosimunits.1/@ports.1"/>
+      <ports xsi:type="hintco:OutputPortInstance" identifier="V_OUTPUT@expseu_" valueTo="//@candidates.0/@cosimunits.2/@ports.2"/>
+      <ports xsi:type="hintco:OutputPortInstance" identifier="X_OUTPUT@expseu_" valueTo="//@candidates.0/@cosimunits.2/@ports.3"/>
+    </cosimunits>
+  </candidates>
+  <csuDeclarations identifier="Scenario" path="resources/Scenario.fmu" guid="{a174734c-d15f-4ef0-838d-06526230b19e}"/>
+  <csuDeclarations identifier="DLoopController_FixedEuler_1Em6" path="resources/DLoopController_FixedEuler_1Em6.fmu" guid="2761528305"/>
+  <csuDeclarations identifier="EMAPlantNoLoad_FixedEuler_1Em6" path="resources/EMAPlantNoLoad_FixedEuler_1Em6.fmu" guid="698567049"/>
+  <csuDeclarations identifier="LoadNSensor_FixedEuler_1Em6" path="resources/LoadNSensor_FixedEuler_1Em6.fmu" guid="2810456241"/>
+</hintco:Candidates>

+ 15 - 27
HintCO/instances/case_study_double_loop_pbond.hintco

@@ -1,28 +1,25 @@
 <?xml version="1.0" encoding="ASCII"?>
 <hintco:Candidates xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:hintco="ua.ansymo.hintco">
-  <candidates identifier="Original" stopTime="2.0" stepSize="0.001" outputStepSize="0.001">
-    <cosimunits
- xsi:type="hintco:CosimUnitInstance" identifier="Scenario" declaration="//@csuDeclarations.0">
+  <candidates identifier="Original" stopTime="2.0" stepSize="1.0E-5" outputStepSize="0.001">
+    <cosimunits xsi:type="hintco:CosimUnitInstance" identifier="Scenario" declaration="//@csuDeclarations.0">
       <ports xsi:type="hintco:OutputPortInstance" identifier="psuvolt" valueTo="//@candidates.0/@cosimunits.2/@ports.1"/>
       <ports xsi:type="hintco:OutputPortInstance" identifier="ref" valueTo="//@candidates.0/@cosimunits.1/@ports.2"/>
     </cosimunits>
-    <cosimunits
- xsi:type="hintco:CosimUnitInstance" identifier="DLoopController_FixedEuler_1Em6" declaration="//@csuDeclarations.1">
+    <cosimunits xsi:type="hintco:CosimUnitInstance" identifier="DLoopController_FixedEuler_1Em6" declaration="//@csuDeclarations.1">
       <ports xsi:type="hintco:InputPortInstance" identifier="VEL_FB@expseu_" valueFrom="//@candidates.0/@cosimunits.2/@ports.4">
         <adaptation xsi:type="hintco:ExtrapolationAdaptation"/>
       </ports>
-      <ports xsi:type="hintco:InputPortInstance" identifier="POS_FB@expseu_"  valueFrom="//@candidates.0/@cosimunits.3/@ports.1">
+      <ports xsi:type="hintco:InputPortInstance" identifier="POS_FB@expseu_" valueFrom="//@candidates.0/@cosimunits.3/@ports.1">
         <adaptation xsi:type="hintco:ExtrapolationAdaptation"/>
       </ports>
       <ports xsi:type="hintco:InputPortInstance" identifier="REFERENCE@expseu_" valueFrom="//@candidates.0/@cosimunits.0/@ports.1">
         <adaptation xsi:type="hintco:ExtrapolationAdaptation"/>
       </ports>
-      <ports xsi:type="hintco:OutputPortInstance" identifier="OUTPUT@expseu_" valueTo="//@candidates.0/@cosimunits.2/@ports.0" />
+      <ports xsi:type="hintco:OutputPortInstance" identifier="OUTPUT@expseu_" valueTo="//@candidates.0/@cosimunits.2/@ports.0"/>
     </cosimunits>
-    <cosimunits
- xsi:type="hintco:CosimUnitInstance" identifier="EMAPlantNoLoad_FixedEuler_1Em6" declaration="//@csuDeclarations.2">
+    <cosimunits xsi:type="hintco:CosimUnitInstance" identifier="EMAPlantNoLoad_FixedEuler_1Em6" declaration="//@csuDeclarations.2">
       <adaptation xsi:type="hintco:PowerBondAdaptation" effort="//@candidates.0/@cosimunits.2/@ports.5" flow="//@candidates.0/@cosimunits.2/@ports.2"/>
-      <ports xsi:type="hintco:InputPortInstance" identifier="torque_input@expseu_"  valueFrom="//@candidates.0/@cosimunits.1/@ports.3">
+      <ports xsi:type="hintco:InputPortInstance" identifier="torque_input@expseu_" valueFrom="//@candidates.0/@cosimunits.1/@ports.3">
         <adaptation xsi:type="hintco:ExtrapolationAdaptation"/>
       </ports>
       <ports xsi:type="hintco:InputPortInstance" identifier="psu_vol_input_v@expseu_" valueFrom="//@candidates.0/@cosimunits.0/@ports.0">
@@ -34,30 +31,21 @@
       <ports xsi:type="hintco:InputPortInstance" identifier="X_IN@expseu_" valueFrom="//@candidates.0/@cosimunits.3/@ports.3">
         <adaptation xsi:type="hintco:ExtrapolationAdaptation"/>
       </ports>
-      <ports xsi:type="hintco:OutputPortInstance" identifier="ang_vel_out_rpm@expseu_" valueTo="//@candidates.0/@cosimunits.1/@ports.0" />
+      <ports xsi:type="hintco:OutputPortInstance" identifier="ang_vel_out_rpm@expseu_" valueTo="//@candidates.0/@cosimunits.1/@ports.0"/>
       <ports xsi:type="hintco:OutputPortInstance" identifier="F_OUT@expseu_" valueTo="//@candidates.0/@cosimunits.3/@ports.0"/>
     </cosimunits>
-    <cosimunits
- xsi:type="hintco:CosimUnitInstance" identifier="LoadNSensor_FixedEuler_1Em6" declaration="//@csuDeclarations.3">
+    <cosimunits xsi:type="hintco:CosimUnitInstance" identifier="LoadNSensor_FixedEuler_1Em6" declaration="//@csuDeclarations.3">
       <adaptation xsi:type="hintco:PowerBondAdaptation" effort="//@candidates.0/@cosimunits.3/@ports.0" flow="//@candidates.0/@cosimunits.3/@ports.2"/>
       <ports xsi:type="hintco:InputPortInstance" identifier="F_INPUT@expseu_" valueFrom="//@candidates.0/@cosimunits.2/@ports.5">
         <adaptation xsi:type="hintco:InterpolationAdaptation"/>
       </ports>
-      <ports xsi:type="hintco:OutputPortInstance" identifier="X_AFTER_LOAD@expseu_" valueTo="//@candidates.0/@cosimunits.1/@ports.1" />
+      <ports xsi:type="hintco:OutputPortInstance" identifier="X_AFTER_LOAD@expseu_" valueTo="//@candidates.0/@cosimunits.1/@ports.1"/>
       <ports xsi:type="hintco:OutputPortInstance" identifier="V_OUTPUT@expseu_" valueTo="//@candidates.0/@cosimunits.2/@ports.2"/>
-      <ports xsi:type="hintco:OutputPortInstance" identifier="X_OUTPUT@expseu_" valueTo="//@candidates.0/@cosimunits.2/@ports.3" />
+      <ports xsi:type="hintco:OutputPortInstance" identifier="X_OUTPUT@expseu_" valueTo="//@candidates.0/@cosimunits.2/@ports.3"/>
     </cosimunits>
   </candidates>
-  <csuDeclarations identifier="Scenario" path="resources/Scenario.fmu" guid="{a174734c-d15f-4ef0-838d-06526230b19e}">
-
-  </csuDeclarations>
-  <csuDeclarations identifier="DLoopController_FixedEuler_1Em6" path="resources/DLoopController_FixedEuler_1Em6.fmu" guid="2761528305">
-
-  </csuDeclarations>
-  <csuDeclarations identifier="EMAPlantNoLoad_FixedEuler_1Em6" path="resources/EMAPlantNoLoad_FixedEuler_1Em6.fmu" guid="698567049">
-
-  </csuDeclarations>
-  <csuDeclarations identifier="LoadNSensor_FixedEuler_1Em6" path="resources/LoadNSensor_FixedEuler_1Em6.fmu" guid="2810456241">
-
-  </csuDeclarations>
+  <csuDeclarations identifier="Scenario" path="resources/Scenario.fmu" guid="{a174734c-d15f-4ef0-838d-06526230b19e}"/>
+  <csuDeclarations identifier="DLoopController_FixedEuler_1Em6" path="resources/DLoopController_FixedEuler_1Em6.fmu" guid="2761528305"/>
+  <csuDeclarations identifier="EMAPlantNoLoad_FixedEuler_1Em6" path="resources/EMAPlantNoLoad_FixedEuler_1Em6.fmu" guid="698567049"/>
+  <csuDeclarations identifier="LoadNSensor_FixedEuler_1Em6" path="resources/LoadNSensor_FixedEuler_1Em6.fmu" guid="2810456241"/>
 </hintco:Candidates>

+ 9 - 4
HintCO/src/ua/ansymo/hintco/AdaptedFMUInstance.xtend

@@ -21,11 +21,11 @@ class AdaptedFMUInstance extends FmuInstance {
 	Map<String, List<IAdaptedInputPort>> adaptedInPorts = newHashMap()
 	Map<String, IAdaptedOutputPort> adaptedOutPorts = newHashMap()
 	
-	Logger logger = LoggerFactory.getLogger(typeof(CosimRunner))
+	Logger logger = LoggerFactory.getLogger(typeof(AdaptedFMUInstance))
 	
 	protected MODE currentMode
 	
-	UnitInstance unit
+	public UnitInstance unit
 	
 	List<OutputPortInstance> outputPorts
 	
@@ -145,6 +145,7 @@ class AdaptedFMUInstance extends FmuInstance {
 	}
 	
 	override doStep(double currentCommunicationPoint, double communicationStepSize) throws FmuInvocationException {
+		logger.debug(">{}.doStep({},{})", unit.identifier, currentCommunicationPoint, communicationStepSize)
 		val micro_step = communicationStepSize/innerRate
 		var inner_time = currentCommunicationPoint
 		var Fmi2Status status;
@@ -205,6 +206,7 @@ class AdaptedFMUInstance extends FmuInstance {
 				p.setReal(v)
 				// In initialization mode, the values of the adaptation must be propagated to the internal fmus.
 				if (currentMode == MODE.INITING){
+					logger.debug("Propagating value.")
 					p.computeReal(0.0, 0.0, 0.0, 0.0)	
 				}
 			}
@@ -216,6 +218,7 @@ class AdaptedFMUInstance extends FmuInstance {
 	
 	override getReal(String portName){
 		logger.debug(">{}.getReal({})", unit.identifier, portName)
+		var double res
 		val adaptedPort = adaptedOutPorts.get(portName)
 		if (adaptedPort !== null){
 			logger.debug("Going through adapted port.")
@@ -223,11 +226,13 @@ class AdaptedFMUInstance extends FmuInstance {
 			if (currentMode == MODE.INITING){
 				adaptedPort.recordReal(0.0,0.0,0.0,0.0)
 			}
-			adaptedPort.getReal()
+			res = adaptedPort.getReal()
 		} else {
 			logger.debug("No adaptation used.")
-			getInnerReal(portName)
+			res = getInnerReal(portName)
 		}
+		logger.debug("<{}.getReal({}) = {}", unit.identifier, portName, res)
+		return res
 	}
 	
 	def setInnerReal(String portName, double v){

+ 8 - 4
HintCO/src/ua/ansymo/hintco/ApproximationAdaptedPort.xtend

@@ -6,7 +6,8 @@ abstract class ApproximationAdaptedPort implements IAdaptedInputPort {
 	
 	var protected double current_val
 	var protected double previous_val
-	var protected boolean initialized = false
+	var protected boolean firstValueKnown = false
+	var protected boolean inCosimStepMode = false
 	
 	var protected AdaptedFMUInstance fmu
 	var protected String portId;
@@ -14,13 +15,14 @@ abstract class ApproximationAdaptedPort implements IAdaptedInputPort {
 	new(PortAdaptation adaptation, AdaptedFMUInstance f) {
 		fmu = f
 		portId = adaptation.adapted.identifier
+		inCosimStepMode = false
 	}
 	
 	override setReal(double v) {
 		current_val = v
-		if (!initialized){
+		if (!firstValueKnown){
 			previous_val = v
-			initialized = true
+			firstValueKnown = true
 		}
 	}
 	
@@ -30,7 +32,9 @@ abstract class ApproximationAdaptedPort implements IAdaptedInputPort {
 		this.previous_val = current_val
 	}
 	
-	override startCosimStep(double time, double stepSize) {}
+	override startCosimStep(double time, double stepSize) {
+		inCosimStepMode = true
+	}
 	
 	override endCosimStep(double time, double stepSize) {}
 }

+ 12 - 11
HintCO/src/ua/ansymo/hintco/CandidatesGenerator.xtend

@@ -239,17 +239,18 @@ class CandidatesGenerator {
 					// Nothing to do.
 				}
 				PowerBondAdaptation: {
-					// TODO Clean up
-//					val adaptation = alternative as PowerBondAdaptation
-//					val adapted = adaptation.adapted()
-//					logger.debug("Processing Alternative PowerBondAdaptation of {}", adapted.identifier)
-//					Assert.isNotNull(adapted)
-//					Assert.isTrue(adapted instanceof UnitInstance)
-//					val unit = adapted as UnitInstance
-//					
-//					logger.debug("Attempting to add constraint {}->{}.{}.", unit.identifier, adaptation.POut.unit.identifier, adaptation.POut.identifier)
-//					val success = addConstraint(unit, adaptation.POut, constraints, n, cs)
-//					logger.debug("Success: {}", success)
+					val adaptation = alternative as PowerBondAdaptation
+					val adapted = adaptation.adapted()
+					logger.debug("Processing Alternative PowerBondAdaptation of {}", adapted.identifier)
+					Assert.isNotNull(adapted)
+					Assert.isTrue(adapted instanceof UnitInstance)
+					val unit = adapted as UnitInstance
+					
+					Assert.isTrue(adaptation.POut.unit === unit)
+					
+					logger.debug("Attempting to add constraint {}.{}->{}.", unit.identifier, adaptation.POut.identifier, unit.identifier)
+					val success = addConstraint(adaptation.POut, unit, constraints, n, cs)
+					logger.debug("Success: {}", success)
 				}
 				MultiRateAdaptation: {
 					// Nothing to do

+ 4 - 1
HintCO/src/ua/ansymo/hintco/ExtrapolationAdaptedPort.xtend

@@ -7,7 +7,10 @@ class ExtrapolationAdaptedPort extends ApproximationAdaptedPort {
 	}
 	
 	override computeReal(double t, double dt, double h, double H) {
-		val o = previous_val + ((current_val - previous_val)/H)*(H + dt + h)
+		var o = current_val
+		if (inCosimStepMode){
+			o = previous_val + ((current_val - previous_val)/H)*(H + dt + h)
+		}
 		fmu.setInnerReal(portId, o)
 	}
 	

+ 9 - 2
HintCO/src/ua/ansymo/hintco/FmuInstance.xtend

@@ -7,12 +7,15 @@ import org.intocps.fmi.FmuInvocationException
 import org.intocps.fmi.IFmiComponent
 import org.intocps.orchestration.coe.modeldefinition.ModelDescription
 import org.intocps.orchestration.coe.modeldefinition.ModelDescription.ScalarVariable
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
 
-	
 abstract class FmuInstance implements IFmuInstance  {
 	var IFmiComponent f
 	var Map<String, ScalarVariable> varsByName = newHashMap()
 	
+	Logger logger = LoggerFactory.getLogger(typeof(FmuInstance))
+	
 	new (IFmiComponent f){
 		if (f !== null){
 			this.f = f
@@ -44,13 +47,17 @@ abstract class FmuInstance implements IFmuInstance  {
 	}
 	
 	override getReal(String varName) {
+		logger.debug(">getReal({})", varName)
 		val res = f.getReal(#[varsByName.get(varName).valueReference])
 		Assert.isTrue(res.status == Fmi2Status.OK)
 		Assert.isTrue(!res.result.empty)
-		return res.result.head
+		val resD = res.result.head
+		logger.debug("<getReal({}) = {}", varName, res)
+		return resD
 	}
 	
 	override setReal(String varName, double v) {
+		logger.debug(">setReal({},{})", varName, v)
 		val res = f.setReals(#[varsByName.get(varName).valueReference], #[v])
 		Assert.isTrue(res == Fmi2Status.OK)
 	}

+ 4 - 1
HintCO/src/ua/ansymo/hintco/InterpolationAdaptedPort.xtend

@@ -7,7 +7,10 @@ class InterpolationAdaptedPort extends ApproximationAdaptedPort {
 	}
 	
 	override computeReal(double t, double dt, double h, double H) {
-		val o = previous_val + ((current_val - previous_val)/H)*(dt+h)
+		var o = current_val
+		if (inCosimStepMode){
+			o = previous_val + ((current_val - previous_val)/H)*(dt+h)
+		}
 		fmu.setInnerReal(portId, o)
 	}
 	

+ 14 - 3
HintCO/src/ua/ansymo/hintco/PowerCorrectionPort.xtend

@@ -1,5 +1,8 @@
 package ua.ansymo.hintco
 
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+
 class PowerCorrectionPort extends StoreAdaptedPort {
 	
 	var AdaptedFMUInstance fmu
@@ -9,12 +12,14 @@ class PowerCorrectionPort extends StoreAdaptedPort {
 	var double accumulatedDeficit = 0.0
 	var double energyDeficit = 0.0
 	
-	var Kp = 0.9
-	var Ki = 0.2
+	var Kp = 10.0
+	var Ki = 10.0
 	
 	PowerOutAdaptedPort pOut
 	StoreAdaptedPort pIn
 	
+	Logger logger = LoggerFactory.getLogger(typeof(PowerCorrectionPort))
+	
 	new(String pId, PowerOutAdaptedPort po, StoreAdaptedPort pi, AdaptedFMUInstance f) {
 		fmu = f
 		portId = pId
@@ -29,7 +34,7 @@ class PowerCorrectionPort extends StoreAdaptedPort {
 	override endCosimStep(double time, double stepSize) {
 		val powerIn = pIn.storedVal
 		val powerOut = pOut.real
-		energyDeficit = (powerIn - powerOut)/stepSize
+		energyDeficit = (powerOut-powerIn)*stepSize
 		// Positive residual means this fmu has a deficit of energy.
 		accumulatedDeficit = accumulatedDeficit + energyDeficit
 	}
@@ -38,6 +43,12 @@ class PowerCorrectionPort extends StoreAdaptedPort {
 		val givenInput = storedVal
 		val piControlOut = Kp*energyDeficit + Ki*accumulatedDeficit
 		val actualInput = givenInput + piControlOut
+		logger.debug("Applying power correction on port {}.{}.", 
+					fmu.unit.identifier, portId)
+		logger.debug("energyDeficit={}", energyDeficit)
+		logger.debug("accumulatedDeficit={}", accumulatedDeficit)
+		logger.debug("givenInput={}", givenInput)
+		logger.debug("actualInput={}", actualInput)
 		fmu.setInnerReal(portId, actualInput)
 	}
 }

+ 41 - 8
HintCO/test/ua/ansymo/hintco/test/CosimRunnerTest.xtend

@@ -7,6 +7,7 @@ import org.intocps.fmi.Fmi2Status
 import org.intocps.fmi.IFmuCallback
 import org.intocps.fmi.jnifmuapi.Factory
 import org.intocps.orchestration.coe.modeldefinition.ModelDescription
+import org.junit.Assume
 import org.junit.Ignore
 import org.junit.Test
 import ua.ansymo.hintco.CandidatesGenerator
@@ -23,6 +24,7 @@ import ua.ansymo.hintco.VariantValidator
 
 import static org.junit.Assert.*
 import static ua.ansymo.hintco.ModelQuery.*
+import org.apache.commons.lang3.SystemUtils
 
 class CosimRunnerTest {
 	@Test
@@ -213,23 +215,36 @@ class CosimRunnerTest {
 	}
 	
 	@Test
-	@Ignore // Because it only works on windows.
-	def void executeCosimulationTestDoubleLoop(){
-		val resultsDirPath = "results-gen/cosimTestDLoop"
+	def void executeCosimulationTestDoubleLoopApprox(){
+		Assume.assumeTrue(SystemUtils.IS_OS_WINDOWS) // Because it only works on windows.
+
+//		System.setProperty("org.slf4j.simpleLogger.defaultLogLevel", "debug")
+//		System.setProperty("org.slf4j.simpleLogger.logFile", "dloopbetter.log")
+		val resultsDirPath = "results-gen/cosimTestDLoopApprox"
 		val loader = new ModelStorage()
+//		val runner = new CosimRunner(new IOutputProcessor{
+//			override initialize(RootCandidateScenario scenario, String variantID) {}
+//			override terminate() {}
+//			override setOutputs(int step, double time, Map<OutputPortInstance, Double> outVals) {
+//				if (time > 1.5){
+//					assertTrue(true)
+//				}
+//			}
+//		}, new FmuLoader)
 		val runner = new CosimRunner(new OutputProcessor(resultsDirPath), new FmuLoader)
 		val generator = new CandidatesGenerator(new ConstraintChecker,new VariantValidator, new VariantProcessor(runner))
-		val src = loader.loadCandidates("instances/case_study_double_loop_better.xmi")
+		val src = loader.loadCandidates("instances/case_study_double_loop_approx.xmi")
 		generator.createVariantTree(src)
-		generator.generateVariants(src, 1)
+		val numVariants = generator.generateVariants(src, 1)
 		runner.close()
+		assertEquals(1, numVariants)
 	}
 	
 	@Test
-	@Ignore // Because it only works on windows.
 	def void executeCosimulationTestDoubleLoopPowerBond(){
-		System.setProperty("org.slf4j.simpleLogger.defaultLogLevel", "debug")
-		System.setProperty("org.slf4j.simpleLogger.logFile", "powerbond.log")
+		Assume.assumeTrue(SystemUtils.IS_OS_WINDOWS) // Because it only works on windows.
+//		System.setProperty("org.slf4j.simpleLogger.defaultLogLevel", "debug")
+//		System.setProperty("org.slf4j.simpleLogger.logFile", "powerbond.log")
 		val resultsDirPath = "results-gen/cosimTestDLoopPBond"
 		val loader = new ModelStorage()
 		val src = loader.loadCandidates("instances/case_study_double_loop_pbond.hintco")
@@ -242,6 +257,24 @@ class CosimRunnerTest {
 		assertEquals(1, numVariants)
 	}
 	
+	
+	@Test
+	def void executeCosimulationTestDoubleLoopDefault(){
+		Assume.assumeTrue(SystemUtils.IS_OS_WINDOWS) // Because it only works on windows.
+//		System.setProperty("org.slf4j.simpleLogger.defaultLogLevel", "debug")
+//		System.setProperty("org.slf4j.simpleLogger.logFile", "powerbond.log")
+		val resultsDirPath = "results-gen/cosimTestDLoopDefault"
+		val loader = new ModelStorage()
+		val src = loader.loadCandidates("instances/case_study_double_loop_default.hintco")
+		val runner = new CosimRunner(new OutputProcessor(resultsDirPath), new FmuLoader)
+		val generator = new CandidatesGenerator(new ConstraintChecker,new VariantValidator, new VariantProcessor(runner))
+		generator.processAdaptations(src)
+		generator.createVariantTree(src)
+		val numVariants = generator.generateVariants(src, 1)
+		runner.close()
+		assertEquals(1, numVariants)
+	}
+	
 	@Test
 	def void executeDuplicateUnitTest(){
 		val resultsDirPath = "results-gen/dupUnitTest"