2011|08|
2013|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|05|06|07|08|09|10|11|12|
2016|01|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|

2016-10-06 「SimulinkでC言語のS-function使いたい」を試している時の自分用メモ [長年日記]

 
 /*
   「SimulinkでC言語のS-function使いたい」を試している時の自分用メモ
   
 
   "サポートされているコンパイラまたは SDK が見つかりません。無償提供されている MinGW-w64 C/C++ コンパイラを
   インストールできます。「Install MinGW-w64 Compiler」を参照してください。その他のオプションについては、
   http://www.mathworks.com/support/compilers/R2015b/win64.html を参照してください。"
 
   ↓
 
   Cのコンパイラがないと言われているらしい。
   MATLABの中から呼んでも、インストールできなかったので、ブラウザで検索して、そこからダウンロードしたら
   インストールできた(二日がかり)
 
   ↓
 
   mex -setup
 
   ↓
 
   "MEX は C 言語のコンパイルに 'MinGW64 Compiler (C)' を使用するよう設定されています。
   警告: MATLAB C および Fortran API は、2^32-1 を超える要素のある MATLAB
   変数をサポートするように変更されました。今後、
   新しい API を利用できるようにコードを
   更新する必要があります。詳細は、
   http://www.mathworks.co.jp/jp/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html を参照してください。
   
   別の言語を選択するには、次のいずれかを選択してください。
   mex -setup C++ 
   mex -setup FORTRAN"
   
   ↓
 
   mex -setup C++ 
 
   ↓
 
   mex timestwo.c
 
   ↓
 
   "'MinGW64 Compiler (C)' でビルドしています。
   MEX は正常に完了しました。"
 
   ↓
 
   timestwo(4)
 
   ↓
   
   エラー: timestwo
   MEX level2 S-function "timestwo" must be called with at least 4 right hand arguments
 
   ↓
 
   >> timestwo(1,1,0,0)
   
   ans =
   
            0
            0
            1
            1
            0
            0
            1
            0
            0
            0
            0
            0
            0
            0
            0
            0
            0
            0
            0
      8480229
            0
            0
            0
         8194
            0
            0
            0
            0
            0
            0
            0
            2
            0
            0
            0
            0
            0
            0
            0
            0
   
 	  ↓
 	  
 	  まったく何のことやら分からんので、今からソースコードの解析に入る
 
 */
    
 
 /*
  * File : timestwo.c
  * Abstract:
  *       An example C-file S-function for multiplying an input by 2,
  *       y  = 2*u
  *
  * See simulink/src/sfuntmpl.doc
  *
  * Copyright (c) 1990-1998 by The MathWorks, Inc. All Rights Reserved.
  * $Revision: 1.3 $
  */
 
 
 #define S_FUNCTION_NAME  timestwo
 #define S_FUNCTION_LEVEL 2
 
 #include "simstruc.h"
 
 
 /* Function: mdlInitializeSizes ===============================================
  * Abstract:
  *   Setup sizes of the various vectors.
  */
 static void mdlInitializeSizes(SimStruct *S)
 {
   ssSetNumSFcnParams(S, 0);
   if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) {
 	return; /* Parameter mismatch will be reported by Simulink */
   }
   
   if (!ssSetNumInputPorts(S, 1)) return;
   ssSetInputPortWidth(S, 0, DYNAMICALLY_SIZED);
   ssSetInputPortDirectFeedThrough(S, 0, 1);
   
   if (!ssSetNumOutputPorts(S,1)) return;
   ssSetOutputPortWidth(S, 0, DYNAMICALLY_SIZED);
   
   ssSetNumSampleTimes(S, 1);
   
   /* Take care when specifying exception free code - see sfuntmpl.doc */
   ssSetOptions(S, SS_OPTION_EXCEPTION_FREE_CODE);
 }
 
 
 /* Function: mdlInitializeSampleTimes =========================================
  * Abstract:
  *    Specifiy that we inherit our sample time from the driving block.
  */
 static void mdlInitializeSampleTimes(SimStruct *S)
 {
   ssSetSampleTime(S, 0, INHERITED_SAMPLE_TIME);
   ssSetOffsetTime(S, 0, 0.0);
 }
 
 
 /* Function: mdlOutputs =======================================================
  * Abstract:
  *    y = 2*u
  */
 static void mdlOutputs(SimStruct *S, int_T tid)
 {
   int_T             i;
   InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs(S,0);
   real_T            *y    = ssGetOutputPortRealSignal(S,0);
   int_T             width = ssGetOutputPortWidth(S,0);
   
   for (i=0; i