WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

c_code in S-funktion_ Kontinuierlich??Scleifen ??

 

nikolor
Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 11.02.08
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 08.05.2009, 12:46     Titel: c_code in S-funktion_ Kontinuierlich??Scleifen ??
  Antworten mit Zitat      
Es geht mir im Prinzip darum wie ich in der S-Funktion Schleifen in C-code einbinde ---- also kontinuierlich rechne ...oder differenziere .......
d.h das mir der S-funktionsblock kontinuierlich rechnet ..Ich versuch ihier wie so ein wilder ::;(






Ich hab eine Frage bezüglich des Einsatzes de S-Funktionblockes.
Erstmal zum testen hab ich ein Reihenschwingkreis programmiert derin simulink durch eine Sprungfunktion angeregt wird (1) . Im Scope erwarte als Ausgangsignal ein verzögerten Anstieg (PT1) bis zum erreichen eines Endwertes .

Programmiert als m-file und als Matlabfunktion funkioniert das ganze wunderbaR Versuche ich das ganze in C-Code und binde das über die S-funktion ein.........kommt nur ein Sprungsignal raus.

Für mich stellt sich die Frage warum ????? Ich habe beide Codes mal unten reingeschrieben .......muss allerding gestehn das ich noch kein Programmier Profi bin ......eher etwas fortgeschritten....oder habe ich da etwas grundsätzliches übersehen ???? Mir geht das um das Grundverständnis..wo denn hier der Unterschied liegt ?????









S-funtionsblock:


unction [sys,x0,str,ts] = RCckt_sfcn(t, x, u, flag, xinit)

switch flag

case 0,

str = [];
ts =[0 0];
x0 = xinit;

sizes = simsizes;

sizes.NumContStates = 1; %Anzahl der zeitkontinuirlichen Zustandsvariablen [hier 1]
sizes.NumDiscStates = 0; %Anzahl der Zeitdiskreten variablen
sizes.NumOutputs = 1; % Anzahl der Ausgänge
sizes.NumInputs =1; % Anzahl der Eingänge
sizes.DirFeedthrough = 0; %Flag setzen für direct Feedtrough
sizes.NumSampleTimes = 1; %

sys = simsizes(sizes);

case 1,

Vs = u;

sys = RCckt (t, x, Vs);

case 3,

sys = x;

case {2 4 9}

sys = [];

otherwise

error ( ['unhandled flag =',num2str(flag)]);

end

it zugehöriger m- file Datei:

function dx = RCckt(t,x,Vs)

R = 10^6;
C = 10^(-6);
dx = -1/(R*C)*x+Vs;

Und jetzt die S-funktion mit eingebundenen C-Code:

#define S_FUNCTION_NAME RCkreis
#define S_FUNCTION_LEVEL 2
#include "simstruc.h"

static void mdlInitializeSizes(SimStruct *S)



{
ssSetNumSFcnParams(S, 1);
if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) {
return;
}



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);


ssSetOptions(S,
SS_OPTION_WORKS_WITH_CODE_REUSE |
SS_OPTION_EXCEPTION_FREE_CODE |
SS_OPTION_USE_TLC_WITH_ACCELERATOR);
}

static void mdlInitializeSampleTimes(SimStruct *S)
{
ssSetSampleTime(S, 0, INHERITED_SAMPLE_TIME);
ssSetOffsetTime(S, 0, 0.0);
ssSetModelReferenceSampleTimeDefaultInheritance(S);
}


static void mdlOutputs(SimStruct *S, int_T tid)
{
InputRealPtrsType uA_in = ssGetInputPortRealSignalPtrs(S,0);


real_T *Pa_A = mxGetPr(ssGetSFcnParam(S,0));

int_T width = ssGetOutputPortWidth(S,0);

real_T *y = ssGetOutputPortRealSignal(S,0);
real_T EinA;
real_T C ;
real_T Vs;
real_T R ;
int i ;

// Handhabung Pointer

Vs = *Pa_A;
R = 100;
C = 1;

// Funktionsaufruf

for (i=0; i< width; i++){

*y++ = -1/(R*C) *(*uA_in[i]) + Vs;
}


}


static void mdlTerminate(SimStruct *S)
{
}



#ifdef MATLAB_MEX_FILE
#include "simulink.c"
#else
#include "cg_sfun.h"
#endif

Sad Sad Confused Question Question Wink Wink Wink Wink Wink Wink Sad
Private Nachricht senden Benutzer-Profile anzeigen


Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.