Discussions au sujet des autres produits NI

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

Selection de valeurs (lignes) particulières d'un tableau pour traitement spécifique

Résolu !
Accéder à la solution

Bonjour à tous

 

Pour un travail dans le cadre de mes études, j'ai automatisé un banc de test qui mesure le taux d'erreur ainsi que d'autres paramètres y relatifs pour chacune des valeurs d'atténuation préalablement mises dans un tableau (parcours du tableau de la première à la dernière valeur et mesure du taux d'erreur pour chaque atténuation).

Je souhaite rajouter à ce calcul du taux d'erreur une mesure du diagramme de l'oeil et son l'affichage. Cependant, vu le temps mis par ce genre de mesure je souhaiterais avoir la possibilité de ne selectionner que certaines valeurs de mon tableau pour lesquelles ce calcul se fera. D'où la difficulté.

 

L'idée est qu'un booléen soit associé aux lignes de mon tableau et que selon le choix des lignes effectué, la mesure du diagramme de l'oeil ne se fasse que pour celles (les lignes) sélectionnées ( la valeur du booléen serait "TRUE" dans le cas d'une valeur d'atténuation pour laquelle la ligne serait sélectionnée,et inversément pour les lignes non-sélectionnées).

 

J'ai imaginé pouvoir rajouter "un bouton de selection" qui serait une sorte de "troisième colonne" à mon tableau (qui comporte déjà deux colonnes - Attenuation & Temps de mesure-)

 

Je vous remercie d'avance pour votre aide

 

Je Joins mon code en annexe

 

 

Tout télécharger
0 Compliments
Message 1 sur 21
7 603 Visites

Bonjour,
je vous suggère de commencer par nettoyer votre diagramme en utilisant des sous vi, le travail n'en deviendra que plus facile.

Se plonger dans un code aussi torturé relève du suicide pour une personne reprennant ce code.
Votre problématique semble assez simple à faire.
Cordialement,

V-F
0 Compliments
Message 2 sur 21
7 601 Visites

Il existe plein de méthodes pour ça.

 

Par exemple :

- vous pouvez gerer un tableau de booléen 1D à coté de votre tableau de mesure qui aurait une taille égale au nombre de mesure et qui commencerait au même index à l'affichage (par noeud de propriété) pour le cas ou l'utilisateur naviguerait dans le tableau (utilisation de la structure Event).

- vous pouvez également non pas gérer un simple tableau 2D de chaine de caractère mais un tableau de cluster 1D intégrant le booléen et les mesures associées

- vous pouvez opter pour un affichage avec un multi-colonne listbox ou vous jouez avec les symboles des lignes. Je vous ai préparé un exemple en PJ ou vous sélectionnez les lignes par double-clic. Le bouton 'Sélection' équivaut à ce que l'Utilisateur valide la sélection pour que vous puissiez engager les calculs ensuite.

- vous pouvez tout aussi bien utiliser la multiple sélection de la multi-colonne listbox (ctrl + selection des lignes), c'est suivant l'usage.

 

Par contre, il est vrai que votre code n'est pas très facile à lire... donc à mon avis, vous avez tout interet à l'aérer avant d'adapter une de ces solutions.

 

 

0 Compliments
Message 3 sur 21
7 594 Visites

Je vous remercie de vous être penché sur mon problème

 

Ce que je n'ai  peut-être pas précisé  dans mon précédent message c'est que je n'utilise Labview que depuis quelques jours ce qui justifierait peut-être le gros "chipotage dans mon code" (je n'ai pas encore aussi maîtrisé l'utilisation des subVI ...)

 

Pour rendre le code un peu plus lisible, je vous renvois une version dans laquelle j'ai enlevé des bouts de code qui compliqueraient la lecture. En se basant sur le code que je renvois, ce que je souhaite peut se traduire en faisant par exemple que les étapes 5 et 6  de la "structure séquence déroulée" se s'exécutent pour toutes les valeurs de mon tableau (chacune des valeurs d'atténuation) mais que l'opération 7 ne se fasse que pour les valeurs d'atténuation sélectionnées.

 

J'imagine qu'il faudra remplacer la "sous séquence déroulée" à l'etape 7 par une structure condition mais je ne vois pas comment faire le lien entre la ligne sélectionnée et la condition liée à cette structure condition.  Je trouve la proposition d'utiliser une multiple sélection très intéressante mais je ne vois donc pas comment l'adapter pour l'insérer dans mon code. 

 

Merci d'avance 

 

 

0 Compliments
Message 4 sur 21
7 590 Visites

Bonjour,
il suffit de créer un tableau de booléens ayant la même taille que votre tableau indexant la boucle for (il n'y a d'ailleurs pas besoin de câbler la taille du tableau à N, c'est le principe de l'auto indexation, votre boucle for s'exécutera automatiquement), et de "cercler" ce que vous ne voulez pas éxecuter par une structure condition.
Parce qu'un bon vi vaut mieux qu'un long discours, ci joint l'exemple.

Cordialement

V-F
Message 5 sur 21
7 566 Visites

D'ac avec Ramses64.

 

J'ajouterai simplement en sécurité un retaillage de la longueur du tableau de booléen pour qu'il soit effectivement de la même longueur que le tableau de mesure. Car l'auto-indexation a quelques travers => la boucle s'arretera au minimum de longueur des 2 tableaux.

 

Vous avez également une mini-optimisation à faire (qui n'apporte pas grand chose dans votre cas mais qui est juste un rappel) sur le dépilement du tableau de données à chaque tour de boucle => profitez du fait que vous pouvez obtenir plusieurs valeurs avec la fonction Index Array au lieu de faire appel 2 fois au tableau...

 

ResizeArray.jpg

0 Compliments
Message 6 sur 21
7 561 Visites

Bonjour à vous, 

je viens de coder la solution proposée mais j'ai une erreur sur la liaison entre le tableau booléen et la structure condition : "vous avez connecté deux terminaux de types dufférents. La source est de type tableau 1D de booléen. Le récepteur est de type booléen.

 

L'erreur semble logique mais dans l'exemple de  Ramses64, pourquoi ça marche?? Qu'est-ce que j'ai omis de faire pour que ça marche?? (j'utilise une boucle while et non une boucle for, est-ce la cause??)

 

 

 12.png

 

Je ne vois pas comment remédier à ce problème.

 

Merci 

0 Compliments
Message 7 sur 21
7 538 Visites
Bonjour,
oui, vous l'avez dit vous même, c'est parce que vous avez mis une boucle while au lieu de la boucle for...
Une boucle for s'exécute N fois, ou N est la taille du tableau auto indexant la boucle.

V-F
0 Compliments
Message 8 sur 21
7 534 Visites

Oui le problème vient bien du fait de l'utilisation de la boucle While au lieu de For.

 

A savoir que par défaut, lorsque vous connectez un tableau à l'entrée d'une boucle For, l'option d'auto-indexation est activée (représentation du tunnel avec de crochets) => Pour un tableau de taille N, à chaque tour de boucle, vous avez accès aux valeurs indexées automatiquement de dimensions N-1 (un tableau 1D auto-indexé en entrée vous donnera, la première valeur du tableau puis la suivant, puis la suivante, ....)

 

Vous pouvez désactiver cette option d'auto-indexation en faisant un clic droit sur le tunnel d'entrée en sélectionnant 'Désactiver l'auto-indexation'. Dans ce cas, tout le tableau sera accessible pour chaque itération de la boucle.

 

Pour la boucle while, vous avez les mêmes possibilités d'auto-indexation (clic droit) mais par défaut et par sécurité, les tunnels d'entrée d'une boucle while ne sont pas en auto-indexation => effectivement, cette option ne serait utile que dans le cas limite ou vous savez que votre boucle ne tournera pas plus au maximum que la taille de votre tableau et en plus vous devez coder la codition d'arret donc dangereux... ou dans le cas très rare ou vous pouvez vous autoriser à indexer un tableau sans avoir necessairement de valeur au bout d'un moment!?

Dans le 1er cas, si vous devez indexer un tableau mais que potentiellement vous devez l'arreter avant la fin complète de la boucle, préférez l'utilisation d'une boucle For en ajoutant une condition d'arrêt (clic droit => Ajouter une condition d'arret)

 

Pour plus d'info, référez vous à la rubrique d'aide de LabVIEW car ce principe d'indexation de données et très important.

Message Edité par J.DECHET le 03-11-2010 09:47 AM
0 Compliments
Message 9 sur 21
7 527 Visites

D'accord. Je comprends mon erreur.

 

 

Y a-t-il une autre solution pour mon problème en utilisant une boucle while??

 

Merci!! 

0 Compliments
Message 10 sur 21
7 519 Visites