model_02_hierarchical_door.xml 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. <single_instance_cd>
  2. <!-- Safety feature extension through hierarchical state: microwave can't be running while door is open -->
  3. <delta>1 ms</delta>
  4. <statechart>
  5. <semantics
  6. big_step_maximality="take_many"
  7. combo_step_maximality="take_one"
  8. input_event_lifeline="first_combo_step"
  9. hierarchical_priority="source_parent"
  10. orthogonal_priority="explicit"
  11. same_source_priority="explicit"
  12. />
  13. <datamodel>
  14. time = 0;
  15. checkStartTime = func {
  16. if (time == 0) time = 30;
  17. };
  18. </datamodel>
  19. <inport name="in">
  20. <event name="start"/>
  21. <event name="stop"/>
  22. <event name="increase_time"/>
  23. <event name="door_opened"/>
  24. <event name="door_closed"/>
  25. </inport>
  26. <outport name="out">
  27. <event name="micro_on"/>
  28. <event name="micro_off"/>
  29. <event name="set_time"/>
  30. <event name="ping"/>
  31. </outport>
  32. <root initial="DoorClosed">
  33. <state id="DoorClosed" initial="NotRunning">
  34. <transition port="in" event="door_opened" target="../DoorOpen"/>
  35. <state id="Running">
  36. <onentry> <raise port="out" event="micro_on"/> </onentry>
  37. <onexit> <raise port="out" event="micro_off"/> </onexit>
  38. <transition port="in" event="stop" target="../NotRunning"/>
  39. <transition after="1 s" target=".">
  40. <code> time -= 1; </code>
  41. <raise port="out" event="set_time">
  42. <param expr="time"/>
  43. </raise>
  44. </transition>
  45. <transition cond="time == 0" target="../NotRunning"/>
  46. <transition port="in" event="increase_time" target=".">
  47. <code> time += 10; </code>
  48. <raise port="out" event="set_time">
  49. <param expr="time"/>
  50. </raise>
  51. </transition>
  52. </state>
  53. <state id="NotRunning">
  54. <transition port="in" event="start" target="../Running">
  55. <code> checkStartTime(); </code>
  56. <raise port="out" event="set_time">
  57. <param expr="time"/>
  58. </raise>
  59. </transition>
  60. <transition port="in" event="stop" target=".">
  61. <code> time = 0; </code>
  62. <raise port="out" event="set_time">
  63. <param expr="time"/>
  64. </raise>
  65. </transition>
  66. <transition port="in" event="increase_time" target=".">
  67. <code> time += 10; </code>
  68. <raise port="out" event="set_time">
  69. <param expr="time"/>
  70. </raise>
  71. </transition>
  72. </state>
  73. </state>
  74. <state id="DoorOpen">
  75. <transition port="in" event="door_closed" target="../DoorClosed"/>
  76. <transition port="in" event="increase_time" target=".">
  77. <code> time += 10; </code>
  78. <raise port="out" event="set_time">
  79. <param expr="time"/>
  80. </raise>
  81. </transition>
  82. </state>
  83. </root>
  84. </statechart>
  85. </single_instance_cd>