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

MATLAB Discussion :

Bug, Boucle, S-function, RTW, C


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Par défaut Bug, Boucle, S-function, RTW, C
    Bonjour a tous

    Voila mon probleme :

    J'essai de creer une S-function a partir du bloc S-function builder et je tapeun petit programme en C avec en entree une Digital input provenant d'une carte I/O. et en sortie j ai une Digital output.

    le probleme c'est que je fsit une boucle Do While dans mon programme et quand j'execute le RTW pour controler en temps reel mes sorties, il semblerai que mon PC se mette en boucle infinie et la seul solutiion qu'il me reste alors c'est le reset.

    je pense mon probleme vient du fait qu'il y a des notions qui m echappent sur la programation avec la S-function builder mais je n'ai trouve d'enfo nul part.

    merci d'avance et dsle pour ce message un peu brouillon mais je doit me depecher.

    Merci

    DEz'

  2. #2
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 17
    Par défaut
    Salut,
    peux tu me faire par de ta S-Function que je te dis ce qu'il ne va pas?
    Tu utilise Xpc Target?

    A++

  3. #3
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Par défaut
    mon programme en C est comme suit

    Dans la fenetre input j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     prox_r
    prox_l
    prox_b
     
    r=right
    l=left
    b=back
    Il s'agit d'un robot triangulaire a 3 roues omnidirectionelle munit de capteur de proximite (qui en l'occurence ici, detecte au niveau des 3 roues la presence d'une plaque d'acier)

    le robot peut avancer reculer et tourner sur lui meme (son centre de rotation etant aussi sont centre geometrique) a droite et a gauche.

    le but est de l'aligner avec le bord de la plaque en utilisant deux capteurs.

    Pour cela je dois donc faire une boucle en fonction de, si telle capteur est sur la plaque et que son voisin ne l'est pas, cela signifie que le robot est en biais sur le bord de la plaque et ainsi de suite.

    les trois sorties de ma fonction sont des sorties de type double ( tout comme les entrees ) et elles commende les moteurs.

    Il y a donc la sortie forward, backward, left and of course, right.

    donc voici le programme au quelle je pense :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     if(prox_r[0]  == 0 && prox_l[0] == 1)    
     
    %% soit dit en passant je ne comprend pas le pkoi des "[0]" mais si je ne les met pas je ne peux pas compiler
     
    {
      do{
             left=0;
             right=1;
             back...
     
     
           }
       while (prox_r==1);
    }
    ...

    c'est une partie du programme mais si je fais simplement un truc du genre

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     do
     {
         left=1;
         backward=0;
         ...
      }
    while(prox_r==1);

    je compile et quand j'essaye de lancer le programme (en cliquant sur le play de simulink) le PC plante complètement et je dois faire reset

    Voila j'espere avoir ete assez precis

    Dez'

  4. #4
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Par défaut
    J'ai aussi un autre petit probleme.

    j'ai reussis a faire le progrramme d'alignement qu'avec des IF ELSE (mais je tiens toujours a savoir pour mon histoire de boucle car je ne pourrais pas tous faire qu'avec des IF ELSE)

    une fois mon robot aligne avec le bord de la plaque et etant donner que le programme tourne toujours en boucle, tant que je n'arrete pas le RTW, mon robot se met a danser le break...

    J'ai donc voulu creer une variable que j'ai appeler c en la declarant comme suit dans la fenetre de mon S-Function Builder :

    real_T *c; (quand j'ouvre le ficher C de matlab je me suis apercu que c'est comme ca qu'il declarait mes I/O)

    bref j'initialise en debut de programme c[0]=0; (qui d'ailleurs doit toujours y rester puisque le programme tourne en boucle, ma variable est donc chaque fois remise a 0) et un moment dans mon programme j incremente cette variable en faisant c[0]++ et je ne fais une corection d'alignement que si cette variable est inferieur a 3 (ca evite le break )

    le prob c'est que ca me sort une nouveaute en rebootant mon PC quand je clique sur le Play de RTW

    est-ce la bonne methode ?
    Ou est l'Erreur ?

    desole pas d'accent, clavier anglais

  5. #5
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 17
    Par défaut
    A première vue, je ne vois pas pourquoi ton PC plante. Il faut que je regarde plus attentivement et je te redirais ce que je pense être bon et faux.

    Si c'est une histoire de séquence, peut être aurais-tu intérêt à utiliser Stateflow. Au vue des quelques lignes et du but de ton programme, cela semblerait le plus adapté. Si tu possède cette toolboxe, je pense qu'elle peut répondre à tes attentes.

    Je te tiens au courant, pour des questions mais je souhaitais d'indiquer le Stateflow si tu le connaissais pas.

  6. #6
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Par défaut
    Oui j'aimerai bien aussi me servir de stateflow mais a cause d'un probleme de license je ne peux malheureusement pas compiler...mon maitre de stage doit s'en occupper mais pour l'instant je pense que la S-function est la solution la plus adaptee.

    bon je m'en retourne faire des essais donc dans 2 min je vais reseter le PC

    ++

  7. #7
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 17
    Par défaut
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    do{
             left=0;
             right=1;
             back...
     
     
           }
       while (prox_r==1);
    }

    j'ai essayé de refaire la même chose avec S-Function Builder et je n'ai pas eu de problèmes particulier avec do/while
    Dans l'exemple que tu as mis en ligne, ta condition de sortie "prox_r "n'est jamais vrai

    En effet, tu devrais avoir prox_r[0]. Il ne s'agit certainement pas de l'erreur qui fait planté ton pC, car tu n'aurais pas pu compilé ta S-Function.

    Par contre, j'ai eu un soucis moi aussi avec les boucles whiles quand la condition de sortie devient vraie, la boucle ne s'arrête pas et cela fait planté Simulink.Je ne sais pas pourquoi!!! mais je cherche.
    Si tu arrives en corrigeant ton code ,tiens moi au courant.
    A++

  8. #8
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Par défaut
    oui c'est exactement le probleme que j'ai en faite.

    tant que la condition n'est pas vrai je n'entre pas dans la boucle mais quand je rentre dans la boucle le PC plante...

    c'est quand meme dommage de pas pouvoir se servir du DO WHILE....


    Enfin il y a surement une manipulation a faire propre a simulink.

    je me demande si il ne faut pas se servir de RTW s-function target dans le realt time workshop...

    je vais essayer et dire ce qu'il en est.

  9. #9
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Error building Real-Time Workshop target for block diagram 'pilotage_robot_clavier'. MATLAB error message:
    Error using ==> rtwgen
    Error in 'pilotage_robot_clavier/RTW S-Function': Initialization commands cannot be evaluated.  MATLAB error message: Error using ==> rtwsfunc.m>rtwsfunc
    Unable to find makefile: 
      C:\Program Files\MATLAB\R2006b\work\Corentin\alignem_ert_rtw\alignem.mk
    for the Real-Time Workshop generated MEX S-function 'alignement '.
    voila l'erreur que j ai en compilant mon fichier simulink en me servant de s-function target..

  10. #10
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Par défaut
    voila mon programme en entier (la variable align est un booleen, c'est en fait un interrupteur qui lance le processus d'alignement, et avec ma boucle do while, normalement,je n'ai a appuyer qu'une seul fois, et la boucle s'execute tant que le robot n,est pas aligne, mais tjr le meme prob, lorsque j appui sur l'interrupteur, je rentre dans la boucle ==> Bug ==> RESET...


    Code C : 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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    if(*align==1)
    {
        do
        {
            if(prox_l[0] == 0 && prox_r[0]==1)
            {
                left[0]=1;
                right[0]=0;
                backward[0]=0;
                forward[0]=0;
            }
            else
            {
                if(prox_l[0]==1 && prox_r[0]==0)
                {
     
                    right[0]=1;
                    left[0]=0;
                    backward[0]=0;
                    forward[0]=0;
                }
                else
                {
                    if(prox_l[0] == 0 && prox_r[0]==0)
                    {
                        backward[0]=0;
                        forward[0]=0;
                        right[0]=0;
                        left[0]=0;
     
     
                    }
                    else
                    {
                        if(prox_l[0] == 1  && prox_r[0]== 1)
                        {
                            left[0]=0;
                            right[0]=0;
                            backward[0]=0;
                            forward[0]=1;
                        }
                    }
                }
            }
        }
        while(prox_l[0] != 0 && prox_r[0]!=0);
    }   
    else
    {
            backward[0]=0;
            forward[0]=0;
            right[0]=0;
            left[0]=0;
    }

  11. #11
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 17
    Par défaut
    j'ai regardé ton code et j'ai réussi à le faire tourner correctement en simulation sous Simulink.
    Je pense que la meilleur chose à faire pour toi, est de créer un fichier C à coté, correspondant à la fonction souhaiter, les argument de cette fonction étant les entrées/sorties de ton bloc.

    Code C : 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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    mouvement(char*align,char *left,char *right,char *prox_l,char *prox_r)
    {
    if(align[0]==1)
    {
        do
        {
            if(prox_l[0] == 0 && prox_r[0]==1)
            {
                left[0]=1;
                right[0]=0;
                backward[0]=0;
                forward[0]=0;
            }
            else
            {
                if(prox_l[0]==1 && prox_r[0]==0)
                {
     
                    right[0]=1;
                    left[0]=0;
                    backward[0]=0;
                    forward[0]=0;
                }
                else
                {
                    if(prox_l[0] == 0 && prox_r[0]==0)
                    {
                        backward[0]=0;
                        forward[0]=0;
                        right[0]=0;
                        left[0]=0;
     
     
                    }
                    else
                    {
                        if(prox_l[0] == 1  && prox_r[0]== 1)
                        {
                            left[0]=0;
                            right[0]=0;
                            backward[0]=0;
                            forward[0]=1;
                        }
                    }
                }
            }
        }
        while(prox_l[0] != 0 && prox_r[0]!=0);
    }   
    else
    {
            backward[0]=0;
            forward[0]=0;
            right[0]=0;
            left[0]=0;
    } 
    }

    Tu appelle le fichier.c au niveau de librairie dans s-function Builder dans le grand carré à gauche.

    Puis tu fais un appel de fonction classique dans Outputs

    J'espère que c'est compréhensible,
    si tu as besin n'hésiste pas à me contatcer.
    A++

  12. #12
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Par défaut
    ce ne serait pas plutot un appel de procedure ?(et oui je sors de l'ecole )

  13. #13
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Par défaut
    LA je vais vraiment peter un cable...

    j'ai fait comme tu m'a conseille de faire, je "build" la s-function, je "build" mon fichier simulink, je l'envoie sur la carte, et au moment ou je clique sur play .....????? LE PC REBOOT !

    Je me suis dit , peut etre y a-t il un probleme provenant du fait que les parametres de ma procedure on le meme noms que mes entrees/sorties.

    Je vais donc dans le fichier C de matlab et je rajoute "_f" a tous mes parametres pour les differentier de mes E/S et dans l'onglet data properties je declare mes parametres (si je ne le fait pas j 'ai une erreur me disant que mes paramettres xxxxx_f ne sont pas declares) mais memes en les rajoutants ici j'ai tjr cet erreur !!!!!

    sinon vous croyez que les PC savent voler pqe ici y en a un qui ferait mieux de savoir

  14. #14
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Par défaut
    Re

    avant de lancer directement le RTW, je vien d'essayer de faire une simulatio et en la lancant voila l'erreur que j'ai (attention c'est tres explicite)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Unexpected internal error.
    peux tu me decrire les etapes de la realistion de mon fichier please car je dois certainement mer**r qqpart...

Discussions similaires

  1. [Bug]Boucle de redirection
    Par kolodz dans le forum Evolutions du club
    Réponses: 5
    Dernier message: 25/02/2015, 13h27
  2. S-function rtw fichier tlc
    Par francbad dans le forum Simulink
    Réponses: 5
    Dernier message: 09/11/2010, 10h05
  3. Problème non identifié, bug boucle perl
    Par Adrien_13 dans le forum Langage
    Réponses: 1
    Dernier message: 09/03/2010, 09h07
  4. [Tableaux] bug boucle foreach
    Par franfr57 dans le forum Langage
    Réponses: 5
    Dernier message: 02/05/2007, 11h48
  5. Bug boucles et tableaux
    Par sebduth dans le forum Fortran
    Réponses: 3
    Dernier message: 31/05/2005, 13h49

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