Browse Source

driver controller FMU adapted

Cláudio Gomes 8 years ago
parent
commit
9913911611

+ 5 - 3
SemanticAdaptationForFMI/FMIAbstraction/src/abstract_units/StatechartSimulationUnit_CTInOut.py

@@ -128,7 +128,7 @@ class StatechartSimulationUnit_CTInOut(AbstractSimulationUnit):
         l.debug("<%s.StatechartSimulationUnit_CTInOut.setValues()", self._name)
     
     
-    def _doStepFunction(self, time, state, inputs):
+    def _doStepFunction(self, time, state, inputs, previous_inputs):
         """
         Runs all transitions that are enabled, or become enabled at time time with the inputs 
             valued *at that time*.
@@ -147,7 +147,8 @@ class StatechartSimulationUnit_CTInOut(AbstractSimulationUnit):
             The out_values is a map of assignments to the output variables.
             It will be merged with output_assignments
             """
-            (out_values, new_state, transition_taken, trigger) = self._state_transition_function(statechart_state, inputs, elapsed)
+            (out_values, new_state, transition_taken, trigger) = \
+                self._state_transition_function(statechart_state, inputs, previous_inputs, elapsed)
             if transition_taken:
                 l.debug("Transition taken from %s to %s because of %s. Produced assignments: %s.", 
                                 statechart_state, new_state, trigger, out_values)
@@ -174,8 +175,9 @@ class StatechartSimulationUnit_CTInOut(AbstractSimulationUnit):
         
         state_snapshot = self.getValues(step-1, iteration, [self.__current_state])
         input_snapshot = self.getValues(step, iteration, self._getInputVars())
+        previous_input_snaptshop = self.getValues(step-1, -1, self._getInputVars())
         
-        (next_state, output_assignments) = self._doStepFunction(time+cosim_step_size, state_snapshot, input_snapshot)
+        (next_state, output_assignments) = self._doStepFunction(time+cosim_step_size, state_snapshot, input_snapshot, previous_input_snaptshop)
         
         # Commit the new state and outputs.
         self.setValues(step, iteration, {self.__current_state : next_state})

+ 117 - 0
SemanticAdaptationForFMI/FMIAbstraction/src/case_study/units/de_based/DriverControllerStatechartFMU_CTInOut.py

@@ -0,0 +1,117 @@
+import logging
+
+from abstract_units.StatechartSimulationUnit_CTInOut import StatechartSimulationUnit_CTInOut
+
+
+l = logging.getLogger()
+
+class DriverControllerStatechartFMU_CTInOut(StatechartSimulationUnit_CTInOut):
+    """
+    This is a simple controller for the power window case study. It takes input
+    signals (dup, ddown, obj) representing the wishes of the driver and whether
+    an object has been detected. These are piece wise constant values (0, or 1).
+    The outputs are up or down, representing the instructions to be power system.
+    
+    It has the states
+        Neutral    (initial)
+        Up
+        Down
+        Object
+    And transitions
+        Neutral --dup/up=1--> Up
+        Neutral --ddown/down=1--> Down
+        Up --dstop/up=0--> Neutral
+        Up --ddown/up=0,down=1--> Down
+        Up --obj/up=0,down=1--> Object
+        Down --dstop/down=0--> Neutral
+        Down --dup/down=0,up=1--> Up 
+        Object --after(1)/down=0--> Neutral
+    """
+    
+    def __init__(self, name, num_rtol, num_atol):
+        
+        self.in_dup = "in_dup"
+        self.in_ddown = "in_ddown"
+        self.in_obj = "in_obj"
+        input_vars = [self.in_dup, self.in_ddown, self.in_obj]
+        
+        self.out_up = "out_up"
+        self.out_down = "out_down"
+        output_vars = [self.out_up , self.out_down]
+        
+        initial_state = "Initial"
+        
+        def state_transition(current_state, inputs, previous_inputs, elapsed):
+            l.debug(">%s.state_transition(%s, %s, %f)", self._name, current_state, inputs, elapsed)
+            
+            output_assignment = {}
+            target_state = ""
+            transition_taken = False
+            trigger = StatechartSimulationUnit_CTInOut.TRIGGER_DEFAULT
+            
+            if current_state=="Initial":
+                target_state = "Neutral"
+                transition_taken = True
+                trigger = StatechartSimulationUnit_CTInOut.TRIGGER_DEFAULT
+                output_assignment[self.out_up] = 0
+                output_assignment[self.out_down] = 0
+            elif current_state=="Neutral":
+                if inputs[self.in_dup] == 1:
+                    target_state = "Up"
+                    transition_taken = True
+                    trigger = StatechartSimulationUnit_CTInOut.TRIGGER_INPUT
+                    output_assignment[self.out_up] = 1
+                elif inputs[self.in_ddown] == 1:
+                    target_state = "Down"
+                    transition_taken = True
+                    trigger = StatechartSimulationUnit_CTInOut.TRIGGER_INPUT
+                    output_assignment[self.out_down] = 1
+            elif current_state=="Up":
+                if inputs[self.in_obj] == 1:
+                    target_state = "Object"
+                    transition_taken = True
+                    trigger = StatechartSimulationUnit_CTInOut.TRIGGER_INPUT
+                    output_assignment[self.out_up] = 0
+                    output_assignment[self.out_down] = 1
+                elif inputs[self.in_ddown] == 1:
+                    assert inputs[self.in_dup] == 0
+                    target_state = "Down"
+                    transition_taken = True
+                    trigger = StatechartSimulationUnit_CTInOut.TRIGGER_INPUT
+                    output_assignment[self.out_up] = 0
+                    output_assignment[self.out_down] = 1
+                elif inputs[self.in_dup] == 0:
+                    target_state = "Neutral"
+                    transition_taken = True
+                    trigger = StatechartSimulationUnit_CTInOut.TRIGGER_INPUT
+                    output_assignment[self.out_up] = 0
+            elif current_state=="Down":
+                if inputs[self.in_dup] == 1:
+                    assert inputs[self.in_ddown] == 0
+                    target_state = "Up"
+                    transition_taken = True
+                    trigger = StatechartSimulationUnit_CTInOut.TRIGGER_INPUT
+                    output_assignment[self.out_up] = 1
+                    output_assignment[self.out_down] = 0
+                elif inputs[self.in_ddown] == 0:
+                    target_state = "Neutral"
+                    transition_taken = True
+                    trigger = StatechartSimulationUnit_CTInOut.TRIGGER_INPUT
+                    output_assignment[self.out_down] = 0
+            elif current_state=="Object":
+                if self._biggerThan(elapsed, 1.0):
+                    target_state = "Neutral"
+                    transition_taken = True
+                    trigger = StatechartSimulationUnit_CTInOut.TRIGGER_AFTER
+                    output_assignment[self.out_up] = 0
+                    output_assignment[self.out_down] = 0
+            
+            l.debug("<%s.state_transition(%s, %s, %s, %s)", self._name, 
+                    output_assignment, target_state, transition_taken, trigger)
+            return (output_assignment, target_state, transition_taken, trigger)
+            
+        
+        StatechartSimulationUnit_CTInOut.__init__(self, name, 
+                                                  num_rtol, num_atol, 
+                                                  state_transition, initial_state, 
+                                                  input_vars, output_vars)

+ 7 - 7
SemanticAdaptationForFMI/FMIAbstraction/src/case_study/units/de_based/EnvironmentStatechartFMU_InOut.py

@@ -23,9 +23,9 @@ class EnvironmentStatechartFMU_CTInOut(StatechartSimulationUnit_CTInOut):
         output_vars = [self.out_up , self.out_down]
         
         initial_state = "Initial"
-        
-        def state_transition(current_state, input_event, elapsed):
-            l.debug(">%s.state_transition(%s, %s, %f)", self._name, current_state, input_event, elapsed)
+                
+        def state_transition(current_state, inputs, previous_inputs, elapsed):
+            l.debug(">%s.state_transition(%s, %s, %f)", self._name, current_state, inputs, elapsed)
             
             output_assignment = {}
             target_state = ""
@@ -36,17 +36,17 @@ class EnvironmentStatechartFMU_CTInOut(StatechartSimulationUnit_CTInOut):
                 target_state = "Neutral"
                 transition_taken = True
                 trigger = StatechartSimulationUnit_CTInOut.TRIGGER_DEFAULT
-                output_assignment[self.out_up] = 0.0
-                output_assignment[self.out_down] = 0.0
+                output_assignment[self.out_up] = 0
+                output_assignment[self.out_down] = 0
             elif current_state == "Neutral":
                 if self._biggerThan(elapsed, 0.5):
                     target_state = "Up"
                     transition_taken = True
                     trigger = StatechartSimulationUnit_CTInOut.TRIGGER_AFTER
-                    output_assignment[self.out_up] = 1.0
+                    output_assignment[self.out_up] = 1
                 
-            return (output_assignment, target_state, transition_taken, trigger)
             l.debug("<%s.state_transition(%s, %s, %s, %s)", self._name, output_assignment, target_state, transition_taken, trigger)
+            return (output_assignment, target_state, transition_taken, trigger)
         
         StatechartSimulationUnit_CTInOut.__init__(self, name, 
                                                   num_rtol, num_atol,