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

Probleme mit s-function

 

Kronecker
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 08.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.06.2014, 13:53     Titel: Probleme mit s-function
  Antworten mit Zitat      
Hi,

muss eine PWM mit einer s-function erstellen und komme nicht weiter. Im Prinzip muss ich folgendes machen. Wenn die Eingangsgröße (u) im Intervall ]0,1[ liegt, soll das Tastverhältnis d bestimmt werden (Frequenz von Ts aus der s-function). Ist u<=0 soll 0 am Ausgang anliegen und wenn u>=1 dann 1. Am Beginn der Schaltperiode soll das Ausgangssignal auf den Wert 1 sein und nach einer Dauer t_{ein}=d\cdot Ts auf den Wert 0 zurückgehen.

Mein code sieht wie folgt aus (habe das template aus Matlab selbst verwendet und umgeschrieben):

Code:
function [sys,x0,str,ts] = pulsweitenmod(t,x,u,flag,pwm)
switch flag,
  case 0,
    [sys,x0,str,ts]=mdlInitializeSizes;
  case 1,
    sys=mdlDerivatives(t,x,u);
  case 2,
    sys=mdlUpdate(t,x,u);
  case 3,
    sys=mdlOutputs(t,x,u,pwm,ts);
  case 4,
    sys=mdlGetTimeOfNextVarHit(t,x,u);
  case 9,
    sys=mdlTerminate(t,x,u);
  otherwise
    error(['Unhandled flag = ',num2str(flag)]);
end
% end sfuntmpl

function [sys,x0,str,ts]=mdlInitializeSizes

sizes = simsizes;

sizes.NumContStates  = 0;
sizes.NumDiscStates  = 0;
sizes.NumOutputs     = 1;
sizes.NumInputs      = 1;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;   % at least one sample time is needed

sys = simsizes(sizes);

x0  = [];
str = [];
ts  = [0 0];
% end mdlInitializeSizes

function sys=mdlDerivatives(t,x,u)
sys = [];
% end mdlDerivatives

function sys=mdlUpdate(t,x,u)
sys = [];
% end mdlUpdate

function sys=mdlOutputs(t,x,u,pwm,Ts)
if((u < 1) && (u > 0))
    pwm.d = 1/Ts;
    if(t > pwm.d*Ts)
        sys = [0];
    else
        sys = [1];
    end
end
if(u >= 1)
    sys = [1];
end
if(u <= 0)
    sys = [0];
end
% end mdlOutputs

function sys=mdlGetTimeOfNextVarHit(t,x,u)
sampleTime = 1;    %  Example, set the next hit to be one second later.
sys = t + sampleTime;
% end mdlGetTimeOfNextVarHit

function sys=mdlTerminate(t,x,u)
sys = [];
% end mdlTerminate


pwm ist eine Struktur mit nur einem Parameter d (pwm.d), den ich bei der Initialisierung auf 0 gesetzt habe. In Simulink hab ich als Eingangssignal eine einfache Rampenfunktion hergenommen.

Bei mir kommt immer der Fehler:

Error in 'simpleES/PWM_sfun' while executing M-File S-function pulsweitenmod', flag = 3 (output), at time 0.
MATLAB error message: Undefined function or variable "ts".

Sehe da den Fehler aber nicht, bin mir aber auch nicht sicher, ob man alles in die Funktion mdlOutputs reintun kann, bzw. ob der Code überhaupt stimmt. Bin über jede Hilfe sehr dankbar!

mfg
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.06.2014, 22:07     Titel:
  Antworten mit Zitat      
Hallo,

deine Funktion hat 4 Ausgänge.
Außer für case 0 wird aber nur einer davon auch belegt, die anderen sind also undefiniert.
Im Fall case 3 versuchst du zudem, ts zu verwenden, ohne es vorher definiert zu haben.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Kronecker
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 08.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.06.2014, 09:57     Titel:
  Antworten mit Zitat      
Hallo,

danke für die Rückmeldung und sorry für meine späte Rückmeldung! Bin nun draufgekommen wie es funktioniert. Man muss eine zusätzliche diskrete Variable einsetzten (Tastverhältnis) und mit mdlGetTimeOfNextVarHit gibt man die Zeitpunkte an, die das Verhalten der asymmetrischen PWM bestimmen. In mdlOutputs wird dann das Ausgangssignal, je nach Zeitpunkt eingestellt. In mdlUpdate muss darf nur das Eingangssignal stehen.

mfg
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
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.