powerwindow_controller_delay_BASE.sa 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import PowerWindowModel
  2. module Controller_SA
  3. semantic adaptation ControllerSA controller_sa
  4. at "./path/to/ControllerSA.fmu"
  5. for fmu controller
  6. input ports armature_current -> obj_detected, passenger_up, passenger_down, driver_up, driver_down
  7. output ports up, down
  8. param REL_TOL := 0.0001;
  9. param ABS_TOL := 1e-8;
  10. param CROSSING := 5;
  11. param init_armature_current := CROSSING;
  12. param init_up := 0;
  13. param init_down := 0;
  14. control { // overwriting master! What to do in case of roll back? How to reuse generic algorithm
  15. var step_size; // may be used to determine roll-back
  16. if (signal == true or t >= internal_transition) {
  17. step_size := do_step(controller, e+H); // do a step, then decide next internal transition
  18. }
  19. return step_size;
  20. }
  21. in var stored_armature_current := init_armature_current;
  22. in var internal_transition;
  23. in rules {
  24. not is_set(internal_transition) -> { internal_transition := get_next_time_step(controller) + t; } --> { };
  25. true -> {
  26. obj_detected := false;
  27. if (not (not is_close(stored_armature_current, CROSSING, REL_TOL, ABS_TOL) and stored_armature_current > CROSSING)
  28. and (not is_close(armature_current, CROSSING, REL_TOL, ABS_TOL) and armature_current > CROSSING)) { // crossing, but not within tolerance
  29. var negative_value := stored_armature_current - CROSSING;
  30. var positive_value := armature_current - CROSSING;
  31. var new_step_size := (H * (- negative_value)) / (positive_value - negative_value);
  32. discard(new_step_size);
  33. } else {
  34. if (not (not is_close(stored_armature_current, CROSSING, REL_TOL, ABS_TOL) and stored_armature_current > CROSSING)
  35. and is_close(armature_current, CROSSING, REL_TOL, ABS_TOL)) { // crossing within tolerance found
  36. obj_detected := true;
  37. }
  38. }
  39. stored_armature_current := armature_current;
  40. } --> { };
  41. }
  42. out var stored_up := init_up;
  43. out var stored_down := init_down;
  44. out rules {
  45. true -> { internal_transition := get_next_time_step(controller) + t; } --> {};
  46. up == true -> { up := 1; } --> { };
  47. up == false -> { } --> { };
  48. down == true -> { down := 1; } --> { };
  49. down == false -> { } --> { };
  50. stop == true -> { up := 0; down := 0; } --> { };
  51. stop == false -> { } --> { };
  52. true -> { up := stored_up; stored_up := up; } --> { };
  53. true -> { down := stored_down; stored_down := down; } --> { };
  54. }
  55. // other suggestion for implementing get_next_time_step, making it easier to generate baseDSL code
  56. /*control { // overwriting master! What to do in case of roll back? How to reuse generic algorithm
  57. var step_size; // may be used to determine roll-back
  58. if (signal == true or t >= internal_transition) {
  59. step_size := do_step(controller, e+H); // do a step, then decide next internal transition
  60. }
  61. return step_size;
  62. }
  63. in var internal_transition;
  64. in rules {
  65. not is_set(internal_transition) -> {
  66. if (not is_set(internal_transition)) {
  67. internal_transition := get_next_step(controller) + t;
  68. }
  69. } --> { internal_transition := get_next_step(controller) + t; };
  70. }*/