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

timer im timer programmieren

 

pfeili
Forum-Century

Forum-Century


Beiträge: 177
Anmeldedatum: 27.08.08
Wohnort: ---
Version: R2019b
     Beitrag Verfasst am: 18.02.2011, 14:10     Titel: timer im timer programmieren
  Antworten mit Zitat      
Hallo Leute,

nachdem ich die einfache Timer-Programmierung m.E. begriffen habe, hänge ich jetzt bei einer verschachtelten fest. Vielleicht erst mal mein Ansinnen:

Über die Callback eines Pushbuttons starte ich eine Timerfunktion:

Code:
function button_messen_Callback(hObject, eventdata, handles)
trigger_timer


Der Timer wird so initialisiert (Danke Denny!):

Code:
function trigger_timer(hObject, eventdata, handles)
clc

try delete(instrfind)
catch 'Error'
end

% Timer vorbereiten
T = timer(...
    'Name'          , 'Timer1',...
    'Tag'           , '2144-Trigger',...
    'Period'       ,  0.001,...
    'ExecutionMode',  'fixedDelay',...
    'TimerFcn'     ,  {@actual_status},...
    'StartFcn'     ,  {@actual_status},...
    'StopFcn'      ,  {@actual_status});

% Timer starten
start(T)


...und bezieht sich auf:

Code:
function actual_status(timerObj, event)
persistent serial1 serial5;
switch (event.Type)
   case 'TimerFcn'
      % Messmenü öffnen
      fprintf(serial1,'M_M')
      % Abfrage nach Actual_Status Averaging
      fprintf(serial1,'A_S? A')
      % Empfangen des Status
      Status = fscanf(serial1);
      %Status(7:8)
     if strcmp(Status(7:8),'RU') == 1
         disp('Messung gestartet...')
         disp(datestr(now))
         stop(timerObj);
     elseif strcmp(Status(7:8),'RE') == 1
         disp('Herstellen des Wartezustands...')
         disp(datestr(now))
         fprintf(serial1,'A_C Sta')
     elseif strcmp(Status(7),'F') == 1
         disp('Herstellen des Wartezustands...')
         fprintf(serial1,'A_C Sta')
         disp(datestr(now))
     end
   case 'StartFcn'
      % Analysator-Schnittstelle konfigurieren
      serial1 = serial('com1', 'DataBits', 8, 'Parity', 'none',...
                       'StopBits', 1, 'BaudRate', 9600);
      % Almemo-Schnittstelle konfigurieren
      serial5 = serial('com5', 'DataBits', 8, 'Parity', 'none',...
                       'StopBits', 1, 'BaudRate', 115200, 'Terminator', 3);
      %Herstellen der seriellen Verbindung
      fopen(serial1);
      fopen(serial5);
   case 'StopFcn'
      fprintf(serial1, 'C_S_R?')
      fscanf(serial1)
      % hier beginnt Almemo-Messung
      almemo_timer
      flushinput(serial1)
      fclose(serial1);
      delete(serial1);
      clear serial1;
end


Nun meine eigentliche Schwierigkeit. Ich möchte, dass eine weitere Triggerfunktion durch die StopFcn des ersten Triggers ausgelöst wird, welche ich so definiere:

Code:

function almemo_timer(hObject, eventdata, handles)
clc


% Timer vorbereiten
T_Almemo = timer(...
    'Name'          , 'Timer2',...
    'Tag'           , 'Almemo-Timer',...
    'Period'       ,  0.01,...
    'ExecutionMode',  'fixedDelay',...
    'TimerFcn'     ,  {@almemo_auslesen},...
    'StartFcn'     ,  {@almemo_auslesen},...
    'StopFcn'      ,  {@almemo_auslesen});

% Timer starten
start(T_Almemo)


Und schließlich soll dort eine Messwertabfrage an ein weiteres Gerät gestartet werden und eine Grafik, welche die separierten Messwerte pro Durchlauf plottet und beim Stoppen in eine Exceldatei schreibt.

Code:
function almemo_auslesen(timerObj, event, serial5)

switch (event.Type)
   case 'StartFcn'
        disp('Almemo-Messgerät gestartet...')
        disp(datestr(now))
        grafik = figure('Name', 'Grafik');
    case 'TimerFcn'
        figure(grafik)
        % Senden der Messstellenabfrage für alle aktiven Messkanäle
        fwrite(serial5, 's')
        % Empfangen der 65 Zeichen und transponierte Umwandlung Dec->Char
        char(fread(serial5, 65)')
        % Leerzeichen entfernen
        messwert_M = strrep(ans, ' ', '');
        % Anzahl bisheriger Durchläufe
        n = T_Almemo.TasksExecuted
        % Messzeit als Cell-Array separieren
        messzeit(n) = {messwert_M(5:15)};
        % Absolutdruck separieren
        messwert_M00(n) = str2double(messwert_M(20:25));
        % Geschwindigkeit separieren
        messwert_M01(n) = str2double(messwert_M(31:37));
        % Differenzdruck separieren
        messwert_M11(n) = str2double(messwert_M(43:49));
       
        % punktuelles Plotten
        plot(1:n,messwert_M00, 'r+', 1:n, messwert_M01, 'kx', 1:n, messwert_M11, 'm*')
        grid
   
   case 'StopFcn'
        close(grafik)
        % Speichern in Excel-Datei des angegebenen Verzeichnisses
        XLSWRITE('C:\Users\frothe\Desktop\messung.xlsx',messzeit', ['A2:A' num2str(n+1)])
        XLSWRITE('C:\Users\frothe\Desktop\messung.xlsx',messwert_M00', ['B2:B' num2str(n+1)])
        XLSWRITE('C:\Users\frothe\Desktop\messung.xlsx',messwert_M01', ['C2:C' num2str(n+1)])
        XLSWRITE('C:\Users\frothe\Desktop\messung.xlsx',messwert_M11', ['D2:D' num2str(n+1)])        
end


Meine erste Frage ist, dass es innerhalb des zweiten Timers Probleme mit der Variablendeklaration gibt. Es taucht folgende Fehlermeldung auf:


Zitat:
Almemo-Messgerät gestartet...
18-Feb-2011 12:49:15
??? Error while evaluating TimerFcn for timer 'Timer2'

Undefined function or variable "grafik".

??? Error while evaluating StopFcn for timer 'Timer2'

Undefined function or variable "grafik".


Man sieht also schon, wie weit es läuft (über das Erreichen der StopFcn des zweiten Timers mache ich mir erst später Gedanken). Es soll erstmal nur kontinuierlich zeichnen. Also ist meine erste Frage: Wie muss ich die Verwendung der Variablen bewerkstelligen.

Ich weiß, dass es sehr umfangreich ist, hoffe aber trotzdem auf eure Hilfe.

Vielen Dank.

pfeili
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 18.02.2011, 17:27     Titel:
  Antworten mit Zitat      
Hallo Pfeili,

Du könntest die Variable "grafik" in den UserData des Timers speichern und dort auch wieder auslesen:
Code:
grafik = figure;
UserData.grafik = grafik;
set(timerObj, 'UserData', UserData);

% bzw:
UserData = get(timerObj, 'UserData);
grafik = UserData.grafik;
...

Gruß, Jan
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.