LabVIEW

cancel
Showing results for 
Search instead for 
Did you mean: 

Qu'est-ce qui limite la vitesse d'excécution d'une boucle while?

J'utilise Labview 7.0 avec une carte PCI-6024E (à 12bits à 200Kéch/s en entrée et 12bits à 10Kéch/s en sorties). Mes VI sont essentiellement basé sur des boucles "while" dont je règle la temporisation et contrôle la période d'excécution. Mon PC n'est pas capable d'excécuter ces boucles à des périodes inférieures à 150-200ms.

Qu'est-ce qui limite la période d'acquisition des boucles while: les performances du PC ou la carte?
En gros, est-ce qu'il suffirait que je change de PC?
Merci...

PC: Pentium II, 392760 Ko de RAM
0 Kudos
Message 1 of 9
(4,065 Views)
Bonjour!
   Tout d'abord, il faudrait rappeler qu'il y a un forum Francophone, il serait mieux poster ici en anglais, aussi parce que on va avoir plus de reponses et plus vite... Smiley Happy

   La limite des boucles while c'est l'execution des trucs qu'il y a dans le boucle! Si tout est execute, il recommence, tout simplement.  Donc, ca depend de qu'est ce qu'il y a dans le boucle: si tu fais une acquisition, si tu attend qu'une tache de measure est echouée, ca depend de combien de temp il faut pour accomplir la mesure.  Mais se peut passer aussi un autre phenomene: peut etre, si tu fais un "Start task" chaque fois la boucle recommence, que a la prochaine iteration, "start task" doit attendre que la mesure precedente est accomplis.

   C'est aussi vrai que un Pentium II peut etre un peut age comme PC, donc si tu as besoin de performance, il faudrait bien passer a quelque chose de plus nouveau, LabView 8.5 peut creer programme qui utilise les processeurs multicœurs. D'ailleurs, un PC Pentium II douvrait executer un boucle while vide en 1 ms...

   Si tu veux, post ton code, ca serait plus facile de voir pourquoi le boucle dure 200 ms

graziano
0 Kudos
Message 2 of 9
(4,055 Views)
Effectivement, désolé d'avoir posté ça dans le forum anglais... et surtout merci d'y avoir répondu.
En fait j'ai posé ma question un peu vite et du coup elle n'est pas très claire:
Je temporise volontairement mes boucles while via la fonction  "attendre un multiple de ms", mais si je temporise sous 150 ms, la boucle while s'excécute en plus de temps que la durée de la temporisation.
Mes boucles "while" ne sont pas consistuée de fonctions complexes (addition, comparaison, extraction dans des tableaux (petits)), mais il y a une lecture via la fonction "AI Read One Scan.vi" et une écriture via "AO Update Channel.vi". Je pense que ce sont ces deux actions qui rendent l'excécution trop lente.
Est-ce donc à cause de la carte qui rend la communication trop lente ou à cause du PC tout simplement?
0 Kudos
Message 3 of 9
(4,049 Views)

C'est probablement parce que les instructions a l'interieure de la boucle prennet un peu plus de 150 ms a executer, alors l'attente de 150ms devient 300ms, parce que c'est une attente en multiple de 150ms.

Essaie de mesurer la duree des instructions a l'interieure de la boucle.

R



Message Edited by JoeLabView on 07-09-2008 08:17 AM
0 Kudos
Message 4 of 9
(4,044 Views)
Difficile de faire une analyse pointue sans voir le code.

Toutefois, voici un principe général qui pourrait éventuellement s'appliquer à votre code. L'initialisation et la destruction des tâches d'acquisition nécessitent un temps non négligeable. Pour éviter cette majoration du temps d'exécution de la boucle, le principe consiste à exécuter l'initialisation une seule fois avant d'entrer dans la boucle et la destruction une seule fois également après être sorti de la boucle.

Initialiser >> Lire et écrire dans la boucle >> Détruire est beaucoup plus performant que
Initialiser, lire, écrire et détruire dans la boucle
0 Kudos
Message 5 of 9
(4,031 Views)
Salut,
   je pense que c'est utilise le Traditional DAQ... donc, pas des taches! "AI Read One Scan.vi" sa sonne comme une vieille fonction...Smiley Happy

graziano
0 Kudos
Message 6 of 9
(4,029 Views)
Je viens de jeter un oeil aux deux VIs que vous utilisez. Voici ce que je vous recommande :
  • Si tel n'est pas le cas, reliez le compteur d'itération de la boucle à l'entrée iteration (init:0) de AI Read One Scan.
  • Créez une copie de AO Update Channel et modifiez celle-ci de manière à ajouter l'entrée iteration count (0:initialize) du sous-VI AO Write One Update à son connecteur.
  • Utilisez la copie modifiée et reliez également le compteur d'itération de la boucle à l'entrée ajoutée.
Ceci devrait sensiblement réduire le temps d'exécution de la boucle puisque les tâches d'écriture et de lecture seront ainsi configurées uniquement lors de la première itération.

Une alternative à ces opérations serait d'utiliser des fonctions DAQ plus avancées qui vous permettront de séparer la configuration de la lecture/écriture selon mon précédent message.





Message Edité par JB le 07-09-2008 03:27 PM
0 Kudos
Message 7 of 9
(4,026 Views)

Graziano a écrit:
Salut,
   je pense que c'est utilise le Traditional DAQ... donc, pas des taches! "AI Read One Scan.vi" sa sonne comme une vieille fonction...Smiley Happy

graziano



Oui, il s'agit en effet du DAQ traditionnel. Cela n'invalide toutefois en rien le principe décrit.
Message 8 of 9
(4,022 Views)
Oui, bien sure! Le principe est valid, en effect 50% des post sur les probleme DAQ ont comme reponse "place init routines outside while loop"! Smiley Very Happy

graziano
0 Kudos
Message 9 of 9
(4,019 Views)