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 :

Datevec dans une MATLAB Function


Sujet :

Simulink

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Stagiaire
    Inscrit en
    Août 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Stagiaire
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 22
    Points : 7
    Points
    7
    Par défaut Datevec dans une MATLAB Function
    Bonjour à tous,

    Relativement débutant en codage sur Simulink, je cherche à écrire une MATLAB Function (je suis sur la version MATLAB 2012b) au sein d'un modèle Simulink, cette fonction étant censée prendre en entrée un temps au format Unix/Posix (donc le nombre de secondes écoulées depuis le 1° janvier 1970 si j'ai bien compris la chose) et renvoyer en sortie la date correspondante sous forme Année / Mois / Jour / Heure / Minute / Seconde.

    Ca n'avait pas l'air très compliqué et une fonction toute faite semblait faire ça, la fonction "datevec" qui renvoie en sortie un truc du style [Année Mois Jour Heure Minute Seconde].

    J'ai donc essayé ce datevec, et j'ai reçu l'erreur
    The function 'datevec' is not supported for standalone code generation.
    me disant qu'en gros je ne peux pas appeler cette fonction depuis Simulink.

    Suivant les conseils du diagnostic report, j'ai rajouté dans ma MATLAB Function la commande coder.extrinsic ('datevec'), pensant que ça me permettait d'utiliser le datevec dans ma fonction. Ca a l'air d'avoir fonctionné étant donné que je n'ai plus l'erreur ci-dessus ; mais j'ai désormais ce message lorsque j'essaie d'extraire les Années / Mois / etc. de ce que la fonction datevec a renvoyé :
    Subscripting into an mxArray is not supported.
    Histoire d'être plus précis, le moment où ça foire est là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    coder.extrinsic ('datevec')
    c = datevec (matlab_time);  (matlab_time est un double, l'entrée de la fonction)
    Year = c(1);  => à ce moment là le logiciel me dit que je ne peux pas "subscript into a mxArray", alors que je veux simplement rentrer dans ma variable de sortie 'Year' le premier nombre que datevec a dû calculer.
    Month = c(2);  => même erreur pour les autres variables
    Day = c(3);
    Hour = c(4);
    Minute = c(5);
    Second = c(6);
    Je ne sais pas trop d'où vient le souci, ni pourquoi Matlab me parle de "mxArray", j'ai l'impression que c'est un souci inhérent à la Maltab Function, parce que je n'ai pas ce genre d'erreurs quand j'essaie de le faire directement dans le workspace...

    Quelqu'un aurait-il une petite idée de pourquoi ça ne fonctionne pas ? Et est-ce que le datevec est vraiment la fonction qu'il faut nécessairement utiliser dans mon cas ?
    Merci d'avance !
    Quentin

  2. #2
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Salut,
    Tu utilises le bloc Matlab function ou embedded Matlab?
    Essaye ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    coder.extrinsic ('datevec')
    c = zeros(6,1);
    c = datevec (matlab_time);  (matlab_time est un double, l'entrée de la fonction)
    Year = c(1);  => à ce moment là le logiciel me dit que je ne peux pas "subscript into a mxArray", alors que je veux simplement rentrer dans ma variable de sortie 'Year' le premier nombre que datevec a dû calculer.
    Month = c(2);  => même erreur pour les autres variables
    Day = c(3);
    Hour = c(4);
    Minute = c(5);
    Second = c(6);

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Stagiaire
    Inscrit en
    Août 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Stagiaire
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 22
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    J'utilise le bloc Matlab Function.

    En tout cas la modification que tu suggères semble fonctionner, plus de message d'erreur désormais. Merci bien !

    Par contre j'ai une petite interrogation sur la fonction datevec ; celle-ci ne semble me retourner que des choses sous la forme [Année Mois Jour 0 0 0], alors que j'aimerais bien aussi obtenir les Heures/Minutes/Secondes.

    ex : datevec (719528) = [1969 12 31 0 0 0]
    datevec (719529) = [1970 1 1 0 0 0]

    Ce qui me laisse penser qu'elle ne fait pas exactement ce que je souhaite, ce qui est prendre en entrée un temps UNIX (nombre de secondes, et pas nombre de jours comme elle semble l'interpréter) et me sortir une date plus "exacte" que seulement Jour/Mois/Année. Comment dois-je m'y prendre ?

    Merci !

  4. #4
    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 : 53 166
    Points
    53 166
    Par défaut
    Essaie ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    unix_time = 1095379198.75;
     
    unix_epoch = datenum('01/01/1970 00:00:00','dd/mm/yyyy HH:MM:SS');
     
    matlab_time = unix_time/(24*60*60)+unix_epoch;
     
    datevec(matlab_time)
    Je me suis référé à ceci : http://en.wikipedia.org/wiki/Unix_time
    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)

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Stagiaire
    Inscrit en
    Août 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Stagiaire
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 22
    Points : 7
    Points
    7
    Par défaut
    Merci pour ta rapidité, ça a l'air d'être bon

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/06/2014, 11h33
  2. [PHP 5.3] Passer une variable dans une class / function
    Par Invité dans le forum Langage
    Réponses: 5
    Dernier message: 17/05/2013, 20h33
  3. Embarquer un fichier.m dans une s-function
    Par espoir1976 dans le forum Simulink
    Réponses: 5
    Dernier message: 04/07/2012, 09h05
  4. Calcul de la dérivée dans une S-Function
    Par sara.ber dans le forum Simulink
    Réponses: 2
    Dernier message: 25/01/2012, 12h49

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