test.c 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. /*
  2. ============================================================================
  3. Name : pw_case.c
  4. Author : Joachim Denil
  5. Version :
  6. Copyright : Your copyright notice
  7. ============================================================================
  8. */
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include "fmi2.h"
  12. #include "sim_support.h"
  13. #define _out_object 0
  14. #define _out_driver_up 1
  15. #define _out_driver_up_stop 2
  16. #define _out_driver_down 3
  17. #define _out_driver_down_stop 4
  18. #define _out_passenger_up 5
  19. #define _out_passenger_up_stop 6
  20. #define _out_passenger_down 7
  21. #define _out_passenger_down_stop 8
  22. #define START_TIME 0.0
  23. #define STOP_TIME 9.0
  24. #define STEP_SIZE 0.01
  25. FMU fmu_control;
  26. int main(void) {
  27. puts("Loading Dlls\n");
  28. /* loading */
  29. loadDll("libFMI_controller.dll", &fmu_control, "PW_Controller");
  30. puts("instantiating fmus\n");
  31. fmi2Component c_control;
  32. char *fmuResourceLocation_control = "libFMI_controller.dll";
  33. fmi2CallbackFunctions callbacks_control = {fmuLogger, calloc, free, NULL, &fmu_control};
  34. c_control = fmu_control.instantiate("control", fmi2CoSimulation, "1", fmuResourceLocation_control, &callbacks_control, fmi2False, fmi2False);
  35. fmi2Boolean toleranceDefined = fmi2False; // true if model description define tolerance
  36. fmi2Real tolerance = 0; // used in setting up the experiment
  37. puts("FMU components instantiated, setting up experiments\n");
  38. fmi2Status fmi2Flag;
  39. fmi2Flag = fmu_control.setupExperiment(c_control, toleranceDefined, tolerance, START_TIME, fmi2True, STOP_TIME);
  40. if (fmi2Flag == fmi2Error){
  41. return -1;
  42. }
  43. puts("Experiment setup, entering init mode\n");
  44. fmi2Flag = fmu_control.enterInitializationMode(c_control);
  45. if (fmi2Flag == fmi2Error){
  46. return -1;
  47. }
  48. puts("Experiment setup, exiting init mode\n");
  49. fmi2Flag = fmu_control.exitInitializationMode(c_control);
  50. if (fmi2Flag == fmi2Error){
  51. return -1;
  52. }
  53. fmi2ValueReference vr_in_control_sa_from_env[9]={
  54. _out_object,
  55. _out_driver_up,
  56. _out_driver_up_stop,
  57. _out_driver_down,
  58. _out_driver_down_stop,
  59. _out_passenger_up,
  60. _out_passenger_up_stop,
  61. _out_passenger_down,
  62. _out_passenger_down_stop
  63. };
  64. fmi2Boolean b_out_env[9];
  65. fmi2ValueReference vr_out_control_sa[2]={9,10}; // Up, Down
  66. fmi2Boolean b_out_control_sa[2];
  67. double currentTime = START_TIME;
  68. while(currentTime <= STOP_TIME){
  69. printf("\n----master new loop, ct:%f, h:%f\n",currentTime,STEP_SIZE);
  70. if(currentTime < 0.01){
  71. b_out_env[_out_object] = 0;
  72. b_out_env[_out_driver_up] = 0;
  73. b_out_env[_out_driver_up_stop] = 0;
  74. b_out_env[_out_driver_down] = 0;
  75. b_out_env[_out_driver_down_stop] = 0;
  76. b_out_env[_out_passenger_up] = 0;
  77. b_out_env[_out_passenger_up_stop] = 0;
  78. b_out_env[_out_passenger_down] = 0;
  79. b_out_env[_out_passenger_down_stop] = 0;
  80. }else if(currentTime < 4.59){
  81. b_out_env[_out_object] = 0;
  82. b_out_env[_out_driver_up] = 1;
  83. b_out_env[_out_driver_up_stop] = 0;
  84. b_out_env[_out_driver_down] = 0;
  85. b_out_env[_out_driver_down_stop] = 0;
  86. b_out_env[_out_passenger_up] = 0;
  87. b_out_env[_out_passenger_up_stop] = 0;
  88. b_out_env[_out_passenger_down] = 0;
  89. b_out_env[_out_passenger_down_stop] = 0;
  90. }else if(currentTime < 5){
  91. b_out_env[_out_object] = 1;
  92. b_out_env[_out_driver_up] = 0;
  93. b_out_env[_out_driver_up_stop] = 0;
  94. b_out_env[_out_driver_down] = 0;
  95. b_out_env[_out_driver_down_stop] = 0;
  96. b_out_env[_out_passenger_up] = 0;
  97. b_out_env[_out_passenger_up_stop] = 0;
  98. b_out_env[_out_passenger_down] = 0;
  99. b_out_env[_out_passenger_down_stop] = 0;
  100. }else if(currentTime < 5.01){
  101. b_out_env[_out_object] = 0;
  102. b_out_env[_out_driver_up] = 0;
  103. b_out_env[_out_driver_up_stop] = 0;
  104. b_out_env[_out_driver_down] = 0;
  105. b_out_env[_out_driver_down_stop] = 0;
  106. b_out_env[_out_passenger_up] = 0;
  107. b_out_env[_out_passenger_up_stop] = 0;
  108. b_out_env[_out_passenger_down] = 0;
  109. b_out_env[_out_passenger_down_stop] = 0;
  110. }else if(currentTime < 6.7){
  111. b_out_env[_out_object] = 0;
  112. b_out_env[_out_driver_up] = 1;
  113. b_out_env[_out_driver_up_stop] = 0;
  114. b_out_env[_out_driver_down] = 0;
  115. b_out_env[_out_driver_down_stop] = 0;
  116. b_out_env[_out_passenger_up] = 0;
  117. b_out_env[_out_passenger_up_stop] = 0;
  118. b_out_env[_out_passenger_down] = 0;
  119. b_out_env[_out_passenger_down_stop] = 0;
  120. }else if(currentTime < 7.1){
  121. b_out_env[_out_object] = 0;
  122. b_out_env[_out_driver_up] = 0;
  123. b_out_env[_out_driver_up_stop] = 1;
  124. b_out_env[_out_driver_down] = 0;
  125. b_out_env[_out_driver_down_stop] = 0;
  126. b_out_env[_out_passenger_up] = 0;
  127. b_out_env[_out_passenger_up_stop] = 0;
  128. b_out_env[_out_passenger_down] = 0;
  129. b_out_env[_out_passenger_down_stop] = 0;
  130. }else {
  131. b_out_env[_out_object] = 0;
  132. b_out_env[_out_driver_up] = 0;
  133. b_out_env[_out_driver_up_stop] = 0;
  134. b_out_env[_out_driver_down] = 0;
  135. b_out_env[_out_driver_down_stop] = 0;
  136. b_out_env[_out_passenger_up] = 0;
  137. b_out_env[_out_passenger_up_stop] = 0;
  138. b_out_env[_out_passenger_down] = 0;
  139. b_out_env[_out_passenger_down_stop] = 0;
  140. }
  141. /* do step*/
  142. fmi2Flag = fmu_control.setBoolean(c_control,vr_in_control_sa_from_env,8,&b_out_env[0]);
  143. if(fmi2Flag != fmi2OK){
  144. printf("Failed setBoolean\n");
  145. fflush(stdout);
  146. return 1;
  147. }
  148. fflush(stdout);
  149. fmi2Flag = fmu_control.doStep(c_control, currentTime, STEP_SIZE, fmi2True);
  150. if (fmu_control.getBoolean(c_control, vr_out_control_sa, 2, &b_out_control_sa[0]) != fmi2OK){
  151. printf("Failed getBoolean\n");
  152. fflush(stdout);
  153. return 1;
  154. }
  155. if(fmi2Flag == fmi2Discard){
  156. printf("Controller simulated partially!\n");
  157. fmi2Real stepTaken = STEP_SIZE;
  158. fmi2Real simulatedTime = currentTime + STEP_SIZE;
  159. for(int i=0; i<1; i++){
  160. fmi2Real theFMUtime;
  161. fmu_control.getRealStatus(c_control, fmi2LastSuccessfulTime, &theFMUtime);
  162. stepTaken = simulatedTime - theFMUtime;
  163. simulatedTime = theFMUtime;
  164. }
  165. currentTime = simulatedTime;
  166. printf("Step taken %f instead of requested %f\n", stepTaken, STEP_SIZE);
  167. fflush(stdout);
  168. } else {
  169. currentTime += STEP_SIZE;
  170. }
  171. printf("%f,%d,%d\n",
  172. currentTime,
  173. b_out_control_sa[0],
  174. b_out_control_sa[1]);
  175. fflush(stdout);
  176. }
  177. return EXIT_SUCCESS;
  178. }