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

Simulink Discussion :

Un timer me rend fou. Est ce logique ?


Sujet :

Simulink

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 101
    Points : 61
    Points
    61
    Par défaut Un timer me rend fou. Est ce logique ?
    Bonjour,

    Je crois que je vais devenir fou avec ces timers...sur Matlab...

    Tout d abord avant d aller plus loin dans mes investigations je pose une simple question :

    "Est il possible d utiliser des timers (un seul pour le moment) dans les callbacks d un GUI ? Ceci pour rafraichir par exemple chaque seconde la valeur d un static text (qui prendrait ses valeurs a partir d un slider)..."


    Merci d avance pour vos reponses

    PS : MATLAB Version 7.3.0.267 (R2006b)
    Simulink Version 6.5 (R2006b)
    MATLAB Version 7.3.0.267 (R2006b)
    Simulink Version 6.5 (R2006b)
    Sous Windows

  2. #2
    Membre actif Avatar de LordPeterPan2
    Inscrit en
    Février 2007
    Messages
    247
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 247
    Points : 239
    Points
    239
    Par défaut
    "Est il possible d utiliser des timers (un seul pour le moment) dans les callbacks d un GUI ?"
    Oui, tu le peux, j'en suis méga sûr (commande tic toc start stop)

    "Ceci pour rafraichir par exemple chaque seconde la valeur d un static text"
    Non, je ne crois pas.


    "qui prendrait ses valeurs a partir d un slider"
    Alors là c'est plus interessant, tu peux faire correspondre une action à chaque fois que ton slider change de valeur. Donc tu peux changer le text de ton static text lorsque ton slider change de valeur.

    Peux tu nous dire ce que tu veux faire exactement ?

    Tu veux vraiment rafraichir toutes les X millisecondes ou tu ne veux afficher que si la valeur du slider à suffisamment changé ou ... ?
    Ils ne savaient pas que c’était impossible, alors ils l’ont fait

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 101
    Points : 61
    Points
    61
    Par défaut
    Bonjour,

    Deja merci pour ta reponse...
    En effet, j ai verifie et teste de mettre un timer dans un GUI ...ca marche

    En fait, justement mon grand truc c est que je ne veux pas que le static text change uniquement quand j bouge un slider (ca j sais faire.... ) j desire qu il se rafraichisse chaque seconde meme si le slider n a pas change !!

    Donc en effet, je veux vraiment rafraichir toutes les X millisecondes...

    J ai pense partir ainsi... :
    - Au plus bas niveau : j ai cree une fonction "getVolume" (car en fait c est un gain que j recupere qui me sert de volume dans mon modele) qui a cette tete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function getVolume(modelname, target, my_handles)
     
    target = 'simulink';
    modelname = 'SuiteStage/Slider GainVolume';
     
    NewVal = get_parameter_slidergain(modelname, target); % cette fonction est    % un get_param ameliore
     
    set(my_handles.textVolume, 'String', num2str(NewVal))
    - Niveau juste au dessus : je voudrais creer un callback qui utilise les fct "TimerFcn", "StartFcn"... que je pourrai appeler "timer_Callback"
    Je voudrais que cette derniere envoie l'handles "my_handles" a "getVolume".
    Une simple esquisse pour l instant est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function timer_Callback(obj, event, Obj_Name)      
     
    t.StartFcn = {'getVolume', ?????}; % ??? je ne sais quoi mettre
     
    t.StopFcn = { @getVolume, ?????}; % idem
     
    % Set the values of several properties of the timer object.
    set(t, 'TimerFcn', 'getVolume', 'Period', 1) % ???? ici aussi je ne sais pas trop...
    % t.TimerFcn = 'disp(''Hello World!'')';  
     
    start(t)

    - Bien evidemment avant cela je cree mon objet timer dans ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    t = timer('StartDelay', 4,'Period', 1,'TasksToExecute', 2,...
              'ExecutionMode','fixedRate');
    - Et au plus haut niveau, j ai mon GUI...qui appelle mon objet timer qui lui meme va appeler chaque seconde la focntion "timer_callback" qui elle, va appeler ma fonction "getVolume"...


    Bref, voila pour la ptite histoire, j espere avoir ete assez clair et je me rends compte que ce n est pas facile du tout...

    Merci d avance
    MATLAB Version 7.3.0.267 (R2006b)
    Simulink Version 6.5 (R2006b)
    Sous Windows

  4. #4
    Membre actif Avatar de LordPeterPan2
    Inscrit en
    Février 2007
    Messages
    247
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 247
    Points : 239
    Points
    239
    Par défaut
    Après surfage sur le net j'ai trouvé un exemple :

    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
    23
    24
    25
    26
    27
    28
    function timertest()
     
      global pos actval
     
      pos = 1;    % aktuelle Position im Feld
      actval = 0; % aktueller Wert aus dem Feld
     
      n   = 5;   % Anzahl der Durchlaeufe
      del = 2.0; % Intervall in sec.
      disp('Start');
     
      t = timer('TimerFcn',@timer_callback_fcn,'Period', 0.5,...
          'ExecutionMode','fixedDelay','TasksToExecute',10);
      start(t);
     
      disp('Ende');
     
    end
     
     
    function timer_callback_fcn(obj, event, string_arg)
      global pos actval
     
      actval = num2str(pos);
      pos=pos + 1;
     
      disp(actval);
    end
    Cà réponds à ta question je pense

    çà effectue toutes les demi seconde et 10 fois de suite (met inf ald 10 pour répéter indéfiniment mais pense à faire un stop alors car sinon ton timer se déroule indéfiniment jusqu'à sans fin)
    Ils ne savaient pas que c’était impossible, alors ils l’ont fait

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 101
    Points : 61
    Points
    61
    Par défaut
    OKi oki merci beaucoup...
    Je vais appliquer cela a mon probleme et voir si je peux l adapter comme je veux...
    Je mettrai le code pour d autres personnes eventuellement...
    MATLAB Version 7.3.0.267 (R2006b)
    Simulink Version 6.5 (R2006b)
    Sous Windows

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 101
    Points : 61
    Points
    61
    Par défaut
    OK c est bon j ai trouve mais c est bien plus complique qu on veut bien le croire...

    Dois je mettre la reponse ici (mon code) ou dans la FAQ ??
    MATLAB Version 7.3.0.267 (R2006b)
    Simulink Version 6.5 (R2006b)
    Sous Windows

  7. #7
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Mets ton code ici pour voir ta solution.
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 101
    Points : 61
    Points
    61
    Par défaut
    Ok...

    Premierement creer l objet timer et lui donner plusieurs proprietes...dans le GUI.
    Personnellement, je voulais que le timer se lance des l ouverture du GUI j l ai donc mis juste apres l initialisation (et je le conseille...). Voila le code DANS LE GUI :

    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
     
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % Creating Timer Object
    t = timer;
     
    % Set to this object some stuffs like delay, period...
    % Cela marche par paire : par ex : ma periode est de 1 seconde...
    set(t,'StartDelay', 1,'Period', 1,'TasksToExecute', inf,...
              'ExecutionMode','fixedRate');
     
    % Check what is needed for the properties
    handlesToStaticTxt = handles.textVolume;
    my_blockpath = 'Chemin/d acces vers le block SIM';
     
    % Set the values of several properties of the timer object.
    % @timer_Callback = propertyname and the rest are the propertyValues
    set(t, 'TimerFcn', { @timer_Callback, handlesToStaticTxt, my_blockpath, target })
     
    % Start timer
    start(t)
    Bien evidemment, il faut stopper le timer et l'effacer mais si on le met direct apres le 'start' probleme...il le lance et le stoppe tout de suite...donc j ai mis ces commandes dans un Callback qui est appele quand la fenetre se ferme, soit (toujours dans le code du GUI) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function figure1_DeleteFcn(hObject, eventdata, handles)
    % hObject    handle to figure1 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    % Stop timer 
    stop(timerfind)
    % Delete timer
    delete(timerfind)
    Ensuite arrive un ptit truc pas evident...il faut savoir que le callback pour l objet timer ne peut pas se mettre dans le code du GUI mais dans un m file a part...Donc j ai cree mon m.file 'timer_Callback.m' ou j y ai ecrit cela... :

    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
    23
    24
    25
     
    function timer_Callback(obj, event, handlesToStaticTxt, my_blockpath, target)
     
    % When the time period specified by a timer object elapses, the timer
    % object executes one MATLAB function. The command is put in an M-file 
    % function. The M-file function is specified as the value of the callback 
    % property.
    % This function accepts additional arguments like handle to the static
    % text, block path name and target.
    % This callback calls an other function "getVolume"
    % 
    % CAREFUL : a timer callback needs absolutely the object (obj) and the 
    % eventdata (event). They represent a handle to the timer object.
     
    %je les ai renommes mais cela ne sert a rien...
    hStaticTxt = handlesToStaticTxt ;
    blockpathname = my_blockpath ;
     
    % Get the NewValue from the slider gain specified in block path name
    % Cette fonction est un get_param ameliore (elle me renvoie simplement la
    % valeur du sliderGain  
    NewVal = get_parameter_slidergain(blockpathname, target);
     
    % Set this NewValue directly to the GUI.
    set(hStaticTxt, 'String', num2str(NewVal))
    Et voila, finalement j envoie la nouvelle valeur directement au GUI...

    J espere avoir ete assez clair et que cela pourra aider quelques personnes qui veulent recuperer ou voir une valeur toutes les x secondes...

    Dut cela te convient...?
    MATLAB Version 7.3.0.267 (R2006b)
    Simulink Version 6.5 (R2006b)
    Sous Windows

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

Discussions similaires

  1. [RMAN] RUN ou pas RUN : quelle est la logique ?
    Par Pomalaix dans le forum Administration
    Réponses: 1
    Dernier message: 05/12/2007, 18h06
  2. Visual Studio et Internet Explorer me rende fou :)
    Par neptune dans le forum ASP.NET
    Réponses: 4
    Dernier message: 13/11/2007, 15h05
  3. [Débutant] une boucle for me rend fou.
    Par SirDarken dans le forum Langage
    Réponses: 6
    Dernier message: 12/09/2006, 23h25
  4. fonction log me rend fou
    Par adel25 dans le forum C++
    Réponses: 2
    Dernier message: 16/10/2005, 10h16

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