|
|
c_code in S-funktion_ Kontinuierlich??Scleifen ?? |
|
nikolor |
Forum-Anfänger
|
|
Beiträge: 17
|
|
|
|
Anmeldedatum: 11.02.08
|
|
|
|
Wohnort: Hamburg
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 08.05.2009, 11:46
Titel: c_code in S-funktion_ Kontinuierlich??Scleifen ??
|
|
|
|
|
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
|
|
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
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
| RSS
Hosted by:
Copyright © 2007 - 2025
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.
|
|