powerwindow_controller_delay_BASE.sa 2.9 KB

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