power_window_plain_cosim.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. /* -------------------------------------------------------------------------
  2. * Author: Claudio Gomes (claudio.gomes@uantwerp.be)
  3. * -------------------------------------------------------------------------*/
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include "fmi2.h"
  8. #include "sim_support.h"
  9. // The paths to the FMUs to be simulated.
  10. #define OBSTACLE_FMU_PATH "fmu20\\fmu\\cs\\Obstacle.fmu"
  11. #define OBSTACLE_TARGET_DIR "obstacle\\"
  12. #define OBSTACLE_RESULTS "obstacle_results.csv"
  13. #define POWERSYSTEM_FMU_PATH "fmu20\\fmu\\cs\\PW_PowerSystem.fmu"
  14. #define POWERSYSTEM_TARGET_DIR "power_system\\"
  15. #define POWERSYSTEM_RESULTS "power_system_results.csv"
  16. #define WINDOW_FMU_PATH "fmu20\\fmu\\cs\\PW_Window.fmu"
  17. #define WINDOW_TARGET_DIR "window\\"
  18. #define WINDOW_RESULTS "window_results.csv"
  19. #define MSD_FMU_PATH "fmu20\\fmu\\cs\\mass_spring_damper.fmu"
  20. #define MSD_TARGET_DIR "mass_spring_damper\\"
  21. #define MSD_RESULTS "mass_spring_damper_results.csv"
  22. static int instantiateFMU(fmi2Component* c, FMU* fmu, const char* fmuTargetDir, fmi2Boolean loggingOn, const fmi2CallbackFunctions* callbacks){
  23. const fmi2Boolean visible = fmi2False;
  24. printf("Instantiating fmu...\n");
  25. const char *guid = getAttributeValue((Element *)fmu->modelDescription, att_guid);
  26. printf("guid = %s\n", guid);
  27. const char *instanceName = getAttributeValue((Element *)getCoSimulation(fmu->modelDescription), att_modelIdentifier);
  28. printf("instanceName = %s\n", instanceName);
  29. char *fmuResourceDir = getTempResourcesLocation(fmuTargetDir);
  30. printf("fmuResourceDir = %s\n", fmuResourceDir);
  31. *c = fmu->instantiate(instanceName, fmi2CoSimulation, guid, fmuResourceDir,
  32. callbacks, visible, loggingOn);
  33. free(fmuResourceDir);
  34. if (!c)
  35. return error("Could not instantiate fmu.");
  36. printf("Fmu instantiated\n");
  37. return 1; // success
  38. }
  39. static fmi2Status setupExperimentFMU(fmi2Component c, FMU* fmu, double start_time, double tEnd){
  40. fmi2Boolean toleranceDefined = fmi2False; // Default value: false
  41. fmi2Real tolerance;
  42. ValueStatus xmlParserValueState;
  43. Element * defaultExp;
  44. defaultExp = getDefaultExperiment(fmu->modelDescription);
  45. if (defaultExp)
  46. tolerance = getAttributeDouble(defaultExp, att_tolerance, &xmlParserValueState);
  47. if (xmlParserValueState == valueDefined) {
  48. toleranceDefined = fmi2True;
  49. }
  50. return fmu->setupExperiment(c, toleranceDefined, tolerance, start_time, fmi2True, tEnd);
  51. }
  52. static int simulate(FMU* MSD, FMU* Obstacle, FMU* PW_PowerSystem, FMU* PW_Window, double tEnd, double H, fmi2Boolean loggingOn, char separator) {
  53. // co simulation time vars
  54. double time;
  55. double start_time = 0;
  56. int cosim_step_counter;
  57. // aux vars for intermediate results
  58. fmi2Status returnCodeFmiFunctions;
  59. // FMU results file
  60. FILE* obstacle_results;
  61. FILE* power_results;
  62. FILE* window_results;
  63. FILE* msd_results;
  64. // FMU instance data
  65. fmi2Component obstacle_instance;
  66. const fmi2CallbackFunctions obstacle_callbacks = {fmuLogger, calloc, free, NULL, Obstacle};
  67. fmi2Component power_instance;
  68. const fmi2CallbackFunctions power_callbacks = {fmuLogger, calloc, free, NULL, PW_PowerSystem};
  69. fmi2Component window_instance;
  70. const fmi2CallbackFunctions window_callbacks = {fmuLogger, calloc, free, NULL, PW_Window};
  71. fmi2Component msd_instance;
  72. const fmi2CallbackFunctions msd_callbacks = {fmuLogger, calloc, free, NULL, MSD};
  73. // Instantiate FMUS
  74. printf("Instantiating obstacle fmu...\n");
  75. instantiateFMU(&obstacle_instance, Obstacle, OBSTACLE_TARGET_DIR, loggingOn, &obstacle_callbacks);
  76. printf("Instantiating msd fmu...\n");
  77. instantiateFMU(&msd_instance, MSD, MSD_TARGET_DIR, loggingOn, &msd_callbacks);
  78. printf("Instantiating window fmu...\n");
  79. instantiateFMU(&window_instance, PW_Window, WINDOW_TARGET_DIR, loggingOn, &window_callbacks);
  80. printf("Instantiating power fmu...\n");
  81. instantiateFMU(&power_instance, PW_PowerSystem, POWERSYSTEM_TARGET_DIR, loggingOn, &power_callbacks);
  82. // Setup experiments
  83. printf("Setting up default experiment for obstacle_instance fmu...\n");
  84. returnCodeFmiFunctions = setupExperimentFMU(obstacle_instance, Obstacle, start_time, tEnd);
  85. if (returnCodeFmiFunctions > fmi2Warning) {
  86. return error("Could not set up experiment for obstacle_instance fmu.");
  87. }
  88. printf("Setting up default experiment for msd_instance fmu...\n");
  89. returnCodeFmiFunctions = setupExperimentFMU(msd_instance, MSD, start_time, tEnd);
  90. if (returnCodeFmiFunctions > fmi2Warning) {
  91. return error("Could not set up experiment for msd_instance fmu.");
  92. }
  93. printf("Setting up default experiment for window_instance fmu...\n");
  94. returnCodeFmiFunctions = setupExperimentFMU(window_instance, PW_Window, start_time, tEnd);
  95. if (returnCodeFmiFunctions > fmi2Warning) {
  96. printf("Could not set up experiment for window_instance fmu.\n");
  97. return error("Could not set up experiment for window_instance fmu.");
  98. }
  99. printf("Setting up default experiment for power_instance fmu...\n");
  100. returnCodeFmiFunctions = setupExperimentFMU(power_instance, PW_PowerSystem, start_time, tEnd);
  101. if (returnCodeFmiFunctions > fmi2Warning) {
  102. return error("Could not set up experiment for power_instance fmu.");
  103. }
  104. // Init FMUs
  105. printf("Entering initialization mode for obstacle_instance fmu...\n");
  106. returnCodeFmiFunctions = Obstacle->enterInitializationMode(obstacle_instance);
  107. if (returnCodeFmiFunctions > fmi2Warning) {
  108. printf("Could not enter initialization mode for obstacle_instance fmu.\n");
  109. return error("Could not enter initialization mode for obstacle_instance fmu");
  110. }
  111. printf("Entering initialization mode msd_instance fmu...\n");
  112. returnCodeFmiFunctions = MSD->enterInitializationMode(msd_instance);
  113. if (returnCodeFmiFunctions > fmi2Warning) {
  114. printf("Could not enter initialization msd_instance for power fmu.\n");
  115. return error("Could not enter initialization msd_instance for power fmu");
  116. }
  117. printf("Entering initialization mode for power_instance fmu...\n");
  118. returnCodeFmiFunctions = PW_PowerSystem->enterInitializationMode(power_instance);
  119. printf("Entering initialization mode for power_instance fmu... DONE\n");
  120. if (returnCodeFmiFunctions > fmi2Warning) {
  121. printf("Could not enter initialization mode for power_instance fmu.\n");
  122. return error("Could not enter initialization mode for power_instance fmu");
  123. }
  124. printf("Entering initialization mode window_instance fmu...\n");
  125. returnCodeFmiFunctions = PW_Window->enterInitializationMode(window_instance);
  126. if (returnCodeFmiFunctions > fmi2Warning) {
  127. printf("Could not enter initialization window_instance for power fmu.\n");
  128. return error("Could not enter initialization window_instance for power fmu");
  129. }
  130. // Finish Init FMUs
  131. printf("Exiting initialization mode for obstacle_instance fmu...\n");
  132. returnCodeFmiFunctions = Obstacle->exitInitializationMode(obstacle_instance);
  133. if (returnCodeFmiFunctions > fmi2Warning) {
  134. printf("Could not exit initialization mode for obstacle_instance fmu.\n");
  135. return error("Could not exit initialization mode for obstacle_instance fmu");
  136. }
  137. printf("Exiting initialization mode msd_instance fmu...\n");
  138. returnCodeFmiFunctions = MSD->exitInitializationMode(msd_instance);
  139. if (returnCodeFmiFunctions > fmi2Warning) {
  140. return error("Could not exit initialization msd_instance for power fmu");
  141. }
  142. printf("Exiting initialization mode window_instance fmu...\n");
  143. returnCodeFmiFunctions = PW_Window->exitInitializationMode(window_instance);
  144. if (returnCodeFmiFunctions > fmi2Warning) {
  145. return error("Could not exit initialization window_instance for power fmu");
  146. }
  147. printf("Exiting initialization mode for power_instance fmu...\n");
  148. returnCodeFmiFunctions = PW_PowerSystem->exitInitializationMode(power_instance);
  149. if (returnCodeFmiFunctions > fmi2Warning) {
  150. return error("Could not exit initialization mode for power_instance fmu");
  151. }
  152. // open result file
  153. printf("Creating results files...\n");
  154. if (!(obstacle_results = fopen(OBSTACLE_RESULTS, "w"))) {
  155. printf("could not write %s because:\n", OBSTACLE_RESULTS);
  156. printf(" %s\n", strerror(errno));
  157. return 0; // failure
  158. }
  159. if (!(msd_results = fopen(MSD_RESULTS, "w"))) {
  160. printf("could not write %s because:\n", MSD_RESULTS);
  161. printf(" %s\n", strerror(errno));
  162. return 0; // failure
  163. }
  164. if (!(window_results = fopen(WINDOW_RESULTS, "w"))) {
  165. printf("could not write %s because:\n", WINDOW_RESULTS);
  166. printf(" %s\n", strerror(errno));
  167. return 0; // failure
  168. }
  169. if (!(power_results = fopen(POWERSYSTEM_RESULTS, "w"))) {
  170. printf("could not write %s because:\n", POWERSYSTEM_RESULTS);
  171. printf(" %s\n", strerror(errno));
  172. return 0; // failure
  173. }
  174. // output solution for time t0
  175. printf("Writting headers...\n");
  176. outputRow(Obstacle, obstacle_instance, start_time, obstacle_results, separator, fmi2True);
  177. outputRow(MSD, msd_instance, start_time, msd_results, separator, fmi2True);
  178. outputRow(PW_PowerSystem, power_results, start_time, power_results, separator, fmi2True);
  179. outputRow(PW_Window, window_instance, start_time, window_results, separator, fmi2True);
  180. printf("Writting first row of obstacle_instance...\n");
  181. outputRow(Obstacle, obstacle_instance, start_time, obstacle_results, separator, fmi2False); // output values
  182. printf("Writting first row of msd_instance...\n");
  183. outputRow(MSD, msd_instance, start_time, msd_results, separator, fmi2False);
  184. printf("Writting first row of power_instance...\n");
  185. outputRow(PW_PowerSystem, power_instance, start_time, power_results, separator, fmi2False);
  186. printf("Writting first row of window_instance...\n");
  187. outputRow(PW_Window, window_instance, start_time, window_results, separator, fmi2False);
  188. // end simulation
  189. printf("Terminating FMUs...\n");
  190. Obstacle->terminate(obstacle_instance);
  191. MSD->terminate(msd_instance);
  192. PW_PowerSystem->terminate(power_results);
  193. PW_Window->terminate(window_instance);
  194. printf("Releasing FMUs...\n");
  195. Obstacle->freeInstance(obstacle_instance);
  196. MSD->freeInstance(msd_instance);
  197. PW_PowerSystem->freeInstance(power_results);
  198. PW_Window->freeInstance(window_instance);
  199. printf("Closing files...\n");
  200. fclose(obstacle_results);
  201. fclose(msd_results);
  202. fclose(power_results);
  203. fclose(window_results);
  204. printf("Simulation done.\n");
  205. return 1; // success
  206. }
  207. int main(int argc, char *argv[]) {
  208. // The fmus to be loaded and simulated.
  209. FMU Obstacle;
  210. FMU PW_PowerSystem;
  211. FMU PW_Window;
  212. FMU MSD;
  213. setbuf(stdout, NULL); // disable buffering on the stdout.
  214. double tEnd = 1.0;
  215. double H=0.1;
  216. fmi2Boolean loggingOn = fmi2True;
  217. char csv_separator = ',';
  218. printf("Attempting to delete previously unzipped temp files...\n");
  219. deleteUnzippedFiles();
  220. printf("Loading FMUs...\n");
  221. loadFMU(OBSTACLE_FMU_PATH, OBSTACLE_TARGET_DIR, &Obstacle);
  222. loadFMU(MSD_FMU_PATH, MSD_TARGET_DIR, &MSD);
  223. loadFMU(POWERSYSTEM_FMU_PATH, POWERSYSTEM_TARGET_DIR, &PW_PowerSystem);
  224. loadFMU(WINDOW_FMU_PATH, WINDOW_TARGET_DIR, &PW_Window);
  225. printf("Simulating FMUs...\n");
  226. simulate(&MSD,&Obstacle,&PW_PowerSystem, &PW_Window, tEnd, H, loggingOn, csv_separator);
  227. // release FMU
  228. printf("Releasing FMU dlls...\n");
  229. if (!FreeLibrary(Obstacle.dllHandle)){
  230. printf("Error unloading Obstacle.dllHandle.\n");
  231. }
  232. freeModelDescription(Obstacle.modelDescription);
  233. if (!FreeLibrary(MSD.dllHandle)){
  234. printf("Error unloading MSD.dllHandle.\n");
  235. }
  236. freeModelDescription(MSD.modelDescription);
  237. if (!FreeLibrary(PW_Window.dllHandle)){
  238. printf("Error unloading PW_Window.dllHandle.\n");
  239. }
  240. freeModelDescription(PW_Window.modelDescription);
  241. if (!FreeLibrary(PW_PowerSystem.dllHandle)){
  242. printf("Error unloading PW_PowerSystem.dllHandle.\n");
  243. }
  244. freeModelDescription(PW_PowerSystem.modelDescription);
  245. // delete temp files obtained by unzipping the FMU
  246. printf("Attempting to delete unzipped files...\n");
  247. deleteUnzippedFiles();
  248. printf("All done.\n");
  249. return EXIT_SUCCESS;
  250. }