Hallo zusammen,
ich suche nach einer Möglichkeit, in einer Schleife im Zwei-Sekundentakt eine if-Abfrage zu starten. Hat da jemand vielleicht eine Idee?
Ich habe bis jetzt folgendes ausprobiert, allerdings läuft die Funktion nur 59 Sekunden und dann geht die Funktion nicht mehr in die if-Abrage rein. Der Grund dafür ist: 59+2 =61. Kann man den Zähler nur bis 60 zählen lassen und dann wieder von vorne?
Code:
takt = 2;
t = fix(clock);
count2 = t(end);
while1
t = fix(clock);
time_sec = t(end);
if time_sec == (count2 + takt )
Wechselrichter abfragen;
count2 = time_sec;
end end
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Hallo Harald,
vielen Dank für den Tipp mit Timer. Es funktioniert auch so weit. Allerdings würde ich dich gerne fragen, wie ich den abgefragten Wert dem Hauptprogramm übergeben kann. Ich habe leider dazu kein Beispiel gefunden und meine eigenen Bemühungen haben nicht zum gewünschten Erfolg geführt. Über eine Antwort würde ich mich sehr freuen.
Danke im Voraus.
Gruß Edi
Code:
%% IP-Adressen sowie die Zusammensetzung der Wechselrichter % ClusterController = uint16([2562 36209]); % IP-Adresse Cluster Controller in 16Bit Format
SunnyBoy1 = uint16([256236206]); % IP-Adresse Sunny Boy 1 in 16Bit Format
SunnyBoy2 = uint16([256236207]); % IP-Adresse Sunny Boy 2 in 16Bit Format
Tripower = uint16([256236208]); % IP-Adresse Tripower in 16Bit Format
Init.inverterVariation = 1;
switch Init.inverterVariation% Festlegung der Variation von Wechselrichtern case1
Inverter = {SunnyBoy1};
case2
Inverter = {SunnyBoy2};
case3
Inverter = {SunnyBoy1, SunnyBoy2};
case4
Inverter = {Tripower};
case5
Inverter = {SunnyBoy1, Tripower};
case6
Inverter = {SunnyBoy2, Tripower};
otherwise
Inverter = {SunnyBoy1, SunnyBoy2, Tripower};
end
takt = 2;
Timer = timer;
Timer.Period = takt;
Timer.TasksToExecute = 3;
Timer.ExecutionMode = 'fixedRate';
Timer.TimerFcn = @(~, ~)queryInverter(Inverter);
start(Timer);
function queryInverter(Inverter) Power = 0;
for i = 1:length(Inverter)% Abfrage der Wechselrichter [p, status] = f_ModbusInverter(cell2mat(Inverter(i))); % Abfrage über Modbus if status ~= 0; return% Fehlerstatus end Power = Power + p; % Die Energieertrag einzelner Wechselrichter wir aufaddiert % disp(Power); end end
das sollte bei Timern eigentlich nötig sein. Stattdessen die gesamte Analyse in die Timer-Funktion einbauen.
Außerhalb der Funktion verfügbar machen kannst du das nur z.B. über nested functions.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
danke noch mal für die Hilfestellung. Für alle, die sich mit Thema 'Timer' beschäftigen, habe ich mein Code in einer abgespeckten Verfassung hochgeladen. Es geht auf erste Linie um Verständnis.
Gruß Edi
%% Timer-Funktion function queryInverter(obj,~,Inverter, LP, Modbus) global timerVar % globale Variable wird gesetzt, diese wird...
timerVar = myTimer; % ... zum manuellen Stop des Timers benötigt
% Fehlerstatus wird bis drei nacheinander hochgezählt, kommt % zwischendurch keine Fehlermeldung, wird err wieder auf Null gesetzt if status ~= 0
err = err+1; % Fehlerstatus wird um 1 erhöht
obj.UserData{9} = err; % Error wird gespeichert if err >= 3
TimerError(obj); % Programmabbruch wird angeleitet end return% Abbruch else
err = 0;
obj.UserData{9} = err;
end % Ausgabe disp(.....);
% Speicherung der Variablen, die Ihre Werte beibehalten sollen
obj.UserData{1} = count;
obj.UserData{2} = count2;
assignin('base', 'P', timerVar); % Möglichkeit das Programm manuell zu stoppen end
%% Funktion für die Initialisierung des Timers function initTimer(obj,~)
count = 0;
count2 = 0;
%% Funktion zum Löschen des Timer-Objektes function TimerCleanup(obj,~) disp('Entweder ist der Timer gestoppt oder die angestellte Zeit abgelaufen.');
delete(obj);
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
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.