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

Algorithmes et structures de données Discussion :

[C++] Asservissement de flux de données.


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 183
    Par défaut [C++] Asservissement de flux de données.
    Bonjour @ tous

    bon, j'ai un souci ( mais vous devez probablement vous en douter, non ? )

    J'ai un programme qui tourne sur un PC, et qui alimente 2 modules électroniques via des FIFOS ( peut importe de quoi il s'agit ) chacun de ces modules consomme en fait le flux de données qui est généré par 2 autres modules ...

    En gros, ça donne ça : Nom : toto.PNG
Affichages : 286
Taille : 11,1 Ko

    Les producteurs (P1 & P2) envoient des données à une fréquence donnée ( horloge hard )

    Les consommateurs (C1 & C2) prennent les données à une fréquence donnée ...

    J'ai besoin que les 2 consommateur restent synchronisés ... et c'est pas le cas aujourd'hui, j'ai un de mes consommateurs dont l'horloge varie un peu ( température, dérive du quartz ... )

    Je cherche donc avec l'utilisation d'un PC à pouvoir fabriquer/supprimer les données de l'une des 2 lignes pour que ça reste synchro ...

    Tout cela me fait penser à une boucle d'asservissement et à de l'interpolation de données ...

    Pour l'interpolation, pas de souci, je vais commencer pas une bête interpolation linéaire, puis probablement mettre une courbe de Bezier à la place ensuite ...

    Mais pour l'asservissement, je rame ...

    A ma disposition, j'ai le delta t entre mes 2 consommateurs ( en ms )

    Et je voudrais trouver un algo qui me donne un coef qui m'indiquerait combien d'échantillons je dois supprimer/fabriquer dans les FIFO du consommateur en cause pour que le consommateur 1 rattrape/attende le consommateur 2 ...

    Ce coef devra être ajusté en temps réel avec une pente max assez faible ( pas de variation brusques ) ...

    Voilà, si ça vous dis quelque chose ...

    Merci,
    Have fun !
    Seb.

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 183
    Par défaut
    ... On dirait que mon sujet ne vous inspire pas beaucoup ...

    J'ai continuer à y réfléchir, et j'ai tenté de modéliser tout ça un peu plus clairement ...

    Donc, en fait, j'ai un flux de données qui entre dans une FIFO sous la forme de paquets de 'x' échantillons, chaque paquet dispose d'un TimeStamp local.

    J'ai ensuite un autre flux (2) qui me donne le timestamp (local aussi) de référence
    NB: C'est en fait le timestamp du paquet d'échantillons du flux 2 quand il "sort" du PC ...

    Donc pour être clair, le flux 2 indique << Je viens d'envoyer les données de l'heure 'xxx' >> ...

    Donc pour que le flux 1 reste synchrone avec le flux 2, il va falloir ajouter/supprimer des échantillons du flux 1 ... les flux sortant étant continus et devant le rester ...

    Je cherche donc un algo qui va me donner à l'instant 't' combien d'échantillons du flux 1 je devrais ajouter/supprimer pour que le flux 1 "tende "à rester synchro avec le flux 2 ...

    Le tout en temps réel car les horloges des consommateurs varient dans le temps ...

    Donc c'est de l'asservissement je pense ...

    Mais je sèche pour le "comment faire"

    Si vous aviez juste même une piste

    Merci.
    @++
    Seb.

  3. #3
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Bon. Meme avec le 2eme post ce n'est pas plus clair pour moi.

    Tu as 2 consomateurs qui consomment, à des intervalles differents, des valeurs générées à un intervalle régulier.

    Par exemple, si le consomateur n°2 est 2 fois plus lent que le n°1 on aurait:
    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
     
    -- Temps t=0 -------------
     
    [FIFO1]: 6 5 4 3 2 1 
    [FIFO2]: 6 5 4 3 2 1 
     
    Conso1: FIFO1.pop() -> 1
    Conso2: rien
     
    -- Temps t=1 -------------
     
    [FIFO1]: 7 6 5 4 3 2 
    [FIFO2]: 7 6 5 4 3 2 1 
     
    Conso1: FIFO1.pop() -> 2
    Conso2: FIFO1.pop() -> 1
     
    -- Temps t=2 -------------
     
    [FIFO1]: 8 7 6 5 4 3
    [FIFO2]: 8 7 6 5 4 3 2
     
    Conso1: FIFO1.pop() -> 3
    Conso2: rien
     
    -- Temps t=3 -------------
     
    [FIFO1]: 9 8 7 6 5 4
    [FIFO2]: 9 8 7 6 5 4 3 2
     
    Conso1: FIFO1.pop() -> 4
    Conso2: FIFO2.pop() -> 2
    c'est ca ?
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  4. #4
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Bonjour,

    Peux-tu connaitre à tout moment la taille de la FIFO du flux sortant ?

    Si oui, on peut utiliser un coef d'ajustement X des flux entrant et sortant (au départ: X=1), puis calculer sur la derniére période (intervalle de temps T) le rapport Y = flux sortant/flux entrant et si X est "assez" différent de Y, X sera modifié pour s'adapter à Y (exemple: X=Y ou X=(X+Y)/2 ou ...)

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 183
    Par défaut
    Bonsoir

    merci de votre présence

    Bon je crois que même avec le second post, c'est loin d'être clair !

    Alors,

    Tout d'abord, j'ai un producteur 1 et un consommateur 1.
    Eux sont parfaitement synchronisés ( le consommateur 1 "consomme" exactement à la vitesse que le producteur 1 "produit" )

    Leur flux ( producteur 1 -> consommateur 1 ) est simplement bufferisé ( FIFOS ) par paquet d'échantillons auquel je colle un timestamp à la réception.
    J'utilise le timestamp du paquet que j'envoie dans le consommateur 1 comme horloge de référence.

    C'est pour moi le << On en est à ... ms >>

    Maintenant, j'ai le producteur 2 qui produit de façon régulière des paquets d'échantillons auquel je colle aussi un timestamp lors de la réception.

    Mon problème vient du consommateur 2 qui lui "consomme" à une fréquence approximative. Cette fréquence devrait osciller autours d'une valeur, proche de la fréquence de production du producteur 2.

    Je veux donc adapter la taille des paquets ( nbr d'échantillons ) qui sortent vers le consommateur 2 de façon à corriger le débit du consommateur 2.

    Pour moi, la variable à calculer est 'x', avec x qui est le nombre ( positif ou négatif ) d'échantillons à ajouter/supprimer du paquet d'échantillons juste avant de l'envoyer dans le consommateur 2.

    Pour déterminer ce nombre 'x', j'ai à ma disposition les timestamp des paquets que je m'apprête à envoyer dans les 2 consommateurs.

    Voilà, j'espère que c'est plus clair !!!

    Merci,
    @++
    Seb.

  6. #6
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Graffito: Peux-tu connaitre à tout moment la taille de la FIFO du flux sortant ?
    C'est un moyen de connaitre le débit du consommateur 2 (quand ilprend du retard) ...
    Ou mieux, sais-tu combien de temps chaque paquet reste dans la FIFO du consommateur?
    As-tu une de ces informations ?

  7. #7
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par Seb.26 Voir le message
    Voilà, j'espère que c'est plus clair !!!
    Non.

    C'était clair jusqu'a la phrase:
    Citation Envoyé par Seb.26 Voir le message
    Je veux donc adapter la taille des paquets ( nbr d'échantillons ) qui sortent vers le consommateur 2 de façon à corriger le débit du consommateur 2.
    Je ne comprend pas le rapport que tu fais entre "synchroniser" et "corriger le débit".

    • Tu veux que les paquets en queue de fifo aient le meme timestamp ?
    • Tu veux que les 2 consommateurs recoivent la meme quantité de données ?
    • Autre ?


    Si tu nous expliquais dans quel contexte tu as ce problème, ca serait peut-etre plus clair.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

Discussions similaires

  1. Flux de données C# 2.0
    Par jpo dans le forum Accès aux données
    Réponses: 2
    Dernier message: 12/10/2006, 09h13
  2. [AJAX/XML/JAVA] Afficher un flux de données depuis un site web
    Par chodaboy34 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 10/10/2006, 16h38
  3. Réponses: 1
    Dernier message: 24/05/2006, 12h10
  4. [XML] [EXPAT] traitement d'un flux de donnée xml contenant des \n
    Par firejocker dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 23/02/2006, 16h49
  5. Rediriger un flux de données sous linux
    Par Nicaisse dans le forum POSIX
    Réponses: 7
    Dernier message: 01/07/2003, 16h04

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