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

Variabler Operator/Komperator in if-Anweisung

 

RienSte
Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 08.09.15
Wohnort: Salzburg / Österreich
Version: ---
     Beitrag Verfasst am: 22.12.2015, 10:47     Titel: Variabler Operator/Komperator in if-Anweisung
  Antworten mit Zitat      
Guten Tag,

gibt es eine Möglichkeit, die Operatoren / Komperatoren bei if-Anweisungen dynamisch zu gestalten?
Der User soll auf einer GUI bzw. in einem csv-File nur bestimmen, welche Signale er vergleicht und vor allem WIE er sie vergleicht (und natürlich Parameter, die beim Zutreffen seiner Bedingungen gesetzt werden, aber das tut hier nichts zur Sache) und auch, wie die Konditionen (in Summe 4) zusammenhängen.

Wenn ich jetzt alle Eventualitäten ausprogrammiere (~ 100 Signale, 4 Konditionen (Bsp.: Cond_A && Cond_B || Cond_C && Cond_D), 4 Komperatoren (<, >, =, !=)) werden ich alt und der Quellcode unendlich lang.

Das Ganze wird dann per Matlab / Simulink Coder auf eine Realtime-Target Hardware übertragen. Der User hat aber mit Programmierung nix zu tun, der soll sich einfach nur aussuchen, was er wie und warum miteinander vergleicht und was dann passiert.

Als Bsp. im csv file steht:
Signal_A;temp
Comp_A;2 (bedeutet >)
Tresh_A;100
Cond_AB;2 (bedeutet ||)
Signal_B;rpm
Comp_B;2 (bedeutet >)
Tresh_B;5000

Quellcode sieht dann so aus:
WENN temp > 100 || rpm > 5000 DANN whatever (zB Abschalten!)

Danke schon mal im Voraus!!

Grüße,
Stephan
Private Nachricht senden Benutzer-Profile anzeigen


Friidayy
Forum-Century

Forum-Century


Beiträge: 225
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 22.12.2015, 11:39     Titel:
  Antworten mit Zitat      
Hallo RienSte,

wenn ich dich richtig verstehe, dann möchtest du eine variable/dynamische Anzahl an if-Anweisungen, die abhängig von den Benutzereingaben sind, haben?

Ich kann dir keine konkrete Lösung geben, aber du wirst wahrs. mit dem Befehl eval arbeiten müssen.

http://de.mathworks.com/help/matlab.....dDomain=www.mathworks.com

Das Beispiel auf der Seite ist ja schonmal ca. das was du machen möchtest, nur dass du noch Schleifen + weitere Logik benötigst.

Code:
aMatrix = magic(5);
expression = input('Enter the name of a matrix: ','s');
if (exist(expression,'var'))
    mesh(eval(expression))
end
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.12.2015, 11:54     Titel:
  Antworten mit Zitat      
Hallo,

am sinnvollsten dürfte dann sein, zur Laufzeit eine .m-Datei als Textdatei zu schreiben.

Code:
fid1 = fopen('commands.csv');
content = textscan(fid1, '%s %s', 'Delimiter', ';');
option = content{1};
choice = content{2};
fclose(fid1);

fid2 = fopen('commands.m', 'w');
fprintf(fid2, '%s', 'if ');
for I = 1:numel(option)
    switch option{I}
        case {'Signal_A', 'Signal_B'}
            fprintf(fid2, '%s ', choice{I});
        case {'Tresh_A', 'Tresh_B'}
            fprintf(fid2, '%s ', choice{I});
        case {'Comp_A', 'Comp_B'}
            switch choice{I}
                case '2 ' % bedeutet >
                    fprintf(fid2, '%s', '> ');
                    % weitere Cases
            end
        case 'Cond_AB'
            switch choice{I}
                case '2 ' % bedeutet ||
                    fprintf(fid2, '%s', '|| ');
                    % weitere Cases
            end
        otherwise
            warning('Unrecognized option')
    end
end
type commands.m


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 08.09.15
Wohnort: Salzburg / Österreich
Version: ---
     Beitrag Verfasst am: 22.12.2015, 11:54     Titel:
  Antworten mit Zitat      
Ja, so ungefähr. Ich möchte nicht nur eine variable Anzahl, sondern das "Design" der if-Anweisungen sollte auch variabel sein. Also der Nutzer soll bspw. entscheiden, ob jetzt ein > oder ein < als Komperator verwendet wird und auch welche Signale/Werte an sich überhaupt verglichen werden (das ist nicht das Problem).

Sowas wäre mir am liebsten:

Code:

function [strategy1, strategy2] = fcn(speed, tresholdSpeed, temp, tresholdTemp, rpm, tresholdRPM, acc, tresholdAcc)


%% Das wird vom User festgelegt:
signal1A = speed;
comp1A = '>';
tresh1A = tresholdSpeed;

cond1AB = '&&';

signal1B = acc;
comp1B = '<';
tresh1B = tresholdAcc;

signal2A = rpm;
comp2A = '>';
tresh2A = tresholdRPM;

cond2AB = '&&';

signal2B = temp;
comp2B = '<';
tresh2B = tresholdTemp;


%% die if-Anweisungen werden dann automatisch "befüllt" / "erstellt"
if signal1A comp1A tresh1A cond1AB signal1B comp1B tresh1B
strategy1 = 1
else
strategy1 = 0
end

if signal2A comp2A tresh2A cond2AB signal2B comp2B tresh2B
strategy2 = 1
else
strategy2 = 0
end

 


EDIT: Danke an Harald, das geht stark in die Richtung, in die ich möchte!
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 - 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.