Discussions au sujet de NI LabVIEW

annuler
Affichage des résultats de 
Rechercher plutôt 
Vouliez-vous dire : 

vider la mémoire

Résolu !
Accéder à la solution

Bonjour tout le monde,

 

En effet, j'avais un problème de comment relié deux boucles while qui a été précédemment résolu lors de cette discussion https://forums.ni.com/t5/LabVIEW/Labview-put-the-acquisition-and-processing-in-different-while/td-p/.... Il était question de relier deux boucles et la solution choisie était de mettre un conduit (stream). Maintenant, j'ai un problème différent. Après un moment du lancement de mon programme, il y a un problème de mémoire qui apparait et le vi s'arrête. Ensuite, j'essaye de le relancer et là il marche même pas il me donne directement le message de mémoire saturée et ferme le programme. J'en ai déduit  que le problème est un problème de mémoire buffer car si je redémarre le PC, normalement le problème doit être résolu. Le problème principal c'est que le Vi fonctionne en acquisition continue des données (première boucle) et le traitement de ces données (seconde boucle) avec un flux qui lie les deux. Dans tous les cas, un problème de saturation de mémoire de buffer aurait apparu. Donc comment je peux faire pour vider cette mémoire en parallèle de du fonctionnement du vi ou c'est juste que je n'ai pas choisi le bon conduit (stream, tag,..) car chacun a une façon particulière du transfert des données. 

Je vous remercie par avance.

 

Yasmine

0 Compliments
Message 1 sur 3
2 311 Visites

Bonjour,

Voici une capture d'écran de mon programme. Il n'y a pas attendre dans les while. Il faut que je les ajoutent ?

Yasmine

0 Compliments
Message 2 sur 3
2 308 Visites
Solution
Accepté par l'auteur du sujet Yasmine13579

Il y a plus d'un problème dans ton programme. En premier lieu il ne devrait pas y avoir de nœud de rétroaction dans la boucle d'acquisition, c'est une première cause de l'augmentation constante de la mémoire (la taille du tableau augmente continument à chaque itération de la boucle). Le vi Signal Generator by Duration.vi est utilisé pour simuler une acquisition et ne représente pas une acquisition en temps réelle, donc la boucle d'acquisition s'effectuera aussi rapidement que le CPU le permet ce qui générera beaucoup de data en très peu de temps (dans ce cas il faudrait en effet insérer une temporisation dans cette boucle). Finalement la boucle de droite doit être plus rapide que la boucle d'acquisition afin d'éviter que le data non lue s'accumule dans la file d'attente. Comme ici l'acquisition s'effectue aussi rapidement que possible il y aura donc une autre accumulation de data dans la file d'attente.

 

Généralement, lorsqu'on a une acquisition rapide on évite le plus possible d'effectuer des opérations dans la boucle de lecture et on évite également l'utilisation de contrôles et d'indicateur dans cette car cela force la boucle à s'effectuer dans le fil de l'interface utilisateur (UI thread) ce qui la ralentie. Dans le cas d'une acquisition lente (10 Hz) ce n'est pas un problème.

 

Je de recommande également de jeter un coup d'oeil et de te familiariser avec l'architecture Producteur/Consommateur.

 

Ben64

Message 3 sur 3
2 281 Visites