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

Zwei-Sekundentakt if-Abfrage

 

edi
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 08.05.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.07.2018, 11:57     Titel: Zwei-Sekundentakt if-Abfrage
  Antworten mit Zitat      
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);
while 1
    t = fix(clock);
    time_sec =  t(end);
    if time_sec == (count2 + takt )
        Wechselrichter abfragen;
        count2 = time_sec;
    end
end
 


Vielen Dank im Voraus.

Gruß Edi
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.497
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.07.2018, 17:48     Titel:
  Antworten mit Zitat      
Hallo,

die Funktion timer wäre genau dafür gedacht.

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
edi
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 08.05.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.07.2018, 20:08     Titel:
  Antworten mit Zitat      
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([2562 36206]);        % IP-Adresse Sunny Boy 1 in 16Bit Format
SunnyBoy2           = uint16([2562 36207]);        % IP-Adresse Sunny Boy 2 in 16Bit Format
Tripower            = uint16([2562 36208]);        % IP-Adresse Tripower in 16Bit Format
Init.inverterVariation = 1;
switch Init.inverterVariation                      % Festlegung der Variation von Wechselrichtern
    case 1
        Inverter = {SunnyBoy1};
    case 2
        Inverter = {SunnyBoy2};
    case 3
        Inverter = {SunnyBoy1, SunnyBoy2};
    case 4
        Inverter = {Tripower};
    case 5
        Inverter = {SunnyBoy1, Tripower};
    case 6
        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
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.497
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 31.07.2018, 21:37     Titel:
  Antworten mit Zitat      
Hallo,

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
edi
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 08.05.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.08.2018, 23:35     Titel:
  Antworten mit Zitat      
Hallo Harald,

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

Code:

%% Einstellungen für den Timer
myTimer = timer;
myTimer.StartFcn        = @initTimer;                                       % Startfunktion (siehe 'initTimer'-Funktion
myTimer.TimerFcn        = {@queryInverter, Inverter, LP, Modbus};                   % Ausführende Funktion
myTimer.StopFcn         = @TimerCleanup;                                    % Stopfunktion (siehe 'TimerCleanup'-Funktion
myTimer.ErrorFcn        = @TimerError;                                      % Fehlermeldung und Abbruch des Timers
myTimer.Period          = Init.takt;                                        % Abfragetakt
myTimer.StartDelay      = 2;                                                % Startverzögerung
myTimer.TasksToExecute  = 2000/myTimer.Period;               % Anzahl der Schleifen
myTimer.ExecutionMode   = 'fixedDelay';                                     % Startpunkt des nächsten Taktes
myTimer.BusyMode        = 'drop';                                           % Anreihung der Befehle
% Timer.UserData = [0, 66, 0, 0, 'OFF', 0];
start(myTimer);

%% 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
       
    % Variablenübergabe
    count           = obj.UserData{1} + 1;
    count2          = obj.UserData{2} + 1;

   
   
        [response, status] = f_Modbus(Modbus.ReadInput,100,1);       % Abfrage
        HitL.LP = response;


 
    % 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;
   
    obj.UserData = {count, count2};
    HitL.time       = 0;
    HitL.LP         = 0;
end

%% Funktion zum Löschen des Timer-Objektes
function TimerCleanup(obj,~)
    disp('Entweder ist der Timer gestoppt oder die angestellte Zeit abgelaufen.');
    delete(obj);
   
end

function TimerError(obj,~)
    stop(obj);
    disp('Fehlermeldung!');
end

 
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.