Jelajahi Sumber

power window hybrid model

Cláudio Gomes 9 tahun lalu
induk
melakukan
e894e691ed

+ 8 - 0
debugging_fsa_cbd_composition/fsa_cbd_simulator/CBDMultipleOutput/Source/CBD.py

@@ -159,6 +159,14 @@ class NegatorBlock(BaseBlock):
     def compute(self, curIteration):
         self.appendToSignal(-self.getInputSignal(curIteration).value)
 
+class AbsBlock(BaseBlock):
+    def __init__(self, block_name):
+        BaseBlock.__init__(self, block_name, ["IN1"], ["OUT1"])
+
+    def compute(self, curIteration):
+        self.appendToSignal(abs(self.getInputSignal(curIteration).value))
+
+
 class InverterBlock(BaseBlock):
     """
     The invertblock will output 1/IN

+ 23 - 7
debugging_fsa_cbd_composition/fsa_cbd_simulator/HierarchicalSimulator/CBDMultipleOutput/Source/CBD.py

@@ -71,12 +71,6 @@ class BaseBlock:
         name_output = "OUT1" if name_output == None else name_output
         assert name_output in self.__signals.keys()
         self.__signals[name_output].append(Signal(self.getClock().getTime(), value))
-        
-    def setSignal(self, value, name_output = None):
-        name_output = "OUT1" if name_output == None else name_output
-        assert name_output in self.__signals.keys()
-        if len(self.__signals[name_output]) > 0:
-            self.__signals[name_output][-1] = Signal(self.getClock().getTime(), value)
 
     def getSignal(self, name_output = None):
         name_output = "OUT1" if name_output == None else name_output
@@ -165,6 +159,14 @@ class NegatorBlock(BaseBlock):
     def compute(self, curIteration):
         self.appendToSignal(-self.getInputSignal(curIteration).value)
 
+class AbsBlock(BaseBlock):
+    def __init__(self, block_name):
+        BaseBlock.__init__(self, block_name, ["IN1"], ["OUT1"])
+
+    def compute(self, curIteration):
+        self.appendToSignal(abs(self.getInputSignal(curIteration).value))
+
+
 class InverterBlock(BaseBlock):
     """
     The invertblock will output 1/IN
@@ -185,6 +187,20 @@ class AdderBlock(BaseBlock):
     def	compute(self, curIteration):
         self.appendToSignal(self.getInputSignal(curIteration, "IN1").value + self.getInputSignal(curIteration, "IN2").value)
 
+class DecisionBlock(BaseBlock):
+    """
+    A block that has three inputs (T, F, C) and one output. If C > 0, then T is the output,  otherwise F is the output.
+    """
+    def __init__(self, blockname):
+        BaseBlock.__init__(self, blockname, ["T", "F", "C"], ["OUT1"])
+
+    def compute(self, curIteration):
+        if self.getInputSignal(curIteration, "C").value > 0:
+            self.appendToSignal(self.getInputSignal(curIteration, "T").value, "OUT1")
+        if self.getInputSignal(curIteration, "C").value <= 0:
+            self.appendToSignal(self.getInputSignal(curIteration, "F").value, "OUT1")
+
+
 class ProductBlock(BaseBlock):
     """
     The product block will multiply the two inputs
@@ -487,7 +503,7 @@ class CBD(BaseBlock):
             self.__blocks.append(block)
             self.__blocksDict[block.getBlockName()] = block
         else:
-            print("Warning: did not add this block as it has the same name %s as an existing block" % block.getBlockName())
+            raise RuntimeError("Error: block with same name %s as an existing block in CBD %s" % block.getBlockName(), block._parent.getBlockName())
 
     def removeBlock(self, block):
         assert isinstance(block, BaseBlock), "Can only delete BaseBlock (subclass) instances to a CBD"

+ 249 - 0
debugging_fsa_cbd_composition/fsa_cbd_simulator/HierarchicalSimulator/models/power_window.py

@@ -0,0 +1,249 @@
+from CBDMultipleOutput.Source.CBD import ConstantBlock, NegatorBlock, \
+    IntegratorBlock, CBD, ProductBlock, AdderBlock, InverterBlock, DecisionBlock, \
+    GenericBlock, AbsBlock
+from fsa_cbd_woven_classes import InputConstantBlock, CBDState, WhenCrossesZeroTrigger
+from fsaclasses import FSAModel, Transition, Event, State, After, Float
+
+
+class PowerWindow(FSAModel):
+    def __init__(self):
+        Started = CBDState("Started", PowerWindowStarted("Started"))
+        Neutral = State("Neutral")
+        Pass_Up = CBDState("Pass_up", PowerWindowUp("Pass_up"))
+        Driver_Up = CBDState("Driver_Up", PowerWindowUp("Driver_Up"))
+        Pass_Down = CBDState("Pass_Down", PowerWindowDown("Pass_Down"))
+        Driver_Down = CBDState("Driver_Down", PowerWindowDown("Driver_Down"))
+        Obj_Detected = CBDState("Obj_Detected", PowerWindowDown("Obj_Detected"))
+        End = State("End", final=True)
+        
+        start = Transition("start", Started, Neutral)
+        
+        p_up_Neutral = Transition("p_up", Neutral, Pass_Up)
+        p_up_Neutral.trigger = Event("p_up");
+        p_down_Neutral = Transition("p_down", Neutral, Pass_Down)
+        p_down_Neutral.trigger = Event("p_down");
+        d_up_Neutral = Transition("d_up", Neutral, Driver_Up)
+        d_up_Neutral.trigger = Event("d_up");
+        d_down_Neutral = Transition("d_down", Neutral, Driver_Down)
+        d_down_Neutral.trigger = Event("d_down");
+        end_Neutral = Transition("end", Neutral, End)
+        end_Neutral.trigger = Event("end");
+        
+        stop_Pass_up = Transition("stop", Pass_Up, Neutral)
+        stop_Pass_up.trigger = Event("stop");
+        d_down_Pass_up = Transition("d_down", Pass_Up, Driver_Down)
+        d_down_Pass_up.trigger = Event("d_down");
+        d_up_Pass_up = Transition("d_up", Pass_Up, Driver_Up)
+        d_up_Pass_up.trigger = Event("d_up");
+        when_obj_detected_Pass_up = Transition("when_obj_detected", Pass_Up, Obj_Detected)
+        when_obj_detected_Pass_up.trigger = WhenCrossesZeroTrigger("Fo100", up_direction=True)
+        
+        stop_Driver_Up = Transition("stop", Driver_Up, Neutral)
+        stop_Driver_Up.trigger = Event("stop");
+        when_obj_detected_Driver_Up = Transition("when_obj_detected", Driver_Up, Obj_Detected)
+        when_obj_detected_Driver_Up.trigger = WhenCrossesZeroTrigger("Fo100", up_direction=True)
+        
+        stop_Pass_Down = Transition("stop", Pass_Down, Neutral)
+        stop_Pass_Down.trigger = Event("stop");
+        d_down_Pass_Down = Transition("d_down", Pass_Down, Driver_Down)
+        d_down_Pass_Down.trigger = Event("d_down");
+        d_up_Pass_Down = Transition("d_up", Pass_Down, Driver_Up)
+        d_up_Pass_Down.trigger = Event("d_up");
+        
+        stop_Driver_Down = Transition("stop", Driver_Down, Neutral)
+        stop_Driver_Down.trigger = Event("stop");
+        
+        stop_Obj_Detected = Transition("after", Obj_Detected, Neutral)
+        stop_Obj_Detected.trigger = After(Float(10.0)); # s
+        
+        self.states = [
+                       Started,
+                       Neutral,
+                       Pass_Up,
+                       Driver_Up,
+                       Pass_Down,
+                       Driver_Down,
+                       Obj_Detected,
+                       End
+                       ]
+        
+        self.initialState = Started
+        
+        self.transitions = [
+                            start,
+                            p_up_Neutral,
+                            p_down_Neutral,
+                            d_up_Neutral,
+                            d_down_Neutral,
+                            end_Neutral,
+                            stop_Pass_up,
+                            d_down_Pass_up,
+                            d_up_Pass_up,
+                            when_obj_detected_Pass_up,
+                            stop_Driver_Up,
+                            when_obj_detected_Driver_Up,
+                            stop_Pass_Down,
+                            d_down_Pass_Down,
+                            d_up_Pass_Down,
+                            stop_Driver_Down,
+                            stop_Obj_Detected
+                            ]
+
+class PowerWindowStarted(CBD):
+    def __init__(self, blockName, delta_t = 0.01):
+        CBD.__init__(self,blockName, input_ports=[], output_ports=["out_w0","out_v0"])
+        
+        self.addBlock(ConstantBlock("0", value=0.0))
+        
+        self.addConnection("0", "out_w0")
+        self.addConnection("0", "out_v0")
+      
+class PowerWindowDown(CBD):
+    def __init__(self, blockName, delta_t = 0.01):
+        CBD.__init__(self,blockName, input_ports=[], output_ports=["out_w0","out_v0"])
+        
+        self.addBlock(ConstantBlock("delta_t", value=delta_t))
+        self.addBlock(ConstantBlock("torque", value=-2.0))
+        self.addBlock(ConstantBlock("0", value=0.0))
+        self.addBlock(ConstantBlock("100", value=100.0))
+        
+        self.addBlock(InputConstantBlock("in_w0", value=0.0))
+        self.addBlock(InputConstantBlock("in_v0", value=0.0))
+        
+        self.addBlock(PowerWindowPlant("plant"))
+        
+        self.addConnection("delta_t", "plant", input_port_name="delta_t")
+        self.addConnection("torque", "plant", input_port_name="motor")
+        self.addConnection("0", "plant", input_port_name="object_detect")
+        self.addConnection("100", "plant", input_port_name="object_position")
+        
+        self.addConnection("in_w0", "plant", input_port_name="init_position")
+        self.addConnection("in_v0", "plant", input_port_name="init_velocity")
+        
+        self.addConnection("plant", "out_w0", output_port_name="position_out")
+        self.addConnection("plant", "out_v0", output_port_name="velocity_out")
+
+class PowerWindowUp(CBD):
+    def __init__(self, blockName, delta_t = 0.01):
+        CBD.__init__(self,blockName, input_ports=[], output_ports=["out_w0","out_v0", "out_Fo100","out_Fo","out_total_force","out_friction_force"])
+        
+        self.addBlock(ConstantBlock("delta_t", value=delta_t))
+        self.addBlock(ConstantBlock("torque", value=2.0))
+        self.addBlock(ConstantBlock("1", value=1.0))
+        self.addBlock(ConstantBlock("0.4", value=0.4))
+        self.addBlock(ConstantBlock("force_threshold", value=-100))
+        
+        self.addBlock(InputConstantBlock("in_w0", value=0.0))
+        self.addBlock(InputConstantBlock("in_v0", value=0.0))
+        
+        self.addBlock(AdderBlock("compare_force"))
+        
+        self.addBlock(PowerWindowPlant("plant"))
+        
+        self.addConnection("delta_t", "plant", input_port_name="delta_t")
+        self.addConnection("torque", "plant", input_port_name="motor")
+        self.addConnection("1", "plant", input_port_name="object_detect")
+        self.addConnection("0.4", "plant", input_port_name="object_position")
+        self.addConnection("force_threshold", "compare_force")
+        
+        self.addConnection("in_w0", "plant", input_port_name="init_position")
+        self.addConnection("in_v0", "plant", input_port_name="init_velocity")
+        
+        self.addConnection("compare_force", "out_Fo100")
+        
+        self.addConnection("plant", "out_w0", output_port_name="position_out")
+        self.addConnection("plant", "out_v0", output_port_name="velocity_out")
+        self.addConnection("plant", "compare_force", output_port_name="force_out")
+        self.addConnection("plant", "out_Fo", output_port_name="force_out")
+        self.addConnection("plant", "out_total_force", output_port_name="total_force_out")
+        self.addConnection("plant", "out_friction_force", output_port_name="friction_force_out")
+        
+        
+class PowerWindowPlant(CBD):
+    def __init__(self, blockName, delta_t = 0.01):
+        CBD.__init__(self,blockName, input_ports=[
+                                    "object_detect",
+                                    "object_position",
+                                    "motor", 
+                                    "init_position",
+                                    "init_velocity",
+                                    "delta_t"
+                        ], output_ports=["position_out","velocity_out","force_out","total_force_out","friction_force_out"])
+        
+        # See power_window_object.pdf
+        
+        self.addBlock(ConstantBlock("m", value=10.0))
+        self.addBlock(ConstantBlock("cw",value=-10.0))
+        self.addBlock(ConstantBlock("zero",value=0.0))
+        self.addBlock(ConstantBlock("k0",value=1000.0))
+        self.addBlock(ConstantBlock("c0",value=-1000.0))
+        
+        self.addBlock(InverterBlock("invert_mass"))
+        
+        self.addBlock(NegatorBlock("position_object_neg"))
+        
+        self.addBlock(ProductBlock("cw_p"))
+        self.addBlock(ProductBlock("divide_m"))
+        self.addBlock(ProductBlock("c0_p"))
+        self.addBlock(ProductBlock("k0_p"))
+        self.addBlock(ProductBlock("object_detect_enable"))
+        
+        self.addBlock(AdderBlock("torque_friction"))
+        self.addBlock(AdderBlock("total_forces"))
+        self.addBlock(AdderBlock("object_compare"))
+        self.addBlock(AdderBlock("object_compression"))
+        self.addBlock(AdderBlock("object_displacement"))
+        
+        self.addBlock(IntegratorBlock("velocity"))
+        self.addBlock(IntegratorBlock("position"))
+        
+        self.addBlock(DecisionBlock("obj_detected"))
+        
+        self.addBlock(AbsBlock("abs"))
+        
+        self.addConnection("object_detect", "object_detect_enable")
+        self.addConnection("object_position", "position_object_neg")
+        self.addConnection("motor", "torque_friction")
+        self.addConnection("init_position", "position", input_port_name="IC")
+        self.addConnection("init_velocity", "velocity", input_port_name="IC")
+        self.addConnection("delta_t", "position", input_port_name="delta_t")
+        self.addConnection("delta_t", "velocity", input_port_name="delta_t")
+        
+        self.addConnection("m", "invert_mass")
+        self.addConnection("zero", "obj_detected", input_port_name="F")
+        
+        self.addConnection("invert_mass", "divide_m")
+        
+        self.addConnection("cw", "cw_p")
+        self.addConnection("k0", "k0_p")
+        self.addConnection("c0", "c0_p")
+        self.addConnection("position_object_neg", "object_compare")
+        self.addConnection("position_object_neg", "object_displacement")
+        
+        self.addConnection("cw_p", "torque_friction")
+        self.addConnection("divide_m", "velocity")
+        self.addConnection("c0_p", "object_compression")
+        self.addConnection("k0_p", "object_compression")
+        self.addConnection("object_detect_enable", "total_forces")
+        self.addConnection("object_detect_enable", "abs")
+        
+        self.addConnection("abs", "force_out")
+        
+        self.addConnection("torque_friction", "total_forces")
+        self.addConnection("torque_friction", "friction_force_out")
+        self.addConnection("total_forces", "divide_m")
+        self.addConnection("total_forces", "total_force_out")
+        self.addConnection("object_compare", "obj_detected", input_port_name="C")
+        self.addConnection("object_compression", "obj_detected", input_port_name="T")
+        self.addConnection("object_displacement", "k0_p")
+        
+        self.addConnection("velocity", "position")
+        self.addConnection("velocity", "cw_p")
+        self.addConnection("velocity", "c0_p")
+        self.addConnection("velocity", "velocity_out")
+        self.addConnection("position", "object_displacement")
+        self.addConnection("position", "position_out")
+        self.addConnection("position", "object_compare")
+        
+        self.addConnection("obj_detected", "object_detect_enable")
+        

+ 0 - 2
debugging_fsa_cbd_composition/fsa_cbd_simulator/events.csv

@@ -1,2 +0,0 @@
-fsatime,Event

-1.0,end


+ 3 - 3
debugging_fsa_cbd_composition/fsa_cbd_simulator/fsaclasses.py

@@ -101,7 +101,7 @@ class FSAModel:
     def getTransitionAfter(self, state, elapsed):
         for t in self.transitions:
             if t.source == state and isinstance(t.trigger,After):
-                if ExpressionVisitor(t.trigger.after).visit() <= elapsed:
+                if ExpressionVisitor(t.trigger.expression).visit() <= elapsed:
                     return t
         return None 
 
@@ -172,10 +172,10 @@ class Event(Trigger):
     
 class After(Trigger):
     def __init__(self, expression):
-        self.after = expression
+        self.expression = expression
     
     def __str__(self):
-        return "after("+ str(self.after) + ")"
+        return "after("+ str(self.expression) + ")"
     
 class Guard:
     def __init__(self, expression):

+ 14 - 0
debugging_fsa_cbd_composition/fsa_cbd_simulator/log.txt

@@ -0,0 +1,14 @@
+Traceback (most recent call last):
+  File "C:\Users\clagms\Source Control\Git_MLE\debugging_fsa_cbd_composition\fsa_cbd_simulator\run_debug.py", line 24, in <module>
+    controller = target.Controller(cbdmodel, events, options, keep_running=True)
+  File "C:\Users\clagms\Source Control\Git_MLE\debugging_fsa_cbd_composition\fsa_cbd_simulator\target.py", line 4715, in __init__
+    self.object_manager.createInstance("WovenSimulator_Coordinator", [woven_model, fsa_events, cbd_options])
+  File "C:\Users\clagms\Source Control\Git_SCCD\src\build\lib\sccd\runtime\statecharts_core.py", line 298, in createInstance
+    instance = self.instantiate(to_class, construct_params)
+  File "C:\Users\clagms\Source Control\Git_MLE\debugging_fsa_cbd_composition\fsa_cbd_simulator\target.py", line 4657, in instantiate
+    instance = WovenSimulator_Coordinator(self.controller, construct_params[0], construct_params[1], construct_params[2])
+  File "C:\Users\clagms\Source Control\Git_MLE\debugging_fsa_cbd_composition\fsa_cbd_simulator\target.py", line 41, in __init__
+    self.build_statechart_structure()
+  File "C:\Users\clagms\Source Control\Git_MLE\debugging_fsa_cbd_composition\fsa_cbd_simulator\target.py", line 60, in build_statechart_structure
+    self.states[""] = State(0, "", self)
+TypeError: __init__() takes exactly 3 arguments (4 given)

+ 1 - 1
debugging_fsa_cbd_composition/fsa_cbd_simulator/models/power_window.mo

@@ -6,7 +6,7 @@ model power_window
   parameter Real stiffness_o = 1000;
   parameter Real friction_o = 1000;
   // Set 1.0 to enable object force.
-  parameter Real enable_o = 1.0;
+  parameter Real enable_o = 0.0;
   Real height_w(start = 0);
   Real velocity_w(start = 0);
   Real force_o;

+ 50 - 51
debugging_fsa_cbd_composition/fsa_cbd_simulator/models/power_window.py

@@ -1,5 +1,6 @@
 from CBDMultipleOutput.Source.CBD import ConstantBlock, NegatorBlock, \
-    IntegratorBlock, CBD, ProductBlock, AdderBlock, InverterBlock, DecisionBlock
+    IntegratorBlock, CBD, ProductBlock, AdderBlock, InverterBlock, DecisionBlock, \
+    GenericBlock, AbsBlock
 from fsa_cbd_woven_classes import InputConstantBlock, CBDState, WhenCrossesZeroTrigger
 from fsaclasses import FSAModel, Transition, Event, State, After, Float
 
@@ -13,7 +14,7 @@ class PowerWindow(FSAModel):
         Pass_Down = CBDState("Pass_Down", PowerWindowDown("Pass_Down"))
         Driver_Down = CBDState("Driver_Down", PowerWindowDown("Driver_Down"))
         Obj_Detected = CBDState("Obj_Detected", PowerWindowDown("Obj_Detected"))
-        End = State("Obj_Detected", final=True)
+        End = State("End", final=True)
         
         start = Transition("start", Started, Neutral)
         
@@ -28,7 +29,6 @@ class PowerWindow(FSAModel):
         end_Neutral = Transition("end", Neutral, End)
         end_Neutral.trigger = Event("end");
         
-        
         stop_Pass_up = Transition("stop", Pass_Up, Neutral)
         stop_Pass_up.trigger = Event("stop");
         d_down_Pass_up = Transition("d_down", Pass_Up, Driver_Down)
@@ -54,7 +54,7 @@ class PowerWindow(FSAModel):
         stop_Driver_Down.trigger = Event("stop");
         
         stop_Obj_Detected = Transition("after", Obj_Detected, Neutral)
-        stop_Obj_Detected.trigger = After(Float(1000.0)); # ms
+        stop_Obj_Detected.trigger = After(Float(10.0)); # s
         
         self.states = [
                        Started,
@@ -93,7 +93,7 @@ class PowerWindowStarted(CBD):
     def __init__(self, blockName, delta_t = 0.01):
         CBD.__init__(self,blockName, input_ports=[], output_ports=["out_w0","out_v0"])
         
-        self.addBlock(ConstantBlock("0", value=delta_t))
+        self.addBlock(ConstantBlock("0", value=0.0))
         
         self.addConnection("0", "out_w0")
         self.addConnection("0", "out_v0")
@@ -125,7 +125,7 @@ class PowerWindowDown(CBD):
 
 class PowerWindowUp(CBD):
     def __init__(self, blockName, delta_t = 0.01):
-        CBD.__init__(self,blockName, input_ports=[], output_ports=["out_w0","out_v0", "out_Fo100"])
+        CBD.__init__(self,blockName, input_ports=[], output_ports=["out_w0","out_v0", "out_Fo100","out_Fo","out_total_force","out_friction_force"])
         
         self.addBlock(ConstantBlock("delta_t", value=delta_t))
         self.addBlock(ConstantBlock("torque", value=2.0))
@@ -140,7 +140,6 @@ class PowerWindowUp(CBD):
         
         self.addBlock(PowerWindowPlant("plant"))
         
-        
         self.addConnection("delta_t", "plant", input_port_name="delta_t")
         self.addConnection("torque", "plant", input_port_name="motor")
         self.addConnection("1", "plant", input_port_name="object_detect")
@@ -155,7 +154,9 @@ class PowerWindowUp(CBD):
         self.addConnection("plant", "out_w0", output_port_name="position_out")
         self.addConnection("plant", "out_v0", output_port_name="velocity_out")
         self.addConnection("plant", "compare_force", output_port_name="force_out")
-        
+        self.addConnection("plant", "out_Fo", output_port_name="force_out")
+        self.addConnection("plant", "out_total_force", output_port_name="total_force_out")
+        self.addConnection("plant", "out_friction_force", output_port_name="friction_force_out")
         
         
 class PowerWindowPlant(CBD):
@@ -167,84 +168,82 @@ class PowerWindowPlant(CBD):
                                     "init_position",
                                     "init_velocity",
                                     "delta_t"
-                        ], output_ports=["position_out","velocity_out","force_out"])
+                        ], output_ports=["position_out","velocity_out","force_out","total_force_out","friction_force_out"])
         
         # See power_window_object.pdf
         
         self.addBlock(ConstantBlock("m", value=10.0))
-        self.addBlock(ConstantBlock("cw",value=10.0))
-        self.addBlock(ConstantBlock("0",value=0.0))
+        self.addBlock(ConstantBlock("cw",value=-10.0))
+        self.addBlock(ConstantBlock("zero",value=0.0))
         self.addBlock(ConstantBlock("k0",value=1000.0))
-        self.addBlock(ConstantBlock("c0",value=1000.0))
+        self.addBlock(ConstantBlock("c0",value=-1000.0))
         
-        self.addBlock(InverterBlock("1/m"))
+        self.addBlock(InverterBlock("invert_mass"))
         
-        self.addBlock(NegatorBlock("-cw"))
-        self.addBlock(NegatorBlock("-k0"))
-        self.addBlock(NegatorBlock("-c0"))
-        self.addBlock(NegatorBlock("-position"))
+        self.addBlock(NegatorBlock("position_object_neg"))
         
-        self.addBlock(ProductBlock("-cw_p"))
-        self.addBlock(ProductBlock("1/m_p"))
-        self.addBlock(ProductBlock("-c0_p"))
-        self.addBlock(ProductBlock("-k0_p"))
+        self.addBlock(ProductBlock("cw_p"))
+        self.addBlock(ProductBlock("divide_m"))
+        self.addBlock(ProductBlock("c0_p"))
+        self.addBlock(ProductBlock("k0_p"))
         self.addBlock(ProductBlock("object_detect_enable"))
         
-        self.addBlock(AdderBlock("acceleration"))
-        self.addBlock(AdderBlock("objectF+acceleration"))
+        self.addBlock(AdderBlock("torque_friction"))
+        self.addBlock(AdderBlock("total_forces"))
         self.addBlock(AdderBlock("object_compare"))
         self.addBlock(AdderBlock("object_compression"))
+        self.addBlock(AdderBlock("object_displacement"))
         
         self.addBlock(IntegratorBlock("velocity"))
         self.addBlock(IntegratorBlock("position"))
         
         self.addBlock(DecisionBlock("obj_detected"))
         
+        self.addBlock(AbsBlock("abs"))
         
         self.addConnection("object_detect", "object_detect_enable")
-        self.addConnection("object_position", "object_compare")
-        self.addConnection("motor", "1/m_p")
+        self.addConnection("object_position", "position_object_neg")
+        self.addConnection("motor", "torque_friction")
         self.addConnection("init_position", "position", input_port_name="IC")
         self.addConnection("init_velocity", "velocity", input_port_name="IC")
         self.addConnection("delta_t", "position", input_port_name="delta_t")
         self.addConnection("delta_t", "velocity", input_port_name="delta_t")
         
-        self.addConnection("m", "1/m")
-        self.addConnection("cw", "-cw")
-        self.addConnection("0", "obj_detected", input_port_name="F")
-        self.addConnection("k0", "-k0")
-        self.addConnection("c0", "-c0")
+        self.addConnection("m", "invert_mass")
+        self.addConnection("zero", "obj_detected", input_port_name="F")
+        
+        self.addConnection("invert_mass", "divide_m")
         
-        self.addConnection("1/m", "1/m_p")
+        self.addConnection("cw", "cw_p")
+        self.addConnection("k0", "k0_p")
+        self.addConnection("c0", "c0_p")
+        self.addConnection("position_object_neg", "object_compare")
+        self.addConnection("position_object_neg", "object_displacement")
         
-        self.addConnection("-cw", "-cw_p")
-        self.addConnection("-k0", "-k0_p")
-        self.addConnection("-c0", "-c0_p")
-        self.addConnection("-position", "object_compare")
+        self.addConnection("cw_p", "torque_friction")
+        self.addConnection("divide_m", "velocity")
+        self.addConnection("c0_p", "object_compression")
+        self.addConnection("k0_p", "object_compression")
+        self.addConnection("object_detect_enable", "total_forces")
+        self.addConnection("object_detect_enable", "abs")
         
-        self.addConnection("-cw_p", "acceleration")
-        self.addConnection("1/m_p", "acceleration")
-        self.addConnection("-c0_p", "object_compression")
-        self.addConnection("-k0_p", "object_compression")
-        self.addConnection("object_detect_enable", "objectF+acceleration")
-        self.addConnection("object_detect_enable", "force_out")
+        self.addConnection("abs", "force_out")
         
-        self.addConnection("acceleration", "objectF+acceleration")
-        self.addConnection("objectF+acceleration", "velocity")
+        self.addConnection("torque_friction", "total_forces")
+        self.addConnection("torque_friction", "friction_force_out")
+        self.addConnection("total_forces", "divide_m")
+        self.addConnection("total_forces", "total_force_out")
         self.addConnection("object_compare", "obj_detected", input_port_name="C")
         self.addConnection("object_compression", "obj_detected", input_port_name="T")
+        self.addConnection("object_displacement", "k0_p")
         
         self.addConnection("velocity", "position")
-        self.addConnection("velocity", "-cw_p")
-        self.addConnection("velocity", "-c0_p")
+        self.addConnection("velocity", "cw_p")
+        self.addConnection("velocity", "c0_p")
         self.addConnection("velocity", "velocity_out")
-        self.addConnection("position", "-k0_p")
+        self.addConnection("position", "object_displacement")
         self.addConnection("position", "position_out")
-        self.addConnection("position", "-position")
+        self.addConnection("position", "object_compare")
         
         self.addConnection("obj_detected", "object_detect_enable")
         
-        
-        
-        
-        

TEMPAT SAMPAH
debugging_fsa_cbd_composition/fsa_cbd_simulator/models/power_window_hybrid_model.pdf


+ 30 - 24
debugging_fsa_cbd_composition/fsa_cbd_simulator/models/power_window_hybrid_model.svg

@@ -5647,9 +5647,9 @@
      borderopacity="1.0"
      inkscape:pageopacity="0.0"
      inkscape:pageshadow="2"
-     inkscape:zoom="2.8284273"
-     inkscape:cx="383.05565"
-     inkscape:cy="522.09708"
+     inkscape:zoom="5.6568546"
+     inkscape:cx="285.97905"
+     inkscape:cy="320.72742"
      inkscape:document-units="px"
      inkscape:current-layer="layer1"
      showgrid="false"
@@ -6438,16 +6438,16 @@
          style="font-size:11.25px;text-align:center;text-anchor:middle;">d_down</tspan></text>
     <rect
        y="697.17169"
-       x="257.87851"
+       x="297.87851"
        height="31.100998"
        width="23.012665"
        id="rect4791"
        style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
     <path
-       sodipodi:nodetypes="cc"
+       sodipodi:nodetypes="cccc"
        inkscape:connector-curvature="0"
        id="path5451"
-       d="m 269.65069,728.01513 0,31.41228"
+       d="m 309.65069,728.04638 0,7.59709 m 0,7.03125 0,16.75269"
        style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker9041)" />
     <rect
        y="761.59729"
@@ -6458,7 +6458,7 @@
        style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
     <path
        style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker12489)"
-       d="m 235.39403,712.89896 21.13716,0"
+       d="m 275.39403,712.89896 21.13716,0"
        id="path4832"
        inkscape:connector-curvature="0"
        sodipodi:nodetypes="cc" />
@@ -6467,11 +6467,11 @@
        id="rect4834"
        width="23.012665"
        height="31.100998"
-       x="211.87851"
+       x="251.87851"
        y="697.17169" />
     <g
        id="surface1-0"
-       transform="matrix(1.25,0,0,1.25,211.2957,703.1827)">
+       transform="matrix(1.25,0,0,1.25,251.2957,703.1827)">
       <g
          id="g4846"
          style="fill:#000000;fill-opacity:1">
@@ -6486,7 +6486,7 @@
     </g>
     <g
        id="surface1-4"
-       transform="matrix(1.25,0,0,1.25,253.39262,699.65529)">
+       transform="matrix(1.25,0,0,1.25,293.39262,699.65529)">
       <g
          id="g4876"
          style="fill:#000000;fill-opacity:1">
@@ -6519,7 +6519,7 @@
     </g>
     <g
        id="surface1-1"
-       transform="matrix(1.25,0,0,1.25,260.40334,767.45657)">
+       transform="matrix(1.25,0,0,1.25,300.52077,767.45657)">
       <g
          id="g4913"
          style="fill:#000000;fill-opacity:1">
@@ -6625,7 +6625,7 @@
        y="761.59729" />
     <g
        id="surface1-2"
-       transform="matrix(1.25,0,0,1.25,299.14926,766.19508)">
+       transform="matrix(1.25,0,0,1.25,259.14926,766.19508)">
       <g
          id="g5681"
          style="fill:#000000;fill-opacity:1">
@@ -6643,24 +6643,24 @@
        id="rect5875"
        width="23.012665"
        height="31.100998"
-       x="331.87851"
-       y="697.17169" />
+       x="361.87851"
+       y="677.17169" />
     <path
        sodipodi:nodetypes="cc"
        inkscape:connector-curvature="0"
        id="path5877"
-       d="m 309.39403,712.89896 21.13716,0"
+       d="m 349.64403,692.89896 10.88716,0"
        style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker12499)" />
     <rect
-       y="697.17169"
-       x="285.87851"
+       y="677.17169"
+       x="326.87851"
        height="31.100998"
        width="23.012665"
        id="rect5879"
        style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
     <g
        id="surface1-5"
-       transform="matrix(1.25,0,0,1.25,284.17523,702.77825)">
+       transform="matrix(1.25,0,0,1.25,325.17523,682.77825)">
       <g
          id="g5947"
          style="fill:#000000;fill-opacity:1">
@@ -6686,7 +6686,7 @@
     </g>
     <g
        id="surface1-26"
-       transform="matrix(1.25,0,0,1.25,328.30687,703.6827)">
+       transform="matrix(1.25,0,0,1.25,358.30687,683.6827)">
       <g
          id="g6256"
          style="fill:#000000;fill-opacity:1">
@@ -6720,11 +6720,11 @@
        sodipodi:nodetypes="ccc"
        inkscape:connector-curvature="0"
        id="path6452"
-       d="m 354.5238,712.95096 34.32722,-0.0304 0.0268,9.23957"
+       d="m 384.5238,692.95096 4.30641,-0.0304 0.0268,29.74567"
        style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker12479)" />
     <path
        style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker12519)"
-       d="m 376.86103,738.89025 -66.82722,-0.0304 -0.0268,20.73652"
+       d="m 376.86103,738.89025 -107.48586,-0.0304 -0.0268,20.73652"
        id="path7280"
        inkscape:connector-curvature="0"
        sodipodi:nodetypes="ccc" />
@@ -6797,10 +6797,10 @@
        d="m 350.08345,264.286 -23.40288,13.41934 0.0799,-26.97716 z"
        inkscape:transform-center-x="-1.5227628"
        inkscape:transform-center-y="0.30791916"
-       transform="matrix(0,1,-1,0,696.7601,366.07164)" />
+       transform="matrix(0,1,-1,0,696.7601,351.04562)" />
     <path
        style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker16063)"
-       d="m 432.4869,715.81664 0,43.27625"
+       d="m 432.4869,700.9674 0,58.12549"
        id="path16061"
        inkscape:connector-curvature="0"
        sodipodi:nodetypes="cc" />
@@ -6906,7 +6906,7 @@
     </g>
     <g
        id="surface1-53"
-       transform="matrix(1.25,0,0,1.25,419.0863,689.09824)">
+       transform="matrix(1.25,0,0,1.25,419.0863,674.07222)">
       <g
          id="g6740"
          style="fill:#000000;fill-opacity:1">
@@ -8016,5 +8016,11 @@
        id="path6461"
        d="m 266.73808,548.10373 c -1.199,-0.35955 -2.11508,-1.33147 -2.40318,-2.54961 -0.28815,-1.21811 0.0956,-2.49743 1.00643,-3.35601 0.91089,-0.85857 2.21063,-1.16598 3.40962,-0.80643"
        style="opacity:0.98699999;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <path
+       style="opacity:0.98699999;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       d="m 309.65555,742.64851 c -1.25173,-0.007 -2.40463,-0.68126 -3.02442,-1.76879 -0.61984,-1.08749 -0.61228,-2.4231 0.0196,-3.50362 0.63193,-1.08052 1.79231,-1.74184 3.04402,-1.73485"
+       id="path8107"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cssc" />
   </g>
 </svg>

TEMPAT SAMPAH
debugging_fsa_cbd_composition/fsa_cbd_simulator/models/power_window_object.pdf


File diff ditekan karena terlalu besar
+ 7074 - 1282
debugging_fsa_cbd_composition/fsa_cbd_simulator/models/power_window_object.svg


+ 3 - 4
debugging_fsa_cbd_composition/fsa_cbd_simulator/run_debug.py

@@ -9,7 +9,6 @@ from models.power_window import PowerWindow
 import target
 from woven_cbd_fsa_lib import FSACBDLib
 
-
 CBD_DELTA = 0.01
 
 if __name__ == '__main__':    
@@ -17,12 +16,12 @@ if __name__ == '__main__':
         os.remove(FSACBDLib.OUTPUT_EVENTS)
     if os.path.exists(FSACBDLib.OUTPUT_SIGNALS):
         os.remove(FSACBDLib.OUTPUT_SIGNALS)
-        
+    
     options = Options(delta = CBD_DELTA)
     options.setMaxIterations(10000);
     cbdmodel = PowerWindow()
-    events = fsaclasses.Events([fsaclasses.RunTimeEvent("end",1.0)])
-    controller = target.Controller(options, cbdmodel, events, keep_running=True)
+    events = fsaclasses.Events([fsaclasses.RunTimeEvent("p_up",1.0),fsaclasses.RunTimeEvent("end",8.0)]) # , 
+    controller = target.Controller(cbdmodel, events, options, keep_running=True)
     
     def set_defaults(inp, defaultlist):
         for i, v in enumerate(defaultlist):

+ 0 - 4
debugging_fsa_cbd_composition/fsa_cbd_simulator/signals.csv

@@ -1,4 +0,0 @@
-current_cbdtime,v0,fsastate,fsatime,Fo100,w0

-0.0,0.01,Started,0.0,,0.01

--1.0,0.01,Neutral,0.0,,0.01

--1.0,0.01,Obj_Detected,1.0,,0.01


File diff ditekan karena terlalu besar
+ 4364 - 951
debugging_fsa_cbd_composition/fsa_cbd_simulator/target.py