mttWriteSystemSfun.m 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. function mttWriteSystemSfun(model)
  2. model_name = mttDetachText(model.source,'/') ;
  3. working_directory = pwd ;
  4. working_directory = strrep(working_directory,'\','/') ;
  5. filename = [working_directory,'/',model_name,'_sfun.cpp'] ;
  6. fid = fopen(filename,'w') ;
  7. mttNotify(['...creating ',filename]) ;
  8. mttWriteNewLine ;
  9. model_name = mttDetachText(model.source,'/') ;
  10. fprintf(fid,['// Simulation Code for "',model_name,'"\n']) ;
  11. fprintf(fid,'\n') ;
  12. fprintf(fid,['// file: ',filename ,'\n']) ;
  13. fprintf(fid,['// written by MTT on ',datestr(now),'\n']) ;
  14. fprintf(fid,'\n') ;
  15. write_sfun(fid,model) ;
  16. fclose(fid) ;
  17. function write_sfun(fid,model)
  18. model_name = mttDetachText(model.source,'/') ;
  19. counter = mttCountSystemMapping(model) ;
  20. fprintf(fid,['#define S_FUNCTION_NAME ',model_name,'_sfun' ,'\n']) ;
  21. fprintf(fid,['#define S_FUNCTION_LEVEL 2' ,'\n']) ;
  22. fprintf(fid,['' ,'\n']) ;
  23. fprintf(fid,['#include "',model_name,'_include_def.h"' ,'\n']) ;
  24. if isfield(model,'app')
  25. if ~isempty(model.app)
  26. fprintf(fid,['#include "',model_name,'_include_apps.h"' ,'\n']) ;
  27. end
  28. end
  29. fprintf(fid,['#include "simstruc.h"' ,'\n']) ;
  30. fprintf(fid,['' ,'\n']) ;
  31. fprintf(fid,['static double *_mttInput ;' ,'\n']) ;
  32. fprintf(fid,['static double *_mttState ;' ,'\n']) ;
  33. fprintf(fid,['static double *_mttDerivative ;' ,'\n']) ;
  34. fprintf(fid,['static double *_mttOutput ;' ,'\n']) ;
  35. fprintf(fid,['static double _mttTime ;' ,'\n']) ;
  36. fprintf(fid,['' ,'\n']) ;
  37. fprintf(fid,['static unsigned int _mttIndex ;' ,'\n']) ;
  38. fprintf(fid,['' ,'\n']) ;
  39. fprintf(fid,['const int _mttNumInputs = ',num2str(counter.input),' ;' ,'\n']) ;
  40. fprintf(fid,['const int _mttNumOutputs = ',num2str(counter.output),' ;' ,'\n']) ;
  41. fprintf(fid,['const int _mttNumStates = ',num2str(counter.state),' ;' ,'\n']) ;
  42. fprintf(fid,['' ,'\n']) ;
  43. fprintf(fid,['' ,'\n']) ;
  44. fprintf(fid,['// system equations' ,'\n']) ;
  45. fprintf(fid,['' ,'\n']) ;
  46. fprintf(fid,['static void ',model_name,'_set_numpar (void) {' ,'\n']) ;
  47. fprintf(fid,['#include "',model_name,'_include_set_numpar.h"' ,'\n']) ;
  48. fprintf(fid,['}' ,'\n']) ;
  49. fprintf(fid,['' ,'\n']) ;
  50. fprintf(fid,['static void ',model_name,'_set_input (void) {' ,'\n']) ;
  51. fprintf(fid,['#include "',model_name,'_include_set_input.h"' ,'\n']) ;
  52. fprintf(fid,['}' ,'\n']) ;
  53. fprintf(fid,['' ,'\n']) ;
  54. fprintf(fid,['static void ',model_name,'_set_state (void) {' ,'\n']) ;
  55. fprintf(fid,['#include "',model_name,'_include_set_state.h"' ,'\n']) ;
  56. fprintf(fid,['}' ,'\n']) ;
  57. fprintf(fid,['' ,'\n']) ;
  58. fprintf(fid,['static void ',model_name,'_get_input (void) {' ,'\n']) ;
  59. fprintf(fid,['#include "',model_name,'_include_get_input.h"' ,'\n']) ;
  60. fprintf(fid,['}' ,'\n']) ;
  61. fprintf(fid,['' ,'\n']) ;
  62. fprintf(fid,['static void ',model_name,'_get_state (void) {' ,'\n']) ;
  63. fprintf(fid,['#include "',model_name,'_include_get_state.h"' ,'\n']) ;
  64. fprintf(fid,['}' ,'\n']) ;
  65. fprintf(fid,['' ,'\n']) ;
  66. fprintf(fid,['static void ',model_name,'_put_state (void) {' ,'\n']) ;
  67. fprintf(fid,['#include "',model_name,'_include_put_state.h"' ,'\n']) ;
  68. fprintf(fid,['}' ,'\n']) ;
  69. fprintf(fid,['' ,'\n']) ;
  70. fprintf(fid,['static void ',model_name,'_put_derivative (void) {' ,'\n']) ;
  71. fprintf(fid,['#include "',model_name,'_include_put_derivative.h"' ,'\n']) ;
  72. fprintf(fid,['}' ,'\n']) ;
  73. fprintf(fid,['' ,'\n']) ;
  74. fprintf(fid,['static void ',model_name,'_put_output (void) {' ,'\n']) ;
  75. fprintf(fid,['#include "',model_name,'_include_put_output.h"' ,'\n']) ;
  76. fprintf(fid,['}' ,'\n']) ;
  77. fprintf(fid,['' ,'\n']) ;
  78. fprintf(fid,['static void ',model_name,'_ode (void) {' ,'\n']) ;
  79. fprintf(fid,['#include "',model_name,'_include_ode.h"' ,'\n']) ;
  80. fprintf(fid,['}' ,'\n']) ;
  81. fprintf(fid,['' ,'\n']) ;
  82. fprintf(fid,['' ,'\n']) ;
  83. fprintf(fid,['// utility procedures' ,'\n']) ;
  84. fprintf(fid,['' ,'\n']) ;
  85. fprintf(fid,['static double *array_of_double (size_t n)' ,'\n']) ;
  86. fprintf(fid,['{' ,'\n']) ;
  87. fprintf(fid,[' void *p = calloc (n, sizeof (double)) ;' ,'\n']) ;
  88. fprintf(fid,[' if (! p) fprintf (stderr, "*** ERROR: failed to allocate memory") ;','\n']) ;
  89. fprintf(fid,[' return (double *) p ;' ,'\n']) ;
  90. fprintf(fid,['}' ,'\n']) ;
  91. fprintf(fid,['' ,'\n']) ;
  92. fprintf(fid,['static void initialise_arrays (void)' ,'\n']) ;
  93. fprintf(fid,['{' ,'\n']) ;
  94. fprintf(fid,[' _mttInput = array_of_double(_mttNumInputs) ;' ,'\n']) ;
  95. fprintf(fid,[' _mttOutput = array_of_double(_mttNumOutputs) ;' ,'\n']) ;
  96. fprintf(fid,[' _mttState = array_of_double(_mttNumStates) ;' ,'\n']) ;
  97. fprintf(fid,[' _mttDerivative = array_of_double(_mttNumStates) ;' ,'\n']) ;
  98. fprintf(fid,['}' ,'\n']) ;
  99. fprintf(fid,['' ,'\n']) ;
  100. fprintf(fid,['static void check_finite(SimStruct *S, double *array, unsigned int index)','\n']) ;
  101. fprintf(fid,['{' ,'\n']) ;
  102. fprintf(fid,[' const char *array_name ;' ,'\n']) ;
  103. fprintf(fid,[' char warning[128] ;' ,'\n']) ;
  104. fprintf(fid,[' if ((array[index] <= 0.0) || (array[index] >= 0.0)) {' ,'\n']) ;
  105. fprintf(fid,[' ; // ...no problem' ,'\n']) ;
  106. fprintf(fid,[' } else {' ,'\n']) ;
  107. fprintf(fid,[' if (array == _mttInput) {' ,'\n']) ;
  108. fprintf(fid,[' array_name = "_mttInput" ;' ,'\n']) ;
  109. fprintf(fid,[' } else if (array == _mttState) {' ,'\n']) ;
  110. fprintf(fid,[' array_name = "_mttState" ;' ,'\n']) ;
  111. fprintf(fid,[' } else if (array == _mttOutput) {' ,'\n']) ;
  112. fprintf(fid,[' array_name = "_mttOutput" ;' ,'\n']) ;
  113. fprintf(fid,[' } else if (array == _mttDerivative) {' ,'\n']) ;
  114. fprintf(fid,[' array_name = "_mttDerivative" ;' ,'\n']) ;
  115. fprintf(fid,[' } else {' ,'\n']) ;
  116. fprintf(fid,[' array_name = "unknown_array" ;' ,'\n']) ;
  117. fprintf(fid,[' }' ,'\n']) ;
  118. fprintf(fid,[' sprintf(warning,"(time %%f) Non-finite array element: %%s[%%d]",_mttTime,array_name,index) ;','\n']) ;
  119. fprintf(fid,[' ssWarning(S,warning) ;' ,'\n']) ;
  120. fprintf(fid,[' }' ,'\n']) ;
  121. fprintf(fid,['}' ,'\n']) ;
  122. fprintf(fid,['' ,'\n']) ;
  123. fprintf(fid,['' ,'\n']) ;
  124. fprintf(fid,['// S-function methods' ,'\n']) ;
  125. fprintf(fid,['' ,'\n']) ;
  126. fprintf(fid,['static void mdlInitializeSizes(SimStruct *S)' ,'\n']) ;
  127. fprintf(fid,['{' ,'\n']) ;
  128. fprintf(fid,[' ssSetNumSFcnParams(S,0) ;' ,'\n']) ;
  129. fprintf(fid,[' if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) return ;','\n']) ;
  130. fprintf(fid,['' ,'\n']) ;
  131. fprintf(fid,[' ssSetNumContStates(S,_mttNumStates) ;' ,'\n']) ;
  132. fprintf(fid,[' ssSetNumDiscStates(S,0) ;' ,'\n']) ;
  133. fprintf(fid,['' ,'\n']) ;
  134. fprintf(fid,[' if (!ssSetNumInputPorts(S,1)) return ;' ,'\n']) ;
  135. fprintf(fid,[' ssSetInputPortWidth(S,0,_mttNumInputs) ;' ,'\n']) ;
  136. fprintf(fid,[' ssSetInputPortDirectFeedThrough(S,0,1) ;' ,'\n']) ;
  137. fprintf(fid,['' ,'\n']) ;
  138. fprintf(fid,[' if (!ssSetNumOutputPorts(S,1)) return ;' ,'\n']) ;
  139. fprintf(fid,[' ssSetOutputPortWidth(S,0,_mttNumOutputs) ;' ,'\n']) ;
  140. fprintf(fid,['' ,'\n']) ;
  141. fprintf(fid,[' ssSetNumSampleTimes(S,1) ;' ,'\n']) ;
  142. fprintf(fid,[' ssSetNumRWork(S,0) ;' ,'\n']) ;
  143. fprintf(fid,[' ssSetNumIWork(S,0) ;' ,'\n']) ;
  144. fprintf(fid,[' ssSetNumPWork(S,0) ;' ,'\n']) ;
  145. fprintf(fid,[' ssSetNumModes(S,0) ;' ,'\n']) ;
  146. fprintf(fid,[' ssSetNumNonsampledZCs(S,0) ;' ,'\n']) ;
  147. fprintf(fid,['' ,'\n']) ;
  148. fprintf(fid,[' ssSetOptions(S,SS_OPTION_EXCEPTION_FREE_CODE) ;' ,'\n']) ;
  149. fprintf(fid,['' ,'\n']) ;
  150. fprintf(fid,[' initialise_arrays() ;' ,'\n']) ;
  151. fprintf(fid,['}' ,'\n']) ;
  152. fprintf(fid,['' ,'\n']) ;
  153. fprintf(fid,['static void mdlInitializeSampleTimes(SimStruct *S)' ,'\n']) ;
  154. fprintf(fid,['{' ,'\n']) ;
  155. fprintf(fid,[' ssSetSampleTime(S,0,CONTINUOUS_SAMPLE_TIME) ;' ,'\n']) ;
  156. fprintf(fid,[' ssSetOffsetTime(S,0,0.0) ;' ,'\n']) ;
  157. fprintf(fid,['}' ,'\n']) ;
  158. fprintf(fid,['' ,'\n']) ;
  159. fprintf(fid,['#define MDL_INITIALIZE_CONDITIONS' ,'\n']) ;
  160. fprintf(fid,['static void mdlInitializeConditions(SimStruct *S)' ,'\n']) ;
  161. fprintf(fid,['{' ,'\n']) ;
  162. fprintf(fid,[' ',model_name,'_set_numpar() ;' ,'\n']) ;
  163. fprintf(fid,[' ',model_name,'_set_state() ;' ,'\n']) ;
  164. fprintf(fid,[' ',model_name,'_put_state() ;' ,'\n']) ;
  165. fprintf(fid,[' for (_mttIndex=0; _mttIndex<_mttNumStates; _mttIndex++) ssGetContStates(S)[_mttIndex] = _mttState[_mttIndex] ;','\n']) ;
  166. fprintf(fid,['}' ,'\n']) ;
  167. fprintf(fid,['' ,'\n']) ;
  168. fprintf(fid,['static void mdlOutputs(SimStruct *S,int_T tid)' ,'\n']) ;
  169. fprintf(fid,['{' ,'\n']) ;
  170. fprintf(fid,[' UNUSED_ARG(tid) ;' ,'\n']) ;
  171. fprintf(fid,[' for (_mttIndex=0; _mttIndex<_mttNumStates; _mttIndex++) {' ,'\n']) ;
  172. fprintf(fid,[' _mttState[_mttIndex] = ssGetContStates(S)[_mttIndex] ;' ,'\n']) ;
  173. fprintf(fid,[' check_finite(S,_mttState,_mttIndex) ;' ,'\n']) ;
  174. fprintf(fid,[' }' ,'\n']) ;
  175. fprintf(fid,[' for (_mttIndex=0; _mttIndex<_mttNumInputs; _mttIndex++) {' ,'\n']) ;
  176. fprintf(fid,[' _mttInput[_mttIndex] = *ssGetInputPortRealSignalPtrs(S,0)[_mttIndex] ;','\n']) ;
  177. fprintf(fid,[' check_finite(S,_mttInput,_mttIndex) ;' ,'\n']) ;
  178. fprintf(fid,[' }' ,'\n']) ;
  179. fprintf(fid,[' _mttTime = ssGetT(S) ;' ,'\n']) ;
  180. fprintf(fid,['' ,'\n']) ;
  181. fprintf(fid,[' ',model_name,'_get_input() ;' ,'\n']) ;
  182. fprintf(fid,[' ',model_name,'_get_state() ;' ,'\n']) ;
  183. fprintf(fid,[' ',model_name,'_ode() ;' ,'\n']) ;
  184. fprintf(fid,[' ',model_name,'_put_output() ;' ,'\n']) ;
  185. fprintf(fid,['' ,'\n']) ;
  186. fprintf(fid,[' for(_mttIndex=0; _mttIndex<_mttNumOutputs; _mttIndex++) {' ,'\n']) ;
  187. fprintf(fid,[' check_finite(S,_mttOutput,_mttIndex) ;' ,'\n']) ;
  188. fprintf(fid,[' ssGetOutputPortRealSignal(S,0)[_mttIndex] = _mttOutput[_mttIndex] ;','\n']) ;
  189. fprintf(fid,[' }' ,'\n']) ;
  190. fprintf(fid,['}' ,'\n']) ;
  191. fprintf(fid,['' ,'\n']) ;
  192. fprintf(fid,['#define MDL_DERIVATIVES' ,'\n']) ;
  193. fprintf(fid,['static void mdlDerivatives(SimStruct *S)' ,'\n']) ;
  194. fprintf(fid,['{' ,'\n']) ;
  195. fprintf(fid,[' for (_mttIndex=0; _mttIndex<_mttNumStates; _mttIndex++) {' ,'\n']) ;
  196. fprintf(fid,[' _mttState[_mttIndex] = ssGetContStates(S)[_mttIndex] ;' ,'\n']) ;
  197. fprintf(fid,[' check_finite(S,_mttState,_mttIndex) ;' ,'\n']) ;
  198. fprintf(fid,[' }' ,'\n']) ;
  199. fprintf(fid,[' for (_mttIndex=0; _mttIndex<_mttNumInputs; _mttIndex++) {' ,'\n']) ;
  200. fprintf(fid,[' _mttInput[_mttIndex] = *ssGetInputPortRealSignalPtrs(S,0)[_mttIndex] ;','\n']) ;
  201. fprintf(fid,[' check_finite(S,_mttInput,_mttIndex) ;' ,'\n']) ;
  202. fprintf(fid,[' }' ,'\n']) ;
  203. fprintf(fid,[' _mttTime = ssGetT(S) ;' ,'\n']) ;
  204. fprintf(fid,['' ,'\n']) ;
  205. fprintf(fid,[' ',model_name,'_get_input() ;' ,'\n']) ;
  206. fprintf(fid,[' ',model_name,'_get_state() ;' ,'\n']) ;
  207. fprintf(fid,[' ',model_name,'_ode() ;' ,'\n']) ;
  208. fprintf(fid,[' ',model_name,'_put_derivative() ;' ,'\n']) ;
  209. fprintf(fid,[' ' ,'\n']) ;
  210. fprintf(fid,[' if (_mttTime==0)' ,'\n']) ;
  211. fprintf(fid,[' for(_mttIndex=0; _mttIndex<_mttNumStates; _mttIndex++) ssGetdX(S)[_mttIndex] = 0.0 ;','\n']) ;
  212. fprintf(fid,[' else' ,'\n']) ;
  213. fprintf(fid,[' for(_mttIndex=0; _mttIndex<_mttNumStates; _mttIndex++) {' ,'\n']) ;
  214. fprintf(fid,[' check_finite(S,_mttDerivative,_mttIndex) ;' ,'\n']) ;
  215. fprintf(fid,[' ssGetdX(S)[_mttIndex] = _mttDerivative[_mttIndex] ;' ,'\n']) ;
  216. fprintf(fid,[' }' ,'\n']) ;
  217. fprintf(fid,['}' ,'\n']) ;
  218. fprintf(fid,['' ,'\n']) ;
  219. fprintf(fid,['static void mdlTerminate(SimStruct *S)' ,'\n']) ;
  220. fprintf(fid,['{' ,'\n']) ;
  221. fprintf(fid,[' UNUSED_ARG(S);' ,'\n']) ;
  222. fprintf(fid,[' free (_mttInput) ;' ,'\n']) ;
  223. fprintf(fid,[' free (_mttOutput) ;' ,'\n']) ;
  224. fprintf(fid,[' free (_mttState) ;' ,'\n']) ;
  225. fprintf(fid,[' free (_mttDerivative) ;' ,'\n']) ;
  226. fprintf(fid,['}' ,'\n']) ;
  227. fprintf(fid,['' ,'\n']) ;
  228. fprintf(fid,['' ,'\n']) ;
  229. fprintf(fid,['#ifdef MATLAB_MEX_FILE' ,'\n']) ;
  230. fprintf(fid,['#include "simulink.c"' ,'\n']) ;
  231. fprintf(fid,['#else' ,'\n']) ;
  232. fprintf(fid,['#include "cg_sfun.h"' ,'\n']) ;
  233. fprintf(fid,['#endif' ,'\n']) ;