controller_sa_canonical.BASE.sa 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import PowerWindowModel
  2. module Controller_SA
  3. semantic adaptation mealy reactive controller_sa
  4. for fmu controller
  5. input ports armature_current,
  6. passenger_up,
  7. passenger_down,
  8. passenger_stop,
  9. driver_up,
  10. driver_down,
  11. driver_stop;
  12. output ports u,
  13. d;
  14. param REL_TOL = 0.0001;
  15. param ABS_TOL = 1e-8;
  16. param CROSSING = 5;
  17. param init_armature_current = CROSSING;
  18. param init_up = 0;
  19. param init_down = 0;
  20. in var previous_arm_current := init_armature_current;
  21. in var stored_arm_current := init_armature_current;
  22. in var stored_displacement := init_displacement;
  23. in var stored_speed := init_speed;
  24. in var next_time_step := -1;
  25. in var step_size;
  26. in var aux_obj_detected := 0;
  27. in rules {
  28. next_time_step < 0 -> {
  29. next_time_step := get_next_time_step(controller) + t;
  30. } --> { };
  31. true -> {
  32. stored_arm_current := armature_current
  33. } --> {
  34. obj_detected := aux_obj_detected; // Sets this input to the FMU
  35. };
  36. }
  37. control rules {
  38. aux_obj_detected := false;
  39. step_size := H;
  40. if ((not is_close(previous_arm_current, CROSSING, REL_TOL, ABS_TOL) and previous_arm_current < CROSSING)
  41. and (not is_close(stored_arm_current, CROSSING, REL_TOL, ABS_TOL) and stored_arm_current > CROSSING)) { // crossing, but not within tolerance
  42. var negative_value := previous_arm_current - CROSSING;
  43. var positive_value := stored_arm_current - CROSSING;
  44. step_size := (H * (- negative_value)) / (positive_value - negative_value);
  45. } else {
  46. if ((not is_close(previous_arm_current, CROSSING, REL_TOL, ABS_TOL) and previous_arm_current < CROSSING)
  47. and is_close(stored_arm_current, CROSSING, REL_TOL, ABS_TOL )) { // crossing within tolerance found
  48. aux_obj_detected := true;
  49. }
  50. }
  51. if (obj_detected == true or t >= next_time_step) {
  52. var aux_h = do_step(controller, t-e, e);
  53. assert aux_h == e;
  54. next_time_step := -1;
  55. }
  56. if is_close(step_size, H, REL_TOL, ABS_TOL) {
  57. previous_arm_current := stored_arm_current;
  58. }
  59. return step_size;
  60. }
  61. out var stored_up := init_up;
  62. out var stored_down := init_down;
  63. out rules {
  64. controller.up -> {stored_up := 1} --> {u := stored_up};
  65. not controller.up -> {stored_up := 0} --> {u := stored_up};
  66. controller.down -> {stored_down := 1} --> {d := stored_down};
  67. not controller.down -> {stored_down := 0} --> {d := stored_down};
  68. controller.stop -> {stored_down := 0; stored_up :=0 } --> {u := stored_up ; d := stored_down};
  69. }