powerwindow_controller_delay_BASE.sa 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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 var internal_transition;
  14. control rules { // overwriting master! What to do in case of roll back? How to reuse generic algorithm
  15. if (not is_set(internal_transition)) { // only at start of simulation
  16. var state := get_state(controller);
  17. internal_transition := do_step(controller, MAX) + t; // may return internal transition time or MAX
  18. set_state(controller, state);
  19. }
  20. var step_size; // may be used to determine roll-back
  21. if (signal == true or t >= internal_transition) {
  22. step_size := do_step(controller, H); // do a step, then decide next internal transition
  23. var state := get_state(controller);
  24. internal_transition := do_step(controller, MAX) + t;
  25. set_state(controller, state);
  26. }
  27. return step_size;
  28. }
  29. in var stored_armature_current := init_armature_current;
  30. in rules {
  31. true -> {
  32. obj_detected := false;
  33. if (not (not is_close(stored_armature_current, CROSSING, REL_TOL, ABS_TOL) and stored_armature_current > CROSSING)
  34. and (not is_close(armature_current, CROSSING, REL_TOL, ABS_TOL) and armature_current > CROSSING)) { // crossing, but not within tolerance
  35. var negative_value := stored_armature_current - CROSSING;
  36. var positive_value := armature_current - CROSSING;
  37. var new_step_size := (H * (- negative_value)) / (positive_value - negative_value);
  38. discard(new_step_size);
  39. } else {
  40. if (not (not is_close(stored_armature_current, CROSSING, REL_TOL, ABS_TOL) and stored_armature_current > CROSSING)
  41. and is_close(armature_current, CROSSING, REL_TOL, ABS_TOL)) { // crossing within tolerance found
  42. obj_detected := true;
  43. }
  44. }
  45. stored_armature_current := armature_current;
  46. } --> { };
  47. }
  48. out var stored_up := init_up;
  49. out var stored_down := init_down;
  50. out rules {
  51. up == true -> { up := 1; } --> { };
  52. otherwise up -> { } --> { };
  53. down == true -> { down := 1; } --> { };
  54. otherwise down -> { } --> { };
  55. stop == true -> { up := 0; down := 0; } --> { };
  56. otherwise stop -> { } --> { };
  57. true -> { up := stored_up; stored_up := up; } --> { };
  58. true -> { down := stored_down; stored_down := down; } --> { };
  59. }