pw_case.c 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  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 10.0
  16. #define STEP_SIZE 0.01
  17. FMU fmu_env, fmu_control_sa, fmu_power_sa, fmu_window_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. puts("Loading Dlls\n"); /* prints Hello World */
  26. /* loading */
  27. loadDll("libFMI_Environment.dll", &fmu_env, "PW_ENV");
  28. loadDll("libFMI_controller_sa.dll", &fmu_control_sa, "PW_CONTROLLER_SA");
  29. loadDll("libFMI_power_sa.dll", &fmu_power_sa, "POWER_SA");
  30. loadDll("libFMI_Window_sa.dll", &fmu_window_sa, "WINDOW_SA");
  31. puts("instantiating fmus\n");
  32. fmi2Component c_env, c_control_sa, c_power_sa, c_window_sa;
  33. char *fmuResourceLocation_env = "libFMI_Environment.dll";
  34. char *fmuResourceLocation_control_sa = "libFMI_controller_sa.dll";
  35. char *fmuResourceLocation_power_sa = "libFMI_power_sa.dll";
  36. char *fmuResourceLocation_window_sa = "libFMI_Wower_sa.dll";
  37. fmi2CallbackFunctions callbacks_env= {fmuLogger, calloc, free, NULL, &fmu_env};
  38. fmi2CallbackFunctions callbacks_control_sa = {fmuLogger, calloc, free, NULL, &fmu_control_sa};
  39. fmi2CallbackFunctions callbacks_power_sa = {fmuLogger, calloc, free, NULL, &fmu_power_sa};
  40. fmi2CallbackFunctions callbacks_window_sa = {fmuLogger, calloc, free, NULL, &fmu_window_sa};
  41. c_env = fmu_env.instantiate("env", fmi2CoSimulation, "1", fmuResourceLocation_env, &callbacks_env, fmi2False, fmi2False);
  42. c_control_sa = fmu_control_sa.instantiate("control_sa", fmi2CoSimulation, "1", fmuResourceLocation_control_sa, &callbacks_control_sa, fmi2False, fmi2False);
  43. c_power_sa = fmu_power_sa.instantiate("power_sa", fmi2CoSimulation, "1", fmuResourceLocation_power_sa, &callbacks_power_sa, fmi2False, fmi2False);
  44. c_window_sa = fmu_window_sa.instantiate("window_sa",fmi2CoSimulation, "1", fmuResourceLocation_window_sa, &callbacks_window_sa, fmi2False, fmi2False );
  45. fmi2Boolean toleranceDefined = fmi2False; // true if model description define tolerance
  46. fmi2Real tolerance = 0; // used in setting up the experiment
  47. puts("FMU components instantiated, setting up experiments\n");
  48. fmi2Status fmi2Flag[4];
  49. fmi2Flag[0] = fmu_env.setupExperiment(c_env, toleranceDefined, tolerance, START_TIME, fmi2True, STOP_TIME);
  50. if (fmi2Flag[0] == fmi2Error){
  51. return -1;
  52. }
  53. fmi2Flag[1] = fmu_control_sa.setupExperiment(c_control_sa, toleranceDefined, tolerance, START_TIME, fmi2True, STOP_TIME);
  54. if (fmi2Flag[1] == fmi2Error){
  55. return -1;
  56. }
  57. fmi2Flag[2] = fmu_power_sa.setupExperiment(c_power_sa, toleranceDefined, tolerance, START_TIME, fmi2True, STOP_TIME);
  58. if (fmi2Flag[2] == fmi2Error){
  59. return -1;
  60. }
  61. fmi2Flag[3] = fmu_window_sa.setupExperiment(c_window_sa, toleranceDefined, tolerance, START_TIME, fmi2True, STOP_TIME);
  62. if (fmi2Flag[3] == fmi2Error){
  63. return -1;
  64. }
  65. puts("Experiment setup, entering init mode\n");
  66. fmi2Flag[0] = fmu_env.enterInitializationMode(c_env);
  67. if (fmi2Flag[0] == fmi2Error){
  68. return -1;
  69. }
  70. fmi2Flag[1] = fmu_control_sa.enterInitializationMode(c_control_sa);
  71. if (fmi2Flag[1] == fmi2Error){
  72. return -1;
  73. }
  74. fmi2Flag[2] = fmu_power_sa.enterInitializationMode(c_power_sa);
  75. if (fmi2Flag[2] == fmi2Error){
  76. return -1;
  77. }
  78. fmi2Flag[3] = fmu_window_sa.enterInitializationMode(c_window_sa);
  79. if (fmi2Flag[3] == fmi2Error){
  80. return -1;
  81. }
  82. puts("Experiment setup, exiting init mode\n");
  83. fmi2Flag[0] = fmu_env.exitInitializationMode(c_env);
  84. if (fmi2Flag[0] == fmi2Error){
  85. return -1;
  86. }
  87. fmi2Flag[1] = fmu_control_sa.exitInitializationMode(c_control_sa);
  88. if (fmi2Flag[1] == fmi2Error){
  89. return -1;
  90. }
  91. fmi2Flag[2] = fmu_power_sa.exitInitializationMode(c_power_sa);
  92. if (fmi2Flag[2] == fmi2Error){
  93. return -1;
  94. }
  95. fmi2Flag[3] = fmu_window_sa.exitInitializationMode(c_window_sa);
  96. if (fmi2Flag[3] == fmi2Error){
  97. return -1;
  98. }
  99. fmi2ValueReference vr_out_env[9]={0,1,2,3,4,5,6,7,8};
  100. fmi2Boolean b_out_env[9];
  101. fmi2ValueReference vr_out_window[1]={0};
  102. fmi2Real r_out_window[1]={0};
  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_out_power_i[1] = {0};
  107. fmi2ValueReference vr_in_power_sa_u_d_tau[3] = {3,4,5};
  108. fmi2Real r_in_power[3];
  109. fmi2ValueReference vr_out_power_sa[3] = {0,1,2};
  110. fmi2Real r_out_power[3];
  111. fmi2Boolean b_out_control_sa[2];
  112. double currentTime = START_TIME;
  113. const fmi2StatusKind lst = fmi2LastSuccessfulTime;
  114. while(currentTime <= STOP_TIME){
  115. printf("\n----master new loop, ct:%f, h:%f\n",currentTime,STEP_SIZE);
  116. double next_step_size = STEP_SIZE;
  117. fmi2Component ctemp_env, ctemp_control_sa;
  118. /* Make backup*/
  119. fmu_env.getFMUstate(c_env,&ctemp_env);
  120. fmu_control_sa.getFMUstate(c_control_sa, &ctemp_control_sa);
  121. /* do step*/
  122. fmi2Flag[0] = fmu_env.doStep(c_env, currentTime, STEP_SIZE, fmi2True);
  123. if (fmu_env.getBoolean(c_env, vr_out_env, 9, &b_out_env[0]) != fmi2OK){
  124. return 1;
  125. }
  126. if (fmu_power_sa.getBoolean(c_power_sa, vr_out_power_i, 1, &r_out_window[0]) != fmi2OK){
  127. return 1;
  128. }
  129. fprintf(fp_fmu_env,"%f,%d,%d,%d,%d,%d,%d,%d,%d,%d\n",
  130. currentTime,
  131. b_out_env[0],
  132. b_out_env[1],
  133. b_out_env[2],
  134. b_out_env[3],
  135. b_out_env[4],
  136. b_out_env[5],
  137. b_out_env[6],
  138. b_out_env[7],
  139. b_out_env[8]);
  140. if (b_out_env[8]){
  141. r_out_window[0] = 5;
  142. }else{
  143. r_out_window[0]= 0;
  144. }
  145. fmi2Flag[1] = fmu_control_sa.setBoolean(c_control_sa,vr_in_control_sa_from_env,8,&b_out_env[0]);
  146. if(fmi2Flag[1] != fmi2OK){
  147. return 1;
  148. }
  149. fmi2Flag[1] = fmu_control_sa.setReal(c_control_sa,vr_in_control_sa_from_window,1, &r_out_window[0]);
  150. if(fmi2Flag[1] != fmi2OK){
  151. return 1;
  152. }
  153. fmi2Flag[1] = fmu_control_sa.doStep(c_control_sa, currentTime, STEP_SIZE, fmi2True);
  154. if (fmu_control_sa.getBoolean(c_control_sa, vr_out_control_sa, 2, &b_out_control_sa[0]) != fmi2OK){
  155. return 1;
  156. }
  157. fprintf(fp_fmu_control_sa,"%f,%d,%d\n",
  158. currentTime,
  159. b_out_control_sa[0],
  160. b_out_control_sa[1]);
  161. r_in_power[0] = b_out_control_sa[1];
  162. r_in_power[1] = 0;
  163. r_in_power[2] = b_out_control_sa[2];
  164. fmi2Flag[2] = fmu_power_sa.setReal(c_power_sa,vr_in_power_sa_u_d_tau,3, &r_in_power[0]);
  165. if(fmi2Flag[1] != fmi2OK){
  166. return 1;
  167. }
  168. fmi2Flag[2] = fmu_power_sa.doStep(c_power_sa, currentTime, STEP_SIZE, fmi2True);
  169. if (fmu_env.setReal(c_power_sa, vr_out_power_sa, 3, &r_out_power[0]) != fmi2OK){
  170. return 1;
  171. }
  172. fprintf(fp_fmu_power_sa,"%f,%f,%f,%f\n",
  173. currentTime,
  174. r_out_window[0],
  175. r_out_window[1],
  176. r_out_window[2]);
  177. int redoStep = 0;
  178. for(int i=0; i<2; i++)
  179. if (fmi2Flag[i] == fmi2Discard){
  180. redoStep = 1;
  181. fmi2Real newtime;
  182. fmu_control_sa.getRealStatus(c_control_sa, lst, &newtime);
  183. fmi2Real the_FMU_new_step = newtime - currentTime;
  184. if(the_FMU_new_step < next_step_size){
  185. next_step_size = the_FMU_new_step;
  186. }
  187. }
  188. if(redoStep){ // should be a while loop!
  189. // Recover all FMUs and do step again
  190. printf("recover not yet implemented\n");
  191. }else{
  192. currentTime += STEP_SIZE;
  193. }
  194. }
  195. fclose(fp_fmu_env);
  196. fclose(fp_fmu_power_sa);
  197. fclose(fp_fmu_control_sa);
  198. return EXIT_SUCCESS;
  199. }