pw_case.c 8.8 KB

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