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

exist-Funktion in Funktion in einem Simulink Modell

 

Raketenmaid
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 28.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.04.2013, 14:11     Titel: exist-Funktion in Funktion in einem Simulink Modell
  Antworten mit Zitat      
Ich komme nicht weiter.

Ich möchte die Existenz einer als innerhalb eines Funktionsblocks meines Simulinkmodels definierten Variable (Status persistent) überprüfen mittels Funktionsaufruf exist. Bekomme immer die Rückmeldung dass diese Funktion für Codegenerierung nicht unterstützt wird.

Hier der Code-Versuch:
Code:


function indx = fcn(t,t_swtch,Aset,Bset,A,B)
%#codegen

persistent check;

if t <= t_swtch
    u = 2;
else
    if A >= Aset
        check = 1;
    end
end

a = evalin('caller',exist('check'))

if check == 1
    u = 1;
else
    u = 2;
end

if B < Bset
    v = 1;
else
    v = 2;
end

indx = [u v];

 


mit der evalin Funktion habe ich versucht, die Existenz der Variable innerhalb des Workspaces der aufrufenden Funktion zu überprüfen in der Sorge, dass die Funktion exist von dieser Funktion indx aus nicht auf den allgemeinen Workspace zugreifen kann. Hat aber auch nichts geholfen. Das Problem scheint darin zu liegen, dass der Parser diese Funktion exist nicht einbinden kann (mein Bauchgefühl).

Jedenfalls schaut die Fehlermeldung so aus:

Zitat:
Function 'exist' is not supported for code generation. Consider using coder.extrinsic('exist') to bypass code generation.


Es wird mir empfohlen coder.extrinsic('exist' zu verwenden. Wie mache ich das und was bewirkt das?
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

bevor es an die eigentliche Frage geht:

Wenn du eine Variable als persistent definierst, existiert sie automatisch in diesem Bereich. Anfangs ist die Variable ein leeres Array. Wenn du also überprüfen willst, ob die Variable initialisiert wurde, kannst du isempty verwenden.
Mir erschließt sich nicht, was du erreichen willst, da du ja die Variable a gar nicht mehr verwendest.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 28.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.04.2013, 17:19     Titel:
  Antworten mit Zitat      
Ja, das ist ein Code, der noch unsauber ist. Ersetze bitte gedanklich die Zeile

Code:
if check == 1


mit

Code:


Aber weder das eine noch das andere führt auf einen ausführbaren Code. Die Frage ist, warum kann ich nicht exist verwenden? isempty funktioniert, trifft aber, wenn ich das richtig verstanden habe, nicht ganz das, was ich machen möchte, oder?
Private Nachricht senden Benutzer-Profile anzeigen
 
Raketenmaid
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 28.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.04.2013, 18:45     Titel:
  Antworten mit Zitat      
Damit vielleicht klarer ist, was ich erreichen möchte - so eigentlich:

Sobald die Simulationszeit einen bestimmten Wert erreicht (t_switch), soll A mit einem vorgegebenen Wert verglichen werden. Sobald A erstmalig diesen Wert überschreitet, soll u zu eins gesetzt werden und dort verharren, selbst wenn A wieder unter den vorgegebenen Wert sinkt.

Ich wollte das halt gerne mit einer persistent Anweisung erreichen und eben den geposteten Code. Aber er funktioniert einfach nicht! FRUST!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Die Frage ist, warum kann ich nicht exist verwenden?

Weil exist für die C-Code - Generierung nicht unterstützt wird.
http://www.mathworks.com/help/relea.....-for-code-generation.html
Ich bin kein Experte in dem Thema, aber mit coder.extrinsic kannst du eben bestimmte Befehle von der Einschränkung ausnehmen. http://www.mathworks.com/help/relea.....lref/coder.extrinsic.html
Was hält dich davon ab, das zu versuchen?


Zitat:
isempty funktioniert, trifft aber, wenn ich das richtig verstanden habe, nicht ganz das, was ich machen möchte, oder?

Das kann ich nicht beurteilen, weil mir nicht klar ist, was du machen willst - weniger auf die einzelnen Anweisungen bezogen als auf die gesamte Funktion.
Eine Erläuterung des Gesamtkontexts kann sehr dabei helfen, effiziente Hilfestellung zu leisten.

Grüße,
Harald

Edit: soeben erst die weitere Nachricht gelesen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

ich habe das mal für einen einfachen Fall getestet und angehängt.

In der Doku wird übrigens explizit darauf hingewiesen, dass man mit isempty arbeiten soll:
http://www.mathworks.com/help/relea.....persistent-variables.html

Grüße,
Harald

testModell.mdl
 Beschreibung:

Download
 Dateiname:  testModell.mdl
 Dateigröße:  35.41 KB
 Heruntergeladen:  404 mal
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.