RESSOURCES / ACTUALITÉS / SALONS / WEBINAIRES
Dernières Actualités
Quelles alternatives aux cartes d'acquisition multifonction de la série M (NI 62xx) ?
Optimisez la communication réseau de vos véhicules pour plus de performance et de fiabilité
Vérifiez les composants et systèmes des véhicules avec nos solutions de contrainte et de charge
Adoptez les bonnes stratégies pour développer vos modules de code !
Lors de la création d'un programme de test avec TestStand, les principales fonctionnalités de test sont implémentées dans des modules de code distincts. TestStand utilise des adaptateurs pour appeler ces modules, qui peuvent être développés dans divers environnements de programmation tels que LabVIEW, LabWindows™/CVI™, C#, VB .NET, C/C++ et ActiveX.
Ce document présente les meilleures pratiques à suivre lors du développement de vos modules de code de test, qui seront appelés à partir de votre séquence de test. Il est supposé que vous avez une connaissance de base de TestStand, y compris la création d'une séquence de test simple.
Avant de commencer à développer un système de test, il est important de définir une approche générale pour les aspects suivants :
Granularité des Modules de Code
Lors de la conception d'un système de test, il est crucial de maintenir une granularité cohérente pour les modules de code. La granularité fait référence à l'étendue des fonctionnalités de chaque module dans un système de test. Une séquence de test avec une faible granularité appelle peu de modules, chacun exécutant plusieurs fonctionnalités, tandis qu'une séquence avec une granularité élevée appelle de nombreux modules, chacun ayant une portée plus restreinte.
Faible granularité | Granularité élevée |
Plus facile à gérer avec moins de modules de code. Amélioration des performances grâce à moins d'appels de modules. | Meilleure lisibilité des fichiers de séquence, bien que des séquences trop granuleuses puissent devenir encombrées. Plus facile d'isoler les problèmes et les bogues dans les modules de code. |
Il est essentiel de trouver un équilibre entre ces deux extrêmes, car chacun présente ses propres avantages.
Figure 1. Implémentation d’un test simple avec différents niveaux de granularité
Pour assurer une granularité cohérente dans votre système de test, il est essentiel de créer un ensemble de normes pour le développement des modules de code, telles que :
Définition d’une Structure de Répertoires pour les Fichiers de Séquence et les Modules de Code
Lors de la spécification du chemin d’un module de code dans un pas de test, il est préférable d'utiliser des chemins relatifs plutôt qu'absolus pour les raisons suivantes :
TestStand utilise une liste de répertoires de recherche pour résoudre les chemins relatifs, incluant généralement le répertoire du fichier de séquence actuel, les répertoires spécifiques à TestStand et les répertoires système.
Il est crucial de définir une structure de fichiers avant de commencer le développement. Voici quelques conseils pour établir une stratégie de stockage des fichiers de séquence et des modules de code :
Figure 2. Organisez votre structure de répertoires de manière à ce que les modules de code soient placés dans un sous-répertoire relatif au fichier de séquence.
Lors du déploiement du code de test avec l'utilitaire de déploiement TestStand, vous pouvez spécifier des destinations précises pour les fichiers de séquence et les modules de code dépendants. Si un chemin relatif existe entre les répertoires de destination, l'utilitaire mettra à jour les chemins dans le fichier de séquence pour pointer vers les nouveaux emplacements. Il est généralement préférable de faire correspondre la structure de répertoires de votre déploiement à celle du système de développement pour assurer une transition fluide.
Lors de la définition de la portée des modules de code pour votre système de test, il est crucial de déterminer où implémenter chaque fonctionnalité : dans les modules de code ou dans le fichier de séquence. Les sections suivantes peuvent vous aider à choisir l'emplacement le plus approprié pour les fonctionnalités courantes :
Évaluation des Limites et des Résultats des Tests
Idéalement, les modules de code devraient se concentrer sur l'obtention des mesures de test, tandis que la séquence de test devrait traiter les résultats bruts. Cette méthode offre plusieurs avantages :
Pour des mesures simples, le module de code peut renvoyer la valeur brute à la séquence pour traitement. Par exemple, si un pas de test mesure la tension sur une broche spécifique de l'unité sous test (UUT), le module de code doit renvoyer la valeur mesurée, et la séquence de test peut alors déterminer le résultat en utilisant un pas de test de limite numérique.
Figure 3. Évaluer les limites directement dans le pas de test simplifie les modules de code et améliore la qualité de la journalisation des résultats.
Cependant, pour des tests plus complexes, il peut être nécessaire de traiter les résultats bruts dans le module de code. Les données complexes peuvent être converties en une chaîne ou un résultat numérique, qui peut ensuite être évalué dans TestStand. Par exemple, les résultats d'un test de balayage de fréquence peuvent être traités pour obtenir une valeur minimale, que le module de code évalue avant de renvoyer les données de fréquence pour la journalisation, comme indiqué dans l’exemple de test du périphérique mobile ci-dessous :
Figure 4. Pour des données plus complexes, traitez-les dans le module de code afin de générer un résultat numérique ou textuel, puis utilisez un paramètre pour transmettre les données brutes à des fins de journalisation.
Si les données brutes sont volumineuses, leur transmission à TestStand peut affecter les performances. Dans ce cas, envisagez d'enregistrer les données directement dans un fichier TDMS et de créer un lien vers ce fichier dans le rapport de test. Cela permet de référencer les données sans les transmettre à TestStand. Pour plus de détails, consultez la section sur l'inclusion d'hyperliens dans un rapport - Fichier TDMS.
Si un pas de test ne peut pas déterminer le résultat en utilisant les types d’évaluation disponibles, envisagez de créer un nouveau type de pas de test avec des fonctionnalités supplémentaires adaptées au type de test requis. Pour plus d’informations sur la création de types de pas de test personnalisés, consultez l’article sur les meilleures pratiques pour le développement de types de pas de test personnalisés de cette série.
Définition des Stimuli de Test
Pour de nombreux tests, l’UUT ou l’environnement de test doit être dans un état spécifique avant de pouvoir effectuer le test. Par exemple, une tension d’excitation peut être nécessaire pour mesurer la température, ou une chambre chauffée doit être réglée à une température précise. Utilisez des paramètres pour transmettre ces valeurs d’entrée, comme la tension d’excitation ou la température souhaitée. Cette méthode présente des avantages similaires à ceux du retour de données brutes dans les modules de code, comme expliqué précédemment.
Journalisation des Résultats de Test
TestStand offre des fonctionnalités intégrées pour la génération de rapports et l’enregistrement des résultats dans une base de données. Par conséquent, évitez d’implémenter l’enregistrement des données directement dans les modules de code. Assurez-vous plutôt que toutes les données à enregistrer sont transmises en tant que paramètres et utilisez TestStand pour les enregistrer. Certaines données, comme les résultats des tests, les limites et les informations d’erreur, sont automatiquement enregistrées. Pour enregistrer d’autres données, utilisez la fonction de résultats supplémentaires pour inclure des paramètres supplémentaires dans le rapport.
Pour plus d’informations sur l’ajout de résultats au rapport de test, consultez l’exemple "Ajouter des données personnalisées à un rapport" inclus avec TestStand.
Si vous avez des exigences spécifiques pour la journalisation, envisagez de modifier ou de créer un plug-in de traitement des résultats. Cela vous permettra d’utiliser la collection de résultats intégrée de TestStand tout en déterminant comment les résultats sont traités et présentés. Consultez la section sur la création de plug-ins dans le document "Pratiques exemplaires pour le développement et la personnalisation de modèles de processus TestStand" pour plus d’informations.
Opérations en Boucle
Déterminer la meilleure approche pour implémenter des boucles peut être complexe, chaque méthode ayant ses avantages et inconvénients. Voici quelques conseils pour choisir la stratégie la mieux adaptée à votre application :
Boucle Interne dans le Module de Code :
Boucle Externe dans le Fichier de Séquence :
Exécution d’Opérations de Commutation
De nombreux systèmes de test utilisent des commutateurs pour permettre à un seul matériel de tester plusieurs sites. Les commutateurs permettent de contrôler par programme les connexions des broches d’une unité en cours de test (UUT) à du matériel spécifique via des routes prédéfinies.
Implémentation de la Commutation dans les Modules de Code TestStand
Vous pouvez implémenter la commutation dans les modules de code TestStand de plusieurs façons :
Lorsque vous utilisez du matériel NI Switch, NI Switch Executive permet de définir rapidement des itinéraires. Si vous avez accès à NI Switch Executive, l’utilisation des paramètres de pas intégrés pour la commutation est généralement la meilleure approche, offrant plusieurs avantages :
Figure 5. Utilisez NI Switch Executive pour définir des itinéraires directement dans les paramètres de pas TestStand, en prenant en charge les expressions TestStand pour déterminer dynamiquement l’itinéraire en fonction de l’indice de boucle actuel ou d’autres propriétés.
Exécution de Calculs et Manipulation des Données
Pour éviter de maintenir des modules de code pour des tâches simples, utilisez le langage d’expression de TestStand pour effectuer des calculs de base et manipuler des tableaux unidimensionnels. Les tâches de programmation plus avancées doivent être implémentées dans les modules de code, car les langages de programmation offrent des fonctionnalités plus robustes. Par exemple, la concaténation de tableaux multidimensionnels est plus facile avec les fonctions natives de LabVIEW qu’avec le langage d’expression.
Dans certains cas, les classes natives du framework .NET peuvent être utilisées pour éviter des expressions trop complexes. Par exemple, la classe System.IO.Path permet de manipuler rapidement des chemins sans créer de module de code.
Figure 6. Vous pouvez utiliser un pas .NET pour accéder aux méthodes du framework .NET sans nécessiter de module de code supplémentaire.
Lors de l’implémentation de modules de code, plusieurs décisions de conception affecteront la plupart des modules que vous créez. Voici quelques conseils pour les concepts suivants :
Communication des Données de TestStand aux Modules de Code
Il existe deux méthodes pour accéder aux données TestStand dans un module de code :
En général, il est préférable d’utiliser des paramètres pour transmettre les données plutôt que d’accéder directement via l’API TestStand pour les raisons suivantes :
Figure 7. Dans la mesure du possible, utilisez des paramètres pour transmettre les données nécessaires aux modules de code.
Cependant, l’utilisation de l’API pour accéder directement aux propriétés peut être utile lorsque le module de code doit accéder dynamiquement à diverses données en fonction de l’état du pas. Utiliser des paramètres dans ce cas peut entraîner une longue liste de paramètres, dont certains ne sont utilisés que dans certaines conditions.
Si vous utilisez l’API TestStand dans un module de code, transmettez une référence à l’objet SequenceContext (ThisContext) en tant que paramètre. Cet objet donne accès à tous les autres objets TestStand, y compris le moteur TestStand et l’état d’exécution actuel. La référence de contexte de séquence est également nécessaire si vous utilisez le moniteur de terminaison ou les VIs de boîte de dialogue modale.
Figure 8. Utilisez SequenceContext pour accéder à l’API TestStand dans les modules de code, permettant ainsi l'accès programmatique aux données.
Si vous réutilisez des modules de code en dehors de TestStand, gardez à l’esprit que toutes les opérations utilisant l’API TestStand ne seront disponibles que si le module est appelé à partir d’une séquence TestStand. Les données obtenues via l’API ne seront pas accessibles. Vous pouvez définir un autre mécanisme pour obtenir des données de test lorsque le module de code est utilisé en dehors de TestStand, en vérifiant d’abord si la référence de contexte de séquence est nulle. Dans LabVIEW, utilisez la fonction Not A Number/Path/Refnum?, qui renvoie une valeur booléenne.
Figure 9. Utilisez la fonction "Not A Number/Path/Refnum?" pour vérifier la validité de la référence d’objet SequenceContext dans les modules de code utilisés en dehors de TestStand.
Gestion des Ensembles de Données Volumineux dans les Modules de Code
Les modules de code peuvent produire de grandes quantités de données complexes à partir de mesures ou d’analyses. Évitez de stocker ces données dans des variables TestStand, car TestStand crée une copie des données lors de leur stockage, ce qui peut réduire les performances et provoquer des erreurs de mémoire insuffisante. Utilisez les approches suivantes pour gérer des ensembles de données volumineux sans créer de copies inutiles :
Gestion de la Terminaison de Séquence dans les Modules de Code
Lorsque l’utilisateur appuie sur le bouton Terminer (Terminate), TestStand arrête l’exécution de la séquence et exécute tous les pas de nettoyage. Cependant, si un module de code est en cours d’exécution, il doit terminer son exécution et retourner le contrôle à TestStand avant que la séquence puisse se terminer. Si le module de code prend plus de quelques secondes à s’exécuter ou attend une condition, comme une entrée utilisateur, il peut sembler à l’utilisateur que la commande Terminer a été ignorée.
Pour résoudre ce problème, vous pouvez utiliser le moniteur de terminaison pour permettre aux modules de code de vérifier et de répondre à l’état de terminaison de l’exécution appelante. Par exemple, dans le test de la carte mère d’ordinateur, le moniteur de terminaison est utilisé dans la boîte de dialogue de simulation. Si la séquence de test est terminée, le VI "Vérifier l’état de terminaison" renvoie Faux et la boucle s’arrête.
Gestion des Erreurs
Une erreur dans un système de test est un comportement d’exécution inattendu qui empêche le test de se dérouler correctement. Lorsqu’un module de code génère une erreur, il est important de transmettre ces informations à la séquence de test pour déterminer l’action à entreprendre, comme terminer l’exécution, répéter le dernier test ou alerter l’opérateur de test.
Pour fournir à TestStand les informations d’erreur des modules de code, utilisez le conteneur Result.Error du pas. TestStand vérifie automatiquement cette propriété après chaque pas pour détecter les erreurs. Si une erreur est renvoyée, l’exécution peut se ramifier vers une autre partie de la séquence, comme le groupe de pas de nettoyage.
Vous pouvez configurer la réponse de TestStand aux erreurs de pas en utilisant le paramètre "Erreur pendant l’exécution" (On Run-Time Error) dans l’onglet Exécution des options de station. En général, utilisez l’option "Afficher la boîte de dialogue" (Show Dialog Box) lors du développement pour faciliter le débogage. Pour les systèmes déployés, envisagez d’utiliser les options "Exécuter le nettoyage" (Run Cleanup) ou "Ignorer" (Ignore) pour éviter de nécessiter une intervention de l’opérateur. Les informations sur l’erreur sont automatiquement enregistrées dans les résultats du test pour aider à diagnostiquer la cause de l’erreur.
Figure 10. Passez les informations d’erreur au conteneur Step.Result.Error pour notifier TestStand en cas d’erreur dans le pas.
Gestion des Performances et de l’Utilisation de la Mémoire des Modules de Code
Par défaut, TestStand charge tous les modules de code d’un fichier de séquence en mémoire lors de l’exécution d’une séquence et les garde chargés jusqu’à la fermeture du fichier. Cela peut entraîner un retard initial lors du démarrage de la séquence, mais les exécutions ultérieures seront plus rapides.
Vous pouvez configurer le moment où un module de code est chargé et déchargé dans l’onglet "Options d’exécution" (Run Options) des paramètres du pas. En général, les options de charge par défaut offrent les meilleures performances, mais dans certains cas, il peut être préférable de charger le module de code uniquement lorsqu’il est nécessaire, en utilisant l’option "Charger de façon dynamique" (Load dynamically). Pour les modules de code rarement utilisés, comme les diagnostics après un échec de test, le chargement dynamique est recommandé.
Notez que TestStand ne signale pas les problèmes des modules de code jusqu’à leur chargement, ce qui peut se produire tard dans une longue exécution. Utilisez l’analyseur de séquence pour vérifier les erreurs avant l’exécution. L’analyseur vérifie les modules de code chargés statiquement et dynamiquement.
Pour les modules de code gourmands en mémoire, modifiez l’option de déchargement par défaut pour réduire l’utilisation de la mémoire, par exemple en définissant le module sur "Décharger après l’exécution du pas" (Unload After Step Executes) ou "Décharger après l’exécution de la séquence" (Unload After Sequence Executes). Cette modification peut augmenter les temps d’exécution, car TestStand devra recharger le module à chaque appel. Une meilleure alternative consiste à utiliser la version 64 bits de TestStand et un système avec plus de mémoire physique pour des performances optimales.
Gestion des Données Partagées dans les Modules de Code
Si vos modules de code utilisent des données partagées, comme des variables statiques ou des variables globales fonctionnelles LabVIEW, la modification des options de déchargement peut entraîner des changements de comportement, car les données globales sont perdues lorsque les modules sont déchargés. Pour éviter la perte de données, assurez-vous que toutes les données nécessaires sont transmises à la séquence TestStand ou stockées dans un emplacement plus permanent.
Pour plus d’informations sur l’optimisation des performances d’un système de test, consultez les pratiques exemplaires pour améliorer les performances du système NI TestStand.
Les modules de code sont souvent utilisés pour interfacer avec le matériel de test afin de configurer des stimuli et de prendre des mesures. Les méthodes de communication avec le matériel incluent :
La méthode de communication dépend du type de matériel utilisé. Dans les deux cas, vous ouvrirez une référence ou une session au driver avant d’effectuer des appels spécifiques et fermerez la session une fois l’interaction terminée.
Choix d’une Approche pour la Gestion des Références Matérielles
Pour éviter les impacts sur les performances dus à l’ouverture et à la fermeture répétées des sessions d’instrument, il est important de bien gérer les références matérielles dans vos séquences de test. Deux approches courantes existent :
Si vous utilisez un driver d’instruments ou communiquez directement avec des instruments via les drivers VISA ou IVI, utilisez Session Manager, sauf si vous avez besoin de contrôler directement la durée de vie des sessions matérielles. Pour les drivers matériels comme DAQmx, vous devez gérer les références manuellement.
Gestion Manuelle des Références Matérielles avec les Variables TestStand
Lorsque vous initialisez l’instrument, transmettez la référence de session en tant que paramètre de sortie à la séquence d’appel et stockez-la dans une variable. Vous pouvez ensuite utiliser cette variable comme entrée pour chaque pas nécessitant un accès à l’instrument.
De nombreux drivers, comme NI-DAQmx, VISA et la plupart des drivers d’instruments, utilisent le type de données Référence d’E/S pour stocker les références de session. Utilisez le type de données LabviewIOControl dans TestStand pour stocker ces références.
Figure 11. Utilisez une variable de type LabVIEWIOControl pour transmettre des références matérielles, comme une référence de tâche DAQ, entre les modules de code.
Lorsque vous transférez des pointeurs d’instruments entre TestStand et des modules de code, stockez la référence matérielle dans une variable locale. Si le matériel est utilisé dans plusieurs séquences, passez le pointeur en tant que paramètre de séquence à chaque séquence qui en a besoin. Évitez d’utiliser des variables globales pour stocker les références matérielles, car il peut être difficile de s’assurer que l’instrument a été initialisé avant d’utiliser la référence.
Utilisez les groupes de pas de test de configuration pour initialiser le matériel et les groupes de pas de test de nettoyage pour fermer les références matérielles pour les raisons suivantes :
Figure 12. Utilisez les groupes de configuration et de nettoyage (Setup & Cleanup) pour initialiser et fermer les références matérielles.
Gestion Manuelle des Références Matérielles avec Session Manager
Pour les pointeurs d’instruments VISA et IVI, vous pouvez utiliser Session Manager pour gérer automatiquement les références matérielles. Cette méthode présente plusieurs avantages :
Session Manager initialise automatiquement le pointeur après la création de la session et le ferme lorsque la dernière référence à la session est libérée. Les modules de code et les séquences utilisent un nom logique, comme "DMM1", pour obtenir un objet de session à partir de Session Manager, qui contient le pointeur d’instrument correspondant.
Lorsque vous utilisez Session Manager, stockez l’objet de session dans une variable de référence d’objet TestStand. La durée de vie de la session est ainsi liée à celle de la variable de référence d’objet, garantissant que le pointeur de l’instrument est initialisé et fermé une seule fois par exécution, quel que soit le nombre de modules de code ou de sous-séquences accédant à la même session.
Par exemple, le pas "Obtenir une session DMM" (Get DMM Session) obtient une référence à l’objet de session d’instrument pour le DMM en utilisant le nom logique. La référence de session est stockée dans une variable locale pour que la session reste initialisée pendant toute la durée de l’exécution de la séquence.
Figure 13. Utilisez Session Manager pour référencer des instruments à l’aide d’un nom logique. Le VI de Session Manager obtient la référence DMM IO en utilisant ce nom logique.
Pour plus d’informations sur l’utilisation de Session Manager, consultez l’aide de Session Manager NI, située dans <Program Files>National InstrumentsSharedSession Manager.
Appel des Bibliothèques de Drivers de Matériel
Pour communiquer avec du matériel, vous utilisez des bibliothèques de drivers qui fournissent des fonctionnalités pour effectuer diverses tâches avec un langage de programmation. Lorsque vous utilisez ces bibliothèques, vous appelez souvent plusieurs VIs ou fonctions pour réaliser une seule opération logique, comme prendre une mesure ou configurer un déclencheur. Créer un module de code pour implémenter cette fonctionnalité, plutôt que d’appeler directement les fonctions de bibliothèque depuis un pas TestStand, présente plusieurs avantages :
Pas de commentaires