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

Variablenübergabe bei Timer-Verwendung, waitfor()-Funktion

 

pfeili
Forum-Century

Forum-Century


Beiträge: 177
Anmeldedatum: 27.08.08
Wohnort: ---
Version: R2019b
     Beitrag Verfasst am: 17.03.2011, 20:58     Titel: Variablenübergabe bei Timer-Verwendung, waitfor()-Funktion
  Antworten mit Zitat      
Liebe Leute,

ich habe ein Programm zum Positionieren und Auslesen einer Druckmesssonde geschrieben, welches aus einem GUI mittels Pushbutton gestartet wird. Die Sonde starte im Kernstrahl einer Düse, fährt auf x-Startposition, misst über den x-Querschnitt in mm-Schritten, nimmt an jedem Punkt 30 Werte auf, mittelt sie für jeden Punkt zu einem Wert, fährt nach Beendigung wieder in den Nullpunkt, danach weiter in die z-Startposition, misst über den z-Querschnitt wieder genauso, fährt in den Ausgangspunkt, entfernt sich entlang der y-Achse eine definierte Strecke von der Düse und macht das gleiche Spiel wieder von vorn. Nach jedem Gesamtdurchlauf i werden die Messwerte in eine Matrix "strahl_x" gespeichert. Die z-Komponente habe ich (hoffentlich vollständig) aus diesem Beispiel heraus genommen, um etwas mehr Übersicht zu schaffen. Hier der Code des Hauptprogramms

Code:

function button_messen_Callback(hObject, eventdata, handles)

% Bezug auf in OpeningFcn deklarierte serielle Schnittstelle
global s

% Abgreifen der Eingabewerte für die Achsen aus GUI
messbereich_x = str2double(get(handles.messbereich_x, 'String'));
messbereich_y = str2double(get(handles.messbereich_y, 'String'));

schrittweite_x = str2double(get(handles.schrittweite_x, 'String'));
schrittweite_y = str2double(get(handles.schrittweite_y, 'String'));

schleifenzahl_x = messbereich_x + 1;
schleifenzahl_y = messbereich_y/schrittweite_y;

zahl_x_werte = (messbereich_x/schrittweite_x)+ 1;

% Vorbereiten einer zu beschreibenden Matrize für x-Werte
strahl_x = zeros(schleifenzahl_y,zahl_x_werte);

for i = 1:schleifenzahl_y

%% Messen in x-Richtung
% Fahren in Startposition
schrittzahl = 160 * 15;
sendestring = String_an_GroTrav(num2str(schrittzahl), 1);
fprintf(s,[sendestring 13])
pause(4)

x_werte = zeros(1,31);
% Aufruf der Timer-function
messen_timer
% 1. Messwert am Ausgangspunkt
x_werte(1) = str2double(get(handles.edit_messen, 'String'));
for n = 2:schleifenzahl_x
    sendestring = String_an_GroTrav(num2str(-160), 1);
    fprintf(s,[sendestring 13])
    messen_timer
    x_werte(n) = str2double(get(handles.edit_messen, 'String'));
end

% Fahren in Ausgangsposition
schrittzahl = 160 * 15;
sendestring = String_an_GroTrav(num2str(schrittzahl), 1);
fprintf(s,[sendestring 13])
pause(3)

% Figure erzeugen
figure
% Plotten der Messreihe
plot(1:31, x_werte)
% Schreiben der aktuellen Messreihen in vorbereitete Matrizen
strahl_x(i,:) = x_werte
% Löschen der aktuellen Messreihe
clear x_werte

%% axiale Verschiebung der Sonde von der Düse weg
sendestring = String_an_GroTrav(num2str(160*schrittweite_y), 2);
fprintf(s,[sendestring 13])
pause(6)
end

 


Hier der Code für die Timer-function:

Code:

function messen_timer(hObject, eventdata, handles)

clc

% Timer vorbereiten
T = timer(...
    'Name'          , 'Timer1',...
    'Tag'           , 'Druckmessdose',...
    'Period'       ,  0.01,...
    'ExecutionMode',  'fixedDelay',...
    'TimerFcn'     ,  {@mittelwert},...
    'StartFcn'     ,  {@mittelwert},...
    'StopFcn'      ,  {@mittelwert});


% Timer starten
start(T)
 


Code:

function mittelwert(T, event)

persistent sample n

switch (event.Type)
   case 'StartFcn'
        % Registering the Hardware Driver Adaptor
        daqregister('C:/Programme/Keithley Instruments/DAQAdaptorforMATLAB/dtol.dll');
        % Erstellt ein Analoges Input-Objekt mit 'dtol' als Adapter
        ai = analoginput ('dtol');
        % Zuordnen des Kanals 0 zum Analogen Input-Objekt
        addchannel(ai, 0);

    case 'TimerFcn'
        % Anzahl bisheriger Timer-Durchläufe
        n = T.TasksExecuted;
        % Abtasten des Analogen Input-Objektes
        sample(n) = getsample(ai);
        % 30 Messwerte aufnehmen
        if n == 30
            stop(T)
        end

    case 'StopFcn'
        % Mittelwert bilden
        mean_sample = mean(sample);
        set(findobj('Tag','edit_messen'), 'String',
sprintf('%.7f',mean_sample))
        clear ai
        clear sample
end

end
 


Nun meine Fragen:

1. Wie kann ich den gemittelten Wert der 30 Messwerte direkt aus der Funktion "mittelwert" herausgeben und in strahl_x(n) speichern, ohne den Umweg über: Mittelwert in der TimerFcn bilden -> in GUI-Feld schreiben -> von dort den Wert ins Hauptmenü einlesen?

2. Wie kann ich es umgehen, in jeder timer-StartFcn erneut das analoge inputobjekt zu erstellen? Kann ich das im Hauptmenü als globale Variable definieren und hier wieder aufrufen? Scheinbar bereitet das Matlab irgendwann Probleme. Irgendwann kommt das ganze außer Takt und funktioniert nicht mehr. (Es muss daran liegen, dass während der längeren Positionierungen, der Code schon weiterläuft, weshalb ich da erstmal provisorisch diese unschönen Pausen eingebaut habe.) Die dann ausgegebene Fehlermeldung kann ich allerdings erst morgen posten. Ich verwende als ADC-Modul das KUSB3116 von Keithley.

3. Wie benutze ich die Funktion "waitfor(timerObj)", damit erst die Timer-Fcn beendet ist, bevor die Sonde weiterrückt? Woher kennt mein Hauptmenü das TimerObject? Hier habe ich die Variablenübergabe noch nicht verstanden. Kann ich hier einfach:
Code:

[T] = timer_messen
waitfor(T)
 

schreiben?

Ich danke euch für jegliche Hilfe und entschuldige mich für diese enormen Ausführungen.

Herzliche Grüße

pfeili
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.