IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaces Graphiques Discussion :

GUI et Timer object [Débutant]


Sujet :

Interfaces Graphiques

  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2011
    Messages : 12
    Par défaut GUI et Timer object
    Bonjour à tous,
    j'essaie de faire marcher un timer dans un programme GUI mais j'arrive pas. En fait mon timer sert à envoyer sur une carte NI DAQ usb 6008 un échantillon d'un signal sinusoïdal toutes les 0.005 secondes à partir du moment où je cliques sur un bouton start.

    J'ai écrit alors la callback du bouton start comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    function start_Callback(hObject, eventdata, handles)
                %Je récupère la fréquence, le nb de période et le pourcentage   d'amplitude du signal saisis par l'utilisateur
    
                freq=str2double(get(handles.frequencyValue,'String'));
                nb_period=str2double(get(handles.PeriodsNbValue,'String'));
                percentage=str2double(get(handles.AmplitudeValueStatic,'String'));
                amplitude=2.5*(percentage/100);
                
                %Number of samples
                nb_samples=(1/(freq*0.005))*nb_period;
                t = linspace(0,2*pi*nb_period,nb_samples);
                data=sin(t)+amplitude;
                i=1;
       
                t1 = timer('TimerFcn',  'putsample(handles.AO,data(i));i=i+1;',...
                      'StartDelay',0,'StopFcn',{'myStopFunc',handles.AO},...
                      'ExecutionMode','fixedRate',...
                      'Period',0.005);
                  
                start(t1);
                handles.t1=t1;
    sachant que handles.AO est ma sortie analogique, j'avais l'erreur suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ??? Error while evaluating TimerFcn for timer 'timer-90' 
    
    Undefined function or variable 'handles.AO'.
    Matlab ne reconnait pas alors ma sortie analogique. Bizarre parce qu'il l'a reconnu dans la "StopFcn"!
    J'ai essayé alors de changer la syntaxe en mettant les deux lignes dans une fonction myCallbackFunc comme je l'ai fait pour la "StopFnc" comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    
    t1 = timer('TimerFcn',  {'myCallbackFunc', AO.handles,data,k},...
                      'StartDelay',0,'StopFcn',{'myStopFunc',handles.AO},...
                      'ExecutionMode','fixedRate',...
                      'Period',0.005);
    avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function [] =myCallbackFunc(object,event,channel,data,k)
    putsample(channel,data(k));
    k=k+1;
    end
    En faisant ça matlab reconnait ma sortie analogique mais il y a un petit soucis par rapport à l'incrémentation de la variable k. En fait, à chaque fois où matlab appelle la fonction "myCallbackFunc", la variable k est initialisé à sa première valeur(k=1), ce qui est tout à fait logique.


    Est ce que vous voyez comment faire pour résoudre ce problème sachant que quand je n'utilisais pas une interface graphique mon timer marchait très bien et j'arrive à avoir mon sinus?


    Merci en avance

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Dans la première 'version' que tu présentes, le problème ne vient pas de la définition du timer (qui me semble bonne d'ailleurs, à un détail près que je détaille à la fin*), mais du fait que handles.AO n'est pas défini dans ton callback.
    Vient alors quelques déductions:
    - Soit tu ne l'as pas défini avant l'exécution du callback, et tu dois alors le faire
    - Soit tu l'as défini, mais pas 'sauvegardé' dans ta structure handles. Vient alors ma question: as-tu rajouté la ligne après cette définition?

    Dans ta deuxième 'version':
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    t1 = timer('TimerFcn',  {'myCallbackFunc', AO.handles,data,k},...
    le problème est que si tu fais passer les arguments comme ceci, chaque appel de la fonction utilisera la valeur que tu as donné à ce moment-là aux arguments. Ce n'est pas un problème pour data, mais pour k...
    Une solution serait alors d'utiliser la structure handles comme pour le reste. Ton callback deviendrait alors quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    handles.k = 1;
    t1 = timer('TimerFcn',  {'myCallbackFunc',data},...
    guidata(gcbf,handles);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function myCallbackFunc(object,event,data) % [] inutile ici
        handles = guidata(gcbf); % récupération structure
        putsample(handles.AO,data(handles.k));
        handles.k = handles.k+1;
        guidata(gcbf,handles); % sauvegarde structure
    end
    * Pour finir, il faudra que ton timer s'arrête lorsque i (respectivement k) atteindra la longueur de ta variable data, tu peux pour cela renseigner la propriété 'TasksToExecute' du timer avec
    Remarque: ton callback peux aussi utiliser la propriété 'TasksExecuted' du timer, tu n'as alors plus besoin de k et ta fonction se simplifie en:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    t1 = timer('TimerFcn',  {'myCallbackFunc', handles.AO,data},...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function myCallbackFunc(object,event,channel,data)
        putsample(channel,data(object.TasksExecuted));
    end
    Dernière modification par Invité ; 23/03/2019 à 14h08.

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2011
    Messages : 12
    Par défaut
    Merci infiniment. Tu m'a sauvé la vie.
    Je voulais juste te dire que j'ai bien défini la sortie analogique avant le callback, je l'ai sauvegardé dans ma structure handles et j'ai bien rajouté la ligne . Donc le problème de la première version n'était pas la définition de l'analog output. J'ai pas mal cherché sur internet hier et j'ai trouvé ça:
    When you use a string for a timer callback (or a gui object for that matter), MATLAB evaluates them like you entered them at the command line, not like they are running inside the function where the timer was created. Instead of a string, use a cell array, with the function handle for the timer callback function as the first input:

    timer('TimerFcn',{@timer_function,handles.***}',...
    La dernière solution que tu m'a donné marche très bien. Bravo et merci pour ton temps!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. GUI: séparer les objects des callback
    Par soeursourire dans le forum Interfaces Graphiques
    Réponses: 3
    Dernier message: 01/04/2010, 09h23
  2. Réponses: 5
    Dernier message: 29/07/2009, 16h53
  3. GUI & Timer => problème d'handle sur la figure
    Par wintereivax dans le forum Interfaces Graphiques
    Réponses: 10
    Dernier message: 13/01/2008, 21h20
  4. Problème Timer dans GUI
    Par DelphOrka dans le forum Interfaces Graphiques
    Réponses: 3
    Dernier message: 03/09/2007, 22h13
  5. Insertion Timer GUI Netbeans
    Par sniperseb dans le forum NetBeans
    Réponses: 2
    Dernier message: 25/01/2007, 00h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo