|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Jonathan Gatt Inscription : mars 2010 Messages : 8 ![]() |
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 :
|
||
|
|
00
|
|
|
#2 |
![]() ![]() Formateur en informatique Inscription : novembre 2007 Messages : 2 908 ![]() |
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
__________________
Définir les signaux d’entrée d’un modèle Simulink sur le blog Vers MATLAB et au-delà Modérateur MATLAB Au boulot : Windows 7 , MATLAB 8.00 (r2012b) A la maison : ArchLinux
|
|
|
00
|
|
|
#3 |
![]() ![]() Fabien Grand-PerretDéveloppeur informatique Inscription : mars 2005 Messages : 467 ![]() |
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 |
|
|
00
|
|
|
#4 | ||||
|
Invité de passage
![]() Jonathan Gatt Inscription : mars 2010 Messages : 8 ![]() |
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 :
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 :
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 ? |
||||
|
|
00
|
|
|
#5 |
![]() ![]() Fabien Grand-PerretDéveloppeur informatique Inscription : mars 2005 Messages : 467 ![]() |
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 |
|
|
00
|
|
|
#6 |
|
Invité de passage
![]() Jonathan Gatt Inscription : mars 2010 Messages : 8 ![]() |
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. |
|
|
00
|
|
|
#7 | ||
![]() ![]() Fabien Grand-PerretDéveloppeur informatique Inscription : mars 2005 Messages : 467 ![]() |
>>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 :
ou alors tu as modifier le refine factor dans la configuration (2eme onglet) |
||
|
|
00
|
|
|
#8 |
![]() ![]() Fabien Grand-PerretDéveloppeur informatique Inscription : mars 2005 Messages : 467 ![]() |
|
|
|
00
|
|
|
#9 |
|
Invité de passage
![]() Jonathan Gatt Inscription : mars 2010 Messages : 8 ![]() |
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 |
|
|
00
|
|
|
#10 |
![]() ![]() Fabien Grand-PerretDéveloppeur informatique Inscription : mars 2005 Messages : 467 ![]() |
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 ! |
|
|
00
|
|
|
#11 |
|
Invité de passage
![]() Jonathan Gatt Inscription : mars 2010 Messages : 8 ![]() |
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. |
|
|
00
|
|
|
#12 | |
![]() ![]() Fabien Grand-PerretDéveloppeur informatique Inscription : mars 2005 Messages : 467 ![]() |
donc c'est bien ca, tu as 100 point par seconde, rassurant
Citation:
![]() 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 |
|
|
|
00
|
|
|
#13 |
|
Invité de passage
![]() Jonathan Gatt Inscription : mars 2010 Messages : 8 ![]() |
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) :/ |
|
|
00
|
|
|
#14 |
![]() ![]() Fabien Grand-PerretDéveloppeur informatique Inscription : mars 2005 Messages : 467 ![]() |
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 |
|
|
00
|
|
|
#15 |
|
Invité de passage
![]() Jonathan Gatt Inscription : mars 2010 Messages : 8 ![]() |
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. |
|
|
00
|
|
|
#16 | |
![]() ![]() Fabien Grand-PerretDéveloppeur informatique Inscription : mars 2005 Messages : 467 ![]() |
Citation:
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 |
|
|
|
00
|
Copyright © 2000-2013 - www.developpez.com