Discussions au sujet de NI LabVIEW

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

LabVIEW plante après plusieurs heures d'utilisation

Résolu !
Accéder à la solution

Bonjour à tous, 

J'utilise LabVIEW connecté à une carte arduino pour monitorer plusieurs paramètres et pour commander des relais. 

Après quelques heures d'utilisation le front panel reste figé et je suis obliger de redemarrer LabView. 

Ceci peut venir de la carte ou de mon code ? 

Meci d'avance. 

 

 

 

0 Compliments
Message 1 sur 9
3 255 Visites
Solution
Accepté par l'auteur du sujet stevee_purple

Bonjour,

Sans code, ni précision, j'aurai tout de suite tendance à penser à une mauvaise gestion de la mémoire dans ton code.


C'est facile à vérifier, il te suffit de regarder avec le gestionnaire de tâche si ton programme grossit au fil du temps.
Ca se remarque aussi par un ralentissement conséquence, la fréquence de mesure a tendance à se réduire au fur et à mesure que la mémoire grossit.


Les origines classiques sont :

1- Stockage des données dans un tableau, engendrant un tableau de grande taille difficile à gérer dans le temps

2- Stockage des données dans un registre à décalage d'une boucle while, équivalent à un tableau de grande taille

3- Stockage des communications entre la carte arduino et le pc dans une chaîne par concaténation qui devient de plus en plus grande.


Les solutions à mettre en place pour éviter cela :

1- Stockage des données au fil de l'eau dans un fichier de mesure avec une structure de type producteur/consommateur.

2- Limitation de la taille des tableaux avec réécriture circulaire pour éviter de passer au delà d'un seuil critique de mémoire.


Cdt,
Michael

“En science, la phrase la plus excitante que l'on peut entendre, celle qui annonce des nouvelles découvertes, ce n'est pas "Eureka" mais c'est "drôle"
Isaac ASIMOV
Message 2 sur 9
3 241 Visites

Merci infiniment pour ta réponse. Et surtout pour les explications détaillés. 

Je n'est pas pensé à envoyer le vi. Voici mon code ci joint. 

J'ai pensé à ce genre de problèmes. En effet, la mémoire augmente et j'ai 3 mise en graphique. 

Qu'entends tu par le stockage des communications entre la carte et le pc ? et pour le stockage dans un fichier de messure de type producteur / consomateur ? (fichier excel ou matlab ?)

 

 

0 Compliments
Message 3 sur 9
3 227 Visites

Bonjour,

Je ne peux malheureusement pas ouvrir ton VI, je n'ai pas LV2016. IL faudrait que tu l'enregistres dans une version précédente (ex 2011) pour avoir un maximum d'aide.

 

Quand je parle du stockage des communications, je pense à une aide au débugage, qui revient à stocker en mémoire la totalité des trames échangés avec un équipement. Parfois on oublie de désactiver la fonction en utilisation finale, et la c'est la catastrophe pour la mémoire :D.

 

Quand je parle de stockage dans un fichier de mesure avec une architecture programme de type Producteur/Consommateur. Il s'agit d'enregistrer tes données sur le disque dur pour vider la mémoire vive utilisée par le programme. Le fichier peut être selon ton choix tdms/csv/txt/....


L'architecture producteur/consommateur te permet de réaliser cet enregistrement sur disque dur sans ralentir ton processus d'acquisition puisque les deux tournes en parallèles.

Tu peux trouver un exemple de ce type d'architecture dans les exemples Labview.

http://zone.ni.com/reference/fr-XX/help/371361H-0114/lvhowto/creating_vis_from_templates/

 

Bonne journée,

Michael

“En science, la phrase la plus excitante que l'on peut entendre, celle qui annonce des nouvelles découvertes, ce n'est pas "Eureka" mais c'est "drôle"
Isaac ASIMOV
0 Compliments
Message 4 sur 9
3 212 Visites

Bonjour, 

Le voilà enregistré avec la version 2011. Jespere que ça va fonctionner.

Merci encore pour les explications super détaillées Smiley heureux

 

Pour la stockage des communications, je cable les erreurs mais je n'utilise pas le SubVI clear error. C'est ca que tu veux dire par desactiver la fonction en utilisation finale ? Ou cette option ce trouve dans les menus ? 

 

Je n'avais pas connaissance de ces exemples je vais regarder ca en detail. 

 

Très bonne fin de journée 

 

Steven

 

0 Compliments
Message 5 sur 9
3 200 Visites

Alors j'ai regardé ton exemple, et il y a un souci dans ton choix d'architecture.

Tu n'as pas à utiliser une boucle while "cadencé" car ton code ne permet pas d'avoir un cadencement propre.
Passe sur une structure while classique.


En effet, il est complètement contradictoire d'utiliser un cadencement précis, alors que tu as des mises en tempo récurrente dans ta boucle. Une structure cadencée est à utiliser quand celle-ci peut gérer ton timing de manière autonome, sinon cela est contreproductif, et générateur d'erreur.
Cela peut justifier l'instabilité de labview.


D'autre part, j'ai du mal à voir la finalité de ton code, ton acquisition a l'air plus souvent en pause, qu'en exécution, du fait des différentes structures "case" qui comporte des fonctions "attendre". Ne pourrais tu pas paralléliser certaines choses ?


Dans le cas contraire, je t'encourage vivement à passer sur une structure "machine à état" vis à vis de ton code actuel, afin de gagner en cohérence vis à vis de l'enchainement de tes actions / pauses. Tu trouveras des exemples dans LV.


Bon courage pour la suite.

“En science, la phrase la plus excitante que l'on peut entendre, celle qui annonce des nouvelles découvertes, ce n'est pas "Eureka" mais c'est "drôle"
Isaac ASIMOV
Message 6 sur 9
3 197 Visites

Je me suis vite rendu compte que ça ne fonctionnait pas. Je me servais surtout du mode manuel au début. 

Je pense me servir d'une machine d'état pour la gestion des relais et d'une boucle cadensé pour le monitoring.

 

Dans le cas d'une boucle while classique il n'est pas necessaire de rajouter un wait pour ralentir son execution ?

 

Merci encore pour tes conseils, cela va me servir pour la suite. 

Bonne fin de journée 

Steven

0 Compliments
Message 7 sur 9
3 195 Visites

Bonjour,

Si dans le cadre d'une boucle "wait", il est d'usage de rajouter une fonction "attendre" de l'ordre de 50ms.

 

Son objectif n'est pas de "ralentir son exécution", mais de permettre au processus de récupérer de la charge pour une autre tâche pendant ce laps de temps.


Tu peux faire un test tout simple, avec une boucle while et un indicateur numérique câblé sur le terminal d'itération.

Regarde ta charge processeur avec le gestionnaire de tâche, entre le cas sans temporisation, et avec le cas "attente de 1 ms". Tu verras clairement la différence, pour des performances similaires à l'oeil nu sur ton affichage.

 

Cdt,

Michael

“En science, la phrase la plus excitante que l'on peut entendre, celle qui annonce des nouvelles découvertes, ce n'est pas "Eureka" mais c'est "drôle"
Isaac ASIMOV
Message 8 sur 9
3 190 Visites

Personnellement, je préconiserais l'utilisation d'une boucle while cadencée, uniquement si tu as un impératif de fréquence de travail rigide (i.e où il te faut connaître les itérations "manquées"), dans le cas contraire, une boucle while avec tempo sera largement suffisante, et moins "lourde" niveau diagramme.

“En science, la phrase la plus excitante que l'on peut entendre, celle qui annonce des nouvelles découvertes, ce n'est pas "Eureka" mais c'est "drôle"
Isaac ASIMOV
0 Compliments
Message 9 sur 9
3 188 Visites