pw_case.c 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  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 "sim_support.h"
  12. #include "fmi2.h"
  13. #define START_TIME 0.0
  14. #define STOP_TIME 3.0
  15. #define STEP_SIZE 0.00001
  16. FMU fmu_env, fmu_control_sa, fmu_power_sa, fmu_loop_sa;
  17. int main(void) {
  18. FILE *fp_fmu_env;
  19. fp_fmu_env = fopen("result_ENV.csv", "w");
  20. FILE *fp_fmu_control_sa;
  21. fp_fmu_control_sa = fopen("result_Control_sa.csv", "w");
  22. FILE *fp_fmu_power_sa;
  23. fp_fmu_power_sa = fopen("result_power_sa.csv","w");
  24. FILE *fp_fmu_loop_sa;
  25. fp_fmu_loop_sa = fopen("result_loop_sa.csv", "w");
  26. puts("Loading Dlls\n");
  27. /* loading */
  28. loadDll("libFMI_Environment.dll", &fmu_env, "PW_ENV");
  29. loadDll("libFMI_controller_sa.dll", &fmu_control_sa, "PW_CONTROLLER_SA");
  30. loadDll("libFMI_power_sa.dll", &fmu_power_sa, "POWER_SA");
  31. loadDll("libFMI_loop_sa.dll", &fmu_loop_sa, "LOOP_SA");
  32. puts("instantiating fmus\n");
  33. fmi2Component c_env, c_control_sa, c_power_sa, c_loop_sa;
  34. char *fmuResourceLocation_env = "libFMI_Environment.dll";
  35. char *fmuResourceLocation_control_sa = "libFMI_controller_sa.dll";
  36. char *fmuResourceLocation_power_sa = "libFMI_power_sa.dll";
  37. char *fmuResourceLocation_window_sa = "libFMI_loop_sa.dll";
  38. fmi2CallbackFunctions callbacks_env= {fmuLogger, calloc, free, NULL, &fmu_env};
  39. fmi2CallbackFunctions callbacks_control_sa = {fmuLogger, calloc, free, NULL, &fmu_control_sa};
  40. fmi2CallbackFunctions callbacks_power_sa = {fmuLogger, calloc, free, NULL, &fmu_power_sa};
  41. fmi2CallbackFunctions callbacks_loop_sa = {fmuLogger, calloc, free, NULL, &fmu_loop_sa};
  42. c_env = fmu_env.instantiate("env", fmi2CoSimulation, "1", fmuResourceLocation_env, &callbacks_env, fmi2False, fmi2False);
  43. c_control_sa = fmu_control_sa.instantiate("control_sa", fmi2CoSimulation, "1", fmuResourceLocation_control_sa, &callbacks_control_sa, fmi2False, fmi2False);
  44. c_power_sa = fmu_power_sa.instantiate("power_sa", fmi2CoSimulation, "1", fmuResourceLocation_power_sa, &callbacks_power_sa, fmi2False, fmi2False);
  45. c_loop_sa = fmu_loop_sa.instantiate("loop_sa",fmi2CoSimulation, "1", fmuResourceLocation_window_sa, &callbacks_loop_sa, fmi2False, fmi2False );
  46. fmi2Boolean toleranceDefined = fmi2False; // true if model description define tolerance
  47. fmi2Real tolerance = 0; // used in setting up the experiment
  48. puts("FMU components instantiated, setting up experiments\n");
  49. fmi2Status fmi2Flag[4];
  50. fmi2Flag[0] = fmu_env.setupExperiment(c_env, toleranceDefined, tolerance, START_TIME, fmi2True, STOP_TIME);
  51. if (fmi2Flag[0] == fmi2Error){
  52. return -1;
  53. }
  54. fmi2Flag[1] = fmu_control_sa.setupExperiment(c_control_sa, toleranceDefined, tolerance, START_TIME, fmi2True, STOP_TIME);
  55. if (fmi2Flag[1] == fmi2Error){
  56. return -1;
  57. }
  58. fmi2Flag[2] = fmu_power_sa.setupExperiment(c_power_sa, toleranceDefined, tolerance, START_TIME, fmi2True, STOP_TIME);
  59. if (fmi2Flag[2] == fmi2Error){
  60. return -1;
  61. }
  62. fmi2Flag[3] = fmu_loop_sa.setupExperiment(c_loop_sa, toleranceDefined, tolerance, START_TIME, fmi2True, STOP_TIME);
  63. if (fmi2Flag[3] == fmi2Error){
  64. return -1;
  65. }
  66. puts("Experiment setup, entering init mode\n");
  67. fmi2Flag[0] = fmu_env.enterInitializationMode(c_env);
  68. if (fmi2Flag[0] == fmi2Error){
  69. return -1;
  70. }
  71. fmi2Flag[1] = fmu_control_sa.enterInitializationMode(c_control_sa);
  72. if (fmi2Flag[1] == fmi2Error){
  73. return -1;
  74. }
  75. fmi2Flag[2] = fmu_power_sa.enterInitializationMode(c_power_sa);
  76. if (fmi2Flag[2] == fmi2Error){
  77. return -1;
  78. }
  79. fmi2Flag[3] = fmu_loop_sa.enterInitializationMode(c_loop_sa);
  80. if (fmi2Flag[3] == fmi2Error){
  81. return -1;
  82. }
  83. puts("Experiment setup, exiting init mode\n");
  84. fmi2Flag[0] = fmu_env.exitInitializationMode(c_env);
  85. if (fmi2Flag[0] == fmi2Error){
  86. return -1;
  87. }
  88. fmi2Flag[1] = fmu_control_sa.exitInitializationMode(c_control_sa);
  89. if (fmi2Flag[1] == fmi2Error){
  90. return -1;
  91. }
  92. fmi2Flag[2] = fmu_power_sa.exitInitializationMode(c_power_sa);
  93. if (fmi2Flag[2] == fmi2Error){
  94. return -1;
  95. }
  96. fmi2Flag[3] = fmu_loop_sa.exitInitializationMode(c_loop_sa);
  97. if (fmi2Flag[3] == fmi2Error){
  98. return -1;
  99. }
  100. fmi2ValueReference vr_out_env[9]={0,1,2,3,4,5,6,7,8};
  101. fmi2Boolean b_out_env[9];
  102. fmi2ValueReference vr_in_control_sa_from_env[8]={0,1,2,3,4,5,6,7};
  103. fmi2ValueReference vr_in_control_sa_from_window[1] = {0};
  104. fmi2ValueReference vr_out_control_sa[2]={9,10};
  105. fmi2ValueReference vr_in_power_sa_u_d[2] = {3,5};
  106. fmi2ValueReference vr_in_power_sa_tau[1] = {4};
  107. fmi2ValueReference vr_out_loop_sa[1] = {0};
  108. fmi2Real r_in_power_from_control[2] = {0,0};
  109. fmi2Real r_in_power_from_loop[1]={0};
  110. fmi2ValueReference vr_out_power_sa[3] = {0,1,2};
  111. fmi2Real r_out_power[3];
  112. fmi2Real r_out_loop_sa[1];
  113. fmi2Boolean b_out_control_sa[2];
  114. double currentTime = START_TIME;
  115. const fmi2StatusKind lst = fmi2LastSuccessfulTime;
  116. while(currentTime <= STOP_TIME){
  117. printf("\n----master new loop, ct:%f, h:%f\n",currentTime,STEP_SIZE);
  118. double next_step_size = STEP_SIZE;
  119. fmi2Component ctemp_env, ctemp_control_sa;
  120. /* Make backup*/
  121. fmu_env.getFMUstate(c_env,&ctemp_env);
  122. fmu_control_sa.getFMUstate(c_control_sa, &ctemp_control_sa);
  123. /* do step*/
  124. fmi2Flag[2] = fmu_power_sa.setReal(c_power_sa,vr_in_power_sa_u_d,2, &r_in_power_from_control[0]);
  125. if(fmi2Flag[1] != fmi2OK){
  126. return 1;
  127. }
  128. fmi2Flag[2] = fmu_power_sa.setReal(c_power_sa,vr_in_power_sa_tau,1, &r_in_power_from_loop[0]);
  129. if(fmi2Flag[1] != fmi2OK){
  130. return 1;
  131. }
  132. fmi2Flag[2] = fmu_power_sa.doStep(c_power_sa, currentTime, STEP_SIZE, fmi2True);
  133. if (fmu_power_sa.getReal(c_power_sa, vr_out_power_sa, 3, &r_out_power[0]) != fmi2OK){
  134. return 1;
  135. }
  136. fflush(stdout);
  137. fmi2Flag[0] = fmu_env.doStep(c_env, currentTime, STEP_SIZE, fmi2True);
  138. if (fmu_env.getBoolean(c_env, vr_out_env, 9, &b_out_env[0]) != fmi2OK){
  139. return 1;
  140. }
  141. fprintf(fp_fmu_env,"%f,%d,%d,%d,%d,%d,%d,%d,%d,%d\n",
  142. currentTime,
  143. b_out_env[0],
  144. b_out_env[1],
  145. b_out_env[2],
  146. b_out_env[3],
  147. b_out_env[4],
  148. b_out_env[5],
  149. b_out_env[6],
  150. b_out_env[7],
  151. b_out_env[8]);
  152. fmi2Flag[1] = fmu_control_sa.setBoolean(c_control_sa,vr_in_control_sa_from_env,8,&b_out_env[0]);
  153. if(fmi2Flag[1] != fmi2OK){
  154. return 1;
  155. }
  156. fmi2Flag[1] = fmu_control_sa.setReal(c_control_sa,vr_in_control_sa_from_window,1, &r_out_power[0]);
  157. if(fmi2Flag[1] != fmi2OK){
  158. return 1;
  159. }
  160. fflush(stdout);
  161. fmi2Flag[1] = fmu_control_sa.doStep(c_control_sa, currentTime, STEP_SIZE, fmi2True);
  162. if (fmu_control_sa.getBoolean(c_control_sa, vr_out_control_sa, 2, &b_out_control_sa[0]) != fmi2OK){
  163. return 1;
  164. }
  165. fprintf(fp_fmu_control_sa,"%f,%d,%d\n",
  166. currentTime,
  167. b_out_control_sa[0],
  168. b_out_control_sa[1]);
  169. r_in_power_from_control[0] = (int)b_out_control_sa[0];
  170. r_in_power_from_control[1] = (int)b_out_control_sa[1];
  171. fflush(stdout);
  172. fprintf(fp_fmu_power_sa,"%f,%f,%f,%f\n",
  173. currentTime,
  174. r_out_power[0],
  175. r_out_power[1],
  176. r_out_power[2]);
  177. fmi2ValueReference vr_toLoop[2] = {1,2};
  178. fmi2Real toLoop[2];
  179. toLoop[0] = r_out_power[1];
  180. toLoop[1] = r_out_power[2];
  181. if (fmu_loop_sa.setReal(c_loop_sa, vr_toLoop, 2, &toLoop[0]) != fmi2OK){
  182. return 1;
  183. }
  184. fmi2Flag[3] = fmu_loop_sa.doStep(c_loop_sa, currentTime, STEP_SIZE, fmi2True);
  185. fflush(stdout);
  186. if (fmu_loop_sa.getReal(c_loop_sa, vr_out_loop_sa, 1, &r_out_loop_sa[0]) != fmi2OK){
  187. return 1;
  188. }
  189. fprintf(fp_fmu_loop_sa,"%f,%f\n",
  190. currentTime,
  191. r_out_loop_sa[0]
  192. );
  193. r_in_power_from_loop[0] = r_out_loop_sa[0];
  194. //r_in_power_from_loop[0] = -7000;
  195. int redoStep = 0;
  196. for(int i=0; i<2; i++)
  197. if (fmi2Flag[i] == fmi2Discard){
  198. redoStep = 1;
  199. fmi2Real newtime;
  200. fmu_control_sa.getRealStatus(c_control_sa, lst, &newtime);
  201. fmi2Real the_FMU_new_step = newtime - currentTime;
  202. if(the_FMU_new_step < next_step_size){
  203. next_step_size = the_FMU_new_step;
  204. }
  205. }
  206. if(redoStep){ // should be a while loop!
  207. // Recover all FMUs and do step again
  208. printf("recover not yet implemented\n");
  209. }else{
  210. currentTime += STEP_SIZE;
  211. }
  212. fflush(stdout);
  213. }
  214. fclose(fp_fmu_env);
  215. fclose(fp_fmu_power_sa);
  216. fclose(fp_fmu_control_sa);
  217. return EXIT_SUCCESS;
  218. }