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 :

[Simulink vers ControlDesk] Problème de coder pour un embbeded block


Sujet :

Simulink

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 8
    Par défaut [Simulink vers ControlDesk] Problème de coder pour un embbeded block
    Bonjour,

    J'espère que vous aller pouvoir m'aider :/
    Voilà, j'ai un problème au niveau de Simulink lorsque je veut compiler un programme pour faire une interface sous ControlDesk,
    Mon programme contient un bloc embbeded avec une fonction me rapportant l'heure du système et qui me génère un signal commandant le reset d'une intégrale à une heure spécifique chaque jour.
    Le problème est que Matlab ne veut pas compiler ce bloc fonction à cause des fonctions "now" et "datevec" (j'ai aussi essayé avec la fonction "clock"), voici mon bloc fonction :

    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 Signal = fcn %Le bloc n'a pas d'entrée et une unique sortie "Signal"
    eml.extrinsic('now'); %Retourne la date et l'heure sous forme "serial date number"
    eml.extrinsic('datevec'); %Convertit le format "serial date number" en vecteur
    Y = 0;
    M = 0;
    D = 0;%Initialisation des valeurs des variables
    H = 0;
    MN = 0;
    S = 0;
    [Y, M, D, H, MN, S] = datevec(now);% On attribue les variable au vecteur temps
     
    if H==00 % Si l'heure est "0" = minuit
        if MN==00 %Si les minutes sont à 0
            if S==0 % si les secondes sont à 0
                Signal=1; %La sortie du bloc "Signal" vaut 1
            else
                Signal=0;%Sinon la sortie du bloc "Signal" vaut 0
            end
        else
            Signal=0;
        end
    else
        Signal=0;
    end
    end
    J'ai cru comprendre que Matlab ne compilait pas certaine fonctions pour ControlDesk et qu'il fallait écrire le code de la fonction mais "clock" ou "now" n’exécute pas vraiment des instructions Matlab :/

  2. #2
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Par défaut
    Bonjour,

    Pour palier ce problème, n'aurais-tu pas la possibilité de passer l'heure en signal d'entrée de ta fonction (depuis ControlDesk)?

    Duf

  3. #3
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 885
    Par défaut
    une idée comme ca :
    tu as un bloc clock sous simulink que te donnes le temps depuis le début de ton programme
    si au lancement de ton programme tu affectes la date en cours (now) à une variable (toto = now; dans model properties/callbacks/initfonction) que tu récupères via un block constante et que tu sommes à la sortie du bloc clock, ca te donne l'heure (probablement avec un léger décalage entre l'appel à initfonction et le début réel du programme)

    tu peux aussi le faire via un script qui lance ton programme via sim, avec un retard probablement plus grand

    ça marche à condition de ne pas mettre ton programme en pause !

    sinon pour savoir si une date toto correspond à minuit il suffit de vérifier que toto est un entier
    pb : en simulation/exécution temps réel tu tombera probablement jamais sur minuit pile : prévoir une marge de tolérance (toto - floor(toto)<tol) plutôt qu'un test d'égalité (sachant qu'une seconde = 1.1574e-005)
    du coup tu peux aussi le faire sans bloc matlab function, mais juste des bloc floor et comparaison que tu branches sur l'entrée initialisation de l'integrale

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 8
    Par défaut
    Bonjour,

    Merci pour vos réponses !

    Je vois pas trop comment faire depuis ControlDesk donc j'ai essayé la deuxieme proposition :

    J'ai créé ma fonction temps à l'initialisation du model :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Time = now;
    Time = Datevec(Time);
    H = Time(:,4);
    MN = Time(:,5);
    S = Time(:,6);
    J'ai préféré utiliser les heures, minutes, secondes au lieu du format numérique car il contient aussi la date (et donc inutile puis je voyais pas comment le comparer après)

    Une fois mes variables récupérées au démarrage et stockées dans le workspace, j'ai pensé faire un compteur dans mon model qui compterais le temps et actualiserais les variables Heure, minutes, secondes, j'ai donc commencé ça dans un embbeded block (peur de produire trop de décalage en fesant ca en blocs et plus simple à faire en code) :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    function [H1, MN1, S1, Signal] = fcn(H, MN, S, compteur)
     
    if compteur==1 %1s s'est passée depuis le dernier top
     
        if S==59 
             S1=0;
             if MN==59 
                MN=0;
                if H==24 
                    H1=0;
                else
                    H1=H+1;
                end
             else
                 MN1=MN+1;
             end
        else
            S1=S+1;
        end
    end
     
    H1=H;
    MN1=MN;
    S1=S;
     
    if H==0
        if MN==0
            if S==0
                Signal=1;
            else
                Signal =0;
            end
        else
            Signal =0;
        end
    else
        Signal =0;
    end
    end
    Les entrées de mon bloc (3) embbeded sont des bloc constante avec mes variable heure/minute/seconde + 1 entrée compteur pour donner 1 top chaque seconde.

    Les sorties sont des blocs to workspace où j'ai reglé le "limit point to last" à 1.

    Mes questions :

    J'ai trouvé comment faire un compteur avec un top chaque seconde (mon pas de simulation est fixe en 10e-3 en solver ode1) : j'utilise un "pulse generator" en "sample based" avec une amplitude de 1 et une période de 1000 samples.

    Une chose bizare, je pensais qu'il fallait plutot 100 que 1000 (100*10-e3 = 1s non ?)

    J'utilise ensuite une variable dont je change la valeur sur ce top dans un sous-système avec trigger et je remet à 0 cette constante par la suite.

    Mon problème :

    Le bloc a l'air de fonctionner (mes sorties changent mais...1 seule fois)
    J'ai un problème d'importation/exportation pour mes valeurs, je pensais utiliser des blocs d'importation "constante" mais cela ne marche que pour la valeur initiale, le bloc ne se remet pas à jour quand la variable change.

    J'aimerais donc utiliser des bloc from workspace, problème : je n'ai pas de composante temps, il s'agit d'une simple variable, comment faire ?

  5. #5
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 885
    Par défaut
    hello

    je crois que tu te complique la vie
    un conseil : oublie "matlab embedded" pour faire ca
    les blocs simples iront aussi bien (et ne produiront pas plus de décalage)

    ensuite tu as le bloc "clock" plus approprié à mon avis que "pulse generator"

    sinon moi en général pour faire ce genre de chose, j'utilise un bloc "integrator" avec en entrée un bloc "constant" à 1 pour faire un compteur
    en sortie de ce bloc tu récupèrera le temps (en seconde) écoulé depuis la dernière initialisation de ton bloc "integrator"
    il suffit de l'initialiser à la valeur H*3600+MN*60+S (valeurs venant de ta fonction temps à l'initialisation du modèle) en utilisant le bloc IC et de brancher à la sortie de ton bloc integrateur un bloc "compare to constant" parametré comme ">=3600*24"

    la sortie de ce bloc se mettre à 1 à minuit, et il suffit de la reboucler sur l'entrée "reset" du bloc integrator (avec un retard pour éviter les boucles algébriques).
    je réinitialise le bloc integrateur à 1 car mon sample time vaut 1 et que j'ai un retard (1/z) de 1s sur l'entrée reset

    cf schéma joint

    le bloc intégrateur a ici un sample time de 1 s et il faut le paramétrer pour une initialisation externe
    tu peux laisser "-1" pour le sample time, dans ce cas rajoutes un bloc "weighted sample time" pour diviser le bloc constante "1" en entrée principale de l’intégrateur (ou remplace en dur 1 par 1e-3)

    un bloc "rate transition" peut t'être utile pour rebranché ta sortie sur ton système qui a probablement un pas de temps different.

    Fabien
    Images attachées Images attachées  

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 8
    Par défaut
    C'est vrai que quand je vois ta réponse, je me dit que c'était peut-être une usine à gaz...

    Donc du coup je viens d'appliquer ta méthode avec un mux sur l'initialisation pour récupérer les 3 constantes (je connaissais pas le bloc IC :/)

    D'ailleurs, à quoi sert le Data type conversion ?

    Bon sinon cela fonctionne, il me reste juste un problème de temps réel à régler,
    Mon model est réglé en 0 to inf avec un pas fixe de 10e-3 en ode5 et du coup il a l'air de calculer beaucoup trop vite, l'intégrale compte environ 100 000 points en 10s :/

    Mon ordinateur est trop rapide ? ^^ Il réalise la même simulation (avec le même pas fixe) de 0 à 86400 (au lieu de inf) en 4s.

Discussions similaires

  1. Deploiment d'application Simulink vers FPGA via HDL-Coder
    Par garnier47 dans le forum Simulink
    Réponses: 0
    Dernier message: 18/03/2011, 15h07
  2. [CR.NET] Problème de connexion pour un sous-état
    Par HULK dans le forum Connectivité
    Réponses: 16
    Dernier message: 02/06/2009, 10h37
  3. Adaptation d'un code TMemo vers TRichEdit : problème de ScrollBars
    Par Droïde Système7 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 21/01/2005, 15h06
  4. Problème unit CRT pour Faire du Pascal avec Delphi
    Par alexmorel dans le forum Débuter
    Réponses: 4
    Dernier message: 01/06/2004, 17h13
  5. Réponses: 5
    Dernier message: 27/08/2003, 11h45

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