Bonjour,

J'ai fait un modèle SIMULINK très simple:
Une entrée "inport" => une "Transfer Fcn [1/(1s+1)] => un "Transport Delay" => une sortie "Outport".

Je génère le code de ce modèle au format ert_rtw ainsi que les .obj associés.

Je souhaite vérifier le code généré sous SIMULINK en le réintroduisant dans une s-fonction (le modèle étant continu, la génération automatique de cette S-Fonction est impossible). Ce code généré doit ensuite être utilisé par d'autres.

Bref, je me lance dans la rédaction d'une S-Fonction que voici et qui apelle le code généré:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#define S_FUNCTION_LEVEL 2
#define S_FUNCTION_NAME  sfun_de_pierre
 
/*
 * Need to include simstruc.h for the definition of the SimStruct and
 * its associated macro definitions.
 */
#include "simstruc.h"
 
#include "Subsystem.h"
 
/* Entrée */
#define    U1 ((const real_T *)ssGetInputPortRealSignal(S,0))
 
/* Sotie */
#define    Y1 ((const real_T *)ssGetOutputPortRealSignal(S,0))
 
 
/*====================*
 * S-function methods *
 *====================*/
 
/* Function: mdlInitializeSizes ===============================================
 * Abstract:
 *    The sizes information is used by Simulink to determine the S-function
 *    block's characteristics (number of inputs, outputs, states, etc.).
 */
static void mdlInitializeSizes(SimStruct *S)
{
    ssSetNumSFcnParams(S, 0);  /* Number of expected parameters */
 
    if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) {
        /* Return if number of expected != number of actual parameters */
        return;
    }
 
    ssSetNumContStates(S, 0);  /* how many continuous states? */
    ssSetNumDiscStates(S, 0);
 
    /* Number of input ports */   
    if (!ssSetNumInputPorts(S, 1)) return;
    ssSetInputPortWidth(S, 0, 1);   /* 1ère entree */
 
    /* Number of output ports */   
    if (!ssSetNumOutputPorts(S, 1)) return;
    ssSetOutputPortWidth(S, 0, 1);  /* 1ère sortie */
 
    /* NUMST */
    ssSetNumSampleTimes(S, 1);
 
    Subsystem_initialize();
}
 
 
/* Function: mdlInitializeSampleTimes =========================================
 * Abstract:
 *    This function is used to specify the sample time(s) for your
 *    S-function. You must register the same number of sample times as
 *    specified in ssSetNumSampleTimes.
 */
static void mdlInitializeSampleTimes(SimStruct *S)
{
    ssSetSampleTime(S, 0, CONTINUOUS_SAMPLE_TIME);
    ssSetOffsetTime(S, 0, 0.0);
    /*
    ssSetSampleTime(S, 1, CONTINUOUS_SAMPLE_TIME);
    ssSetOffsetTime(S, 1, 0.0);
    ssSetModelReferenceSampleTimeDefaultInheritance(S);
    */
}
 
 
/* Function: mdlOutputs =======================================================
 * Abstract:
 *    In this function, you compute the outputs of your S-function
 *    block.  The default datatype for signals in Simulink is double,
 *    but you can use other intrinsic C datatypes or even custom
 *    datatypes if you wish.  See Simulink document "Writing S-functions"
 *    for details on datatype topics.
 */
static void mdlOutputs(SimStruct *S, int_T tid)
{
  InputRealPtrsType InPort_0 = (InputRealPtrsType) ssGetInputPortSignalPtrs(S, 0);
  real_T *OutPort_0 = (real_T *)ssGetOutputPortSignal(S, 0);
  Subsystem_U.In1 = InPort_0[0][0];
  Subsystem_step(1);
  OutPort_0[0] = Subsystem_Y.Out1; 
}
 
 
/* Function: mdlTerminate =====================================================
 * Abstract:
 *    In this function, you should perform any actions that are necessary
 *    at the termination of a simulation.  For example, if memory was
 *    allocated in mdlStart, this is the place to free it.
 */
static void mdlTerminate(SimStruct *S)
{
}
 
/*========================================================*
 * See sfuntmpl_doc.c for the optional S-function methods *
 *========================================================*/
 
/*=============================*
 * Required S-function trailer *
 *=============================*/
 
#ifdef  MATLAB_MEX_FILE    /* Is this file being compiled as a MEX-file? */
#include "simulink.c"      /* MEX-file interface mechanism */
#else
#include "cg_sfun.h"       /* Code generation registration function */
#endif
Je lance un mex -c -IC:\Subsystem_ert_rtw sfun_de_pierre.c afin d'obtenir un .obj de la s-founction.

Je lance un mex sfun_de_pierre.obj C:\Subsystem_ert_rtw\Subsystem.obj C:\Subsystem_ert_rtw\Subsystem_data.obj afin d'obtenir une fichier mex32w32 (les 2 derniers.obj sont issus de la génération automatique via ert_rtw et sont utilisés via l'appel de la routine mdlOutputs de la s-fonction).

Ensuite je réintroduit dans un block s-function sous simulink le fichier .mexw32 et j'ai le message d'erreur suivant:
"Error in 'untitled/S_FUNC_PIERRE' while executing C MEX S-function 'sfun_de_pierre', (mdlOutputs), at time 0. MATLAB error message:"
sans plus de précision...

Quelqu'un a-t-il une idée ?