Buffer a l'aide d'un fichier texte (oscillo a memoire) ?

Résolu
rapido6 Messages postés 28 Date d'inscription dimanche 1 janvier 2006 Statut Membre Dernière intervention 20 août 2015 - 13 juil. 2009 à 10:22
rapido6 Messages postés 28 Date d'inscription dimanche 1 janvier 2006 Statut Membre Dernière intervention 20 août 2015 - 13 juil. 2009 à 13:41
Bonjour a tous,
Je vais essayer d'expliquer ce que je veux faire le plus simplement possible !
Je dois realiser une sorte d'oscilloscope a memoire (en gros)
donc je recupere une ou plusieurs variables ou leurs valeurs varient de 0,00 a 10,00 dans le temps (carte analogique -> numerique)
Je veux stocker ces valeurs dans un fichier texte (ou autre ????) mais au bout d'un temps donné je commence a effacer les première données et je continue a enregistrer les nouvelles qui arrivent... tout ca pour eviter d'avoir un fichier de données énorme...
Pour vous quel est la meilleure solution ?
un fichier texte (je ne veux pas utiliser de base de données) ?
un tableau dynamique ?
A savoir que la frequence d'acquisition pourra etre au minimum 1ms et avec 5 ou 6 variables en meme temps

Avez vous des idées

Merci d'avance...

Steph.

4 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
13 juil. 2009 à 11:23
Salut
Ce que tu cherches à faire est une pile FIFO : First In, First Out
Voilà un mot clé pour tes recherches.
Le fichier texte n'est pas viable (*) puisque tu ne pourras pas supprimer les données de début de fichier, mais seulement en ajouter à la fin.
(*) pour une utilisation à cette vitesse de scrutation

Le tableau dynamique en mémoire est la solution la plus simple.
Il te suffit de créer 6 tableaux pour tes 6 variables, d'y déclarer un nombre d'éléments suffisant, par exemple, si tu dois mémoriser 30 secondes avec une données toutes les milliSecondes (*), tu le dimensionneras à 30.000.
(*) a supposer que VB6 sache scruter à cette vitesse
30.000 données de type Long ou Single par variable 30.000 x 4 120.000 octets par variable : C'est gros, mais acceptable en mémoire.
Si tu veux gagner en taille, diemnsionne en Integer = 2 octets et stocke tes valeurs de 0.00 à 10.00 avec un facteur 1000, exemple pour stocker 6.78, tu stockes 6780.

Pour gérer ce tableau rapidement, il n'est pas recommandé de jouer avec un décalage des valeurs, ça prendrait trop de temps (ou alors peut être avec l'API CopyMemory, mais sur les tableaux, on a souvent des surprises).
Il faut travailler avec un Index qui désignera la donnée du tableau la plus récente et faire évoluer cet index de 0 à 30.000.
Pour le traitement, tu partiras de Index vers la fin du tableau et, quand tu arriveras à la fin du tableau, les données suivantes iront de 0 à Index-1
Exemple avec un tableau de 6 valeurs; à chaque scrutation, la valeur à mémoriser s'incrémente :
   Index   Valeur
      1            1
      2            2
      3            3
      4            4
      5            5
      6            6

Quand la valeur suivante, 7, arrive, tu repasses l'index à 1, écrasant la plus vieille valeur.
   Index   Valeur
      1            7
      2            2
      3            3
      4            4
      5            5
      6            6

Tu vois le genre ?

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
13 juil. 2009 à 12:33
Oui, un tableau à 2 dimension, genre
   Dim monTableau(5, 30000) As Single
Bah ... pourquoi fichier texte ?
Oui, si tu veux mémoriser les données, avec la méthode Open + Append.
Si tu es sûr de ne pas toucher au type de variable (Integer, Single ... : la longueur des données est connue par avance), tu peux gérer le tableau en séquentiel, genre :
   Type typeLigne
      TimeStamp      As Long
      Donnée1         As Single
      Donnée2         As Single
      Donnée3         As Single
      Donnée4         As Single
      Donnée5         As Single
   End Type
   Dim maLigne As typeLigne
Dans TimeStamp, tu peux par exemple stocker un GetTickCount (API) qui représente le nombre de millisecondes écoulées depuis minuit.
Et dans ton fichier, tu enregistres et lis directement "maLigne" avec un truc du genre
   Open "C:\mon fichier" For Random Access Write As #1 Len=Len(maLigne)
et Get #1, NoEnregistrement, maLigne
ou Put

Tu n'as plus qu'à approfondir, les détails sont dans l'aide ...

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
3
rapido6 Messages postés 28 Date d'inscription dimanche 1 janvier 2006 Statut Membre Dernière intervention 20 août 2015
13 juil. 2009 à 11:44
Ok merci beaucoup cette explication !
Je vois plus clair maintenant...

Je crois que je vais utiliser le tableau dynamique
un seul je pense ? car meme si j'ai plusieurs courbes elles seront toujours toutes synchro par rapport au temps !
Et pour finir, si j'ai bien compris, et si  je souhaite mémoriser ces données,  je transfère le tableau dans un fichier texte et comme cela je pourrais revoir la ou les courbes enregistrées...
 C'est bien ca ?

J'espère que ca va trop scintiller, car je dessine les courbes dans un PictureBox (lecture du tableau dynamique)

Merci encore...

Steph.
0
rapido6 Messages postés 28 Date d'inscription dimanche 1 janvier 2006 Statut Membre Dernière intervention 20 août 2015
13 juil. 2009 à 13:41
Merci pour toutes ses infos, a moi maintenant de mettre en place...

Steph.
0
Rejoignez-nous