Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 16 sur 16
  1. #1
    Invité de passage
    Profil pro John Doe
    Inscrit en
    mars 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Nom : John Doe

    Informations forums :
    Inscription : mars 2010
    Messages : 8
    Points : 0
    Points
    0

    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 :
    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
    Modérateur
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    novembre 2007
    Messages
    3 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France

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

    Informations forums :
    Inscription : novembre 2007
    Messages : 3 058
    Points : 4 548
    Points
    4 548

    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
    Simulink & Embedded Coder

    Modérateur MATLAB

    Au boulot : Windows 7 , MATLAB 8.2 (r2013b)
    A la maison : ArchLinux mais pas MATLAB

  3. #3
    Modérateur
    Avatar de le fab
    Homme Profil pro Fabien Grand-Perret
    Développeur informatique
    Inscrit en
    mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Nom : Homme Fabien Grand-Perret
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : mars 2005
    Messages : 865
    Points : 1 463
    Points
    1 463

    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
    Invité de passage
    Profil pro John Doe
    Inscrit en
    mars 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Nom : John Doe

    Informations forums :
    Inscription : mars 2010
    Messages : 8
    Points : 0
    Points
    0

    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 :
    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 :
    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 Fabien Grand-Perret
    Développeur informatique
    Inscrit en
    mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Nom : Homme Fabien Grand-Perret
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : mars 2005
    Messages : 865
    Points : 1 463
    Points
    1 463

    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
    Invité de passage
    Profil pro John Doe
    Inscrit en
    mars 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Nom : John Doe

    Informations forums :
    Inscription : mars 2010
    Messages : 8
    Points : 0
    Points
    0

    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.

  7. #7
    Modérateur
    Avatar de le fab
    Homme Profil pro Fabien Grand-Perret
    Développeur informatique
    Inscrit en
    mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Nom : Homme Fabien Grand-Perret
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : mars 2005
    Messages : 865
    Points : 1 463
    Points
    1 463

    Par défaut

    >>D'ailleurs, à quoi sert le Data type conversion ?
    à rien en fait. au début j'ai mal branché mes fils et j'avais un pb de data type puis quand j'ai rebrancher je l'ai pas enlevé
    d'ailleurs le 1/z est aussi peut être facultatif

    le bloc IC est très utile pour avoir une initialisation differente à t=0 et autre temps de simulation
    à quoi sert ton mux ?? là je ne vois pas l'utilité

    normalement en 10s tu devrait avoir 10*1e3 = 10 000 points !!
    tu es sur d'être à ce pas de temps
    fais un
    Code :
    1
    2
    3
    min(diff(tout));
    max(diff(tout));
    mean(diff(tout));
    après une simu de 10 s

    ou alors tu as modifier le refine factor dans la configuration (2eme onglet)

  8. #8
    Modérateur
    Avatar de le fab
    Homme Profil pro Fabien Grand-Perret
    Développeur informatique
    Inscrit en
    mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Nom : Homme Fabien Grand-Perret
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : mars 2005
    Messages : 865
    Points : 1 463
    Points
    1 463

    Par défaut

    Citation Envoyé par Qhadehar Voir le message
    C'est vrai que quand je vois ta réponse, je me dit que c'était peut-être une usine à gaz...
    l'utilisation de embedded doit être rarissime !! en général quand on y a recours c'est pour faire une usine à gaz alors que souvent il y a une solution simple

  9. #9
    Invité de passage
    Profil pro John Doe
    Inscrit en
    mars 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Nom : John Doe

    Informations forums :
    Inscription : mars 2010
    Messages : 8
    Points : 0
    Points
    0

    Par défaut

    Alors le mux c'était pour récupérer les 3 constantes H, MN, et S pour les utiliser dans le IC du coup,

    Min, max et mean donnent tous les trois 0.01

    Pas trouvé l'option refine factor :/

    Confirmé, sur une simulation à l'infini : 5000 points en 10s

  10. #10
    Modérateur
    Avatar de le fab
    Homme Profil pro Fabien Grand-Perret
    Développeur informatique
    Inscrit en
    mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Nom : Homme Fabien Grand-Perret
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : mars 2005
    Messages : 865
    Points : 1 463
    Points
    1 463

    Par défaut

    alors :
    1/ tu n'as pas compris ce que fait IC et là tu as fait une boulette
    IC est un bloc avec une entrée u et une sortie y et un paramètre p
    lors du premier pas de la simulation, y=p, ensuite y=u
    ici cela sert à initialiser l'intégrale au temps courant (en seconde depuis minuit) au lanchement de la simu puis à 1 (valeur du bloc constante relié en entré) ensuite
    de plus H, MN et S peuvent être utilisés directement dans n'importe quel bloc (comme je l'ai fait : écris directement dans le paramère du bloc 3600*H + 60*MN + S) pas besoin de passer par des blocs "constant" + mux
    là je serais curieux de voir une copie d'écran de ton système, mais je parie une bière que ça fait n'importe quoi

    2/ne cherche par refine factore, si tu connais pas, tu ne l'as probablement pas utiliser (à moins que tu ne soit partis d'un modèle fait par quelqu'un d'autre). De plus ce parametre n'existe pas en fixed step

    3/ si min, max et mean valent 0.01 cela signifie que :
    - tu es bien en fixed step et que la valeur du pas est de 1e-2 et non 1e-3 !!!!! c'est bien ce que tu voulais ??!!
    attention, ne jamais écrire 10e-3 car ça veux dire 10*1e-3 = 1e-2 !!!!

    4/ du coup tu devrais avoir 1000 points en 10 secondes !!
    pourquoi 5000 ??
    fait donc un
    après une simulation de 5s

    comment fait tu pour voir que tu as 5000 points ?? surtout sur une simulation sur l'infini !

  11. #11
    Invité de passage
    Profil pro John Doe
    Inscrit en
    mars 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Nom : John Doe

    Informations forums :
    Inscription : mars 2010
    Messages : 8
    Points : 0
    Points
    0

    Par défaut

    Merci pour l'explication, effectivement j'avais mal interprété le bloc, je pensais que les paramètres utilisés dans la formule devait être branchés en entrées, bref c'est corrigé.

    length(tout)=501;

    Sinon pour expliquer ce que je voudrais : Il s'agit de mesurer via une carte DSPACE 1104 le courant/tension d'une installation solaire, calculer la puissance instantanée (chaque seconde) puis intégrer cette puissance (chaque seconde) pour avoir l'énergie (* 1/3600 pour avoir en wh) et de recalculer cette énergie chaque jour (donc le reset à minuit).

    En fait quand je disais 5000 points avec mon pas de calculs c'était en simulation jusqu'à l'infini pendant 15 secondes (réelles sur ma montre) et en regardant la sortie de l'intégrale du signal de reset avec un scope.

    En tout cas, merci d'accorder du temps à mon problème, cela servira peut-être plus tard à d'autres en même temps.

  12. #12
    Modérateur
    Avatar de le fab
    Homme Profil pro Fabien Grand-Perret
    Développeur informatique
    Inscrit en
    mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Nom : Homme Fabien Grand-Perret
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : mars 2005
    Messages : 865
    Points : 1 463
    Points
    1 463

    Par défaut

    Citation Envoyé par Qhadehar Voir le message
    length(tout)=501;
    donc c'est bien ca, tu as 100 point par seconde, rassurant

    Citation Envoyé par Qhadehar Voir le message
    En fait quand je disais 5000 points avec mon pas de calculs c'était en simulation jusqu'à l'infini pendant 15 secondes (réelles sur ma montre) et en regardant la sortie de l'intégrale du signal de reset avec un scope.
    argghhhhhhhhhhhh
    1/ par defaut le bloc scope de montre que les 5000 derniers points !
    va voir dans les parametres du bloc (2eme onglet)
    2/jetes ta montre, tu n'en a pas besoin avec matlab !!
    pour savoir combien tu as de points en 5s, il faut lancer une simu de 5s (et pas plus) et calculer la longueur de ton vecteur (length) :
    soit tout soit un autre que tu récupères via un bloc "to workspace" ou mieux, en loggant ton signal (signal properties en clic droit sur le trait représentant le signal)

    d'ailleurs si tu n'as pas besoin de l’énergie en temps réel, tu peux aussi le faire en post traitement (cad après avoir arrêter ta simu) et récupérant un vecteur puissance (bloc to workspace) et en en faisant l’intégrale sous matlab (trapz)
    du coup tu peux à loisir découper ton vecteur puissance par jours

  13. #13
    Invité de passage
    Profil pro John Doe
    Inscrit en
    mars 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Nom : John Doe

    Informations forums :
    Inscription : mars 2010
    Messages : 8
    Points : 0
    Points
    0

    Par défaut

    Oui, je connaissais la limite des 5000 points

    Je crois que je n'ai pas vraiment compris l'utilisation du temps réel en fait :

    -Mon désir est d'avoir un calcul par seconde

    -Lorsque je règle ma simu sur un temps fini (ex : 3600s avec un pas de 1s),
    j'ai bien 3600 valeurs (donc parfait), le calcul matlab se fait en 3s réelles.

    -Lorsque je règle ma simu sur un temps infini (inf avec un pas de 1s), j'ai 23 000 valeurs sur 10s réelles.

    => Le but final du programme est d'être démarré à une heure x et jamais arrêté par la suite, l'utilisateur va consulter les données calculées sur une interface ControlDesk qui affiche l'énergie renvoyée par l'intégrale dans Simulink et donc j'aimerais le fonctionnement sur un temps fini (1 valeur par seconde) mais en temps réel avec un programme qui ne s’arrête jamais, je commence à croire que le fonctionnement de Matlab n'autorise pas ce cas de figure (1 calcul par seconde avec un programme qui ne s’arrête pas) :/

  14. #14
    Modérateur
    Avatar de le fab
    Homme Profil pro Fabien Grand-Perret
    Développeur informatique
    Inscrit en
    mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Nom : Homme Fabien Grand-Perret
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : mars 2005
    Messages : 865
    Points : 1 463
    Points
    1 463

    Par défaut

    en simulation, simulink calcule aussi vite qu'il peut
    donc une simulation annuelle peut se calculer en quelques secondes

    après je ne connais pas du tout ControlDesk
    mais bon, j'ai fait des choses équivalente sous des superviseurs

    voila comment je m'y prend :
    1/ il faut compiler ton modèle (donc avoir la toolbox qui va bien, aka simulink coder, et une cible pour ControlDesk probablement)
    2/ lancer le programme compilé indépendamment de simulink sur une cible temps réelle (ControlDesk ?)
    3/ éventuellement lancer le programme simulink en mode "externe" pour suivre en temps réel les calculs (cette 3eme phase n'est pas obligatoire puisque ton programme compilé aura des sorties puissance, énergie que tu doit pouvoir afficher sous controldesk)

    peut être peut tu aussi ne pas avoir à compiler et utiliser le mode "externe" quand même ... regarde du coté de xpc target ou Real-Time Windows Target

    sans ça tu es en mode "simulation rapide", donc pas temps réel

    sinon tu n'a pas besoin forcement de simulink :
    trapz + matlab coder devrait pouvoir suffire à ton problème

  15. #15
    Invité de passage
    Profil pro John Doe
    Inscrit en
    mars 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Nom : John Doe

    Informations forums :
    Inscription : mars 2010
    Messages : 8
    Points : 0
    Points
    0

    Par défaut

    Tout à fait ! C'est ce que je fait

    J'utilise Tools->RealTime Workshop pour compiler mon code et ensuite l'importer sous ControlDesk !

    J'ai également remarqué les toolboxs xPC target explorer et External mode control Panel.

    Je vais tester de compiler mon programme puis de le lancer depuis ControlDesk dans les jours à venir (pas présent sur mon ordinateur).

    J'utilisais Simulink pour les bloc ADC qui font l'acquisition des mesures faites sur ma carte DSPACE mais c'est sans doute fesable en code également.

    Je testerais la compilation puis le lancement depuis ControlDesk sous peu.

    Merci.

  16. #16
    Modérateur
    Avatar de le fab
    Homme Profil pro Fabien Grand-Perret
    Développeur informatique
    Inscrit en
    mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Nom : Homme Fabien Grand-Perret
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : mars 2005
    Messages : 865
    Points : 1 463
    Points
    1 463

    Par défaut

    Citation Envoyé par Qhadehar Voir le message
    Tout à fait ! C'est ce que je fait

    J'utilisais Simulink pour les bloc ADC qui font l'acquisition des mesures faites sur ma carte DSPACE mais c'est sans doute fesable en code également.
    autant pour moi, c'est une très bonne raison

    donc je te confirme qu'il faut compiler puis lancer depuis controlDesk pour etre temps réel. et pour le debug, tu as une external mode avec real time workshop

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •