Ce blog est dédié à l'expertise et au développement de systèmes de Supervision, Contrôle, Test et Mesure et plus spécialement sur les techniques autour LabVIEW, TestStand et LabWindows/CVI.
Ce mois de septembre aura été on ne peut plus sympathique avec deux publications d’articles parus dans la presse spécialisée au sujet du banc frigorifique contrôlable à distance pour lequel j’ai participé sur la partie acquisition, régulation et supervision pour le lycée Raspail.
Cette fois la conférence n’était pas directement liée au test et mesure, à LabVIEW, LabWindows/CVI ou TestStand mais à-propos des accélérateurs de particules, leurs applications médicales comme le traitement du cancer et plus particulièrement l’utilisation du rayonnement synchrotron pour l’observation microscopique comme l’étude des mécanismes de fonctionnement des protéines et les applications futures pour les médicaments actifs à base de nanotechnologie. Cette idée m’est venue d'une assistance technique que j’ai donnée au synchrotron “Soleil”, au sud de Paris pour identifier les pertes de mesures sur une ligne de lumière et optimiser les drivers d’instruments.
Conférence “Accélérateur de particules : lumière sur le futur médical” durant la XXXII réunion des chirurgiens pédiatres de l’institut Mexicain de Pédiatrie et leurs collègues d’Espagne.
L’auditoire composé de chirurgiens pédiatres d’Espagne et du Mexique.
Le synchrotron “Soleil”
C’est pour ce type d’instruments que je suis intervenu au synchrotron “soleil”.
Voici un petit tour d’horizon des nouveautés et changements apporté par LabVIEW 2010 en comparaison avec LabVIEW 2009 mais du point de vue des palettes de programmation et de contrôles. On notera qu’une bonne part des modifications visent l’aspect pratique.
Programmation : structures
On note la migration du la structure élément en place qui était déjà présente dans la version 2009 mais qu’on trouvait dans la palette gestion de la mémoire. Cette structure est bien utile pour optimiser la consommation de la mémoire, ce qu’on mais surtout en pratique pour les applications embarquées (compact RIO ou compact FieldPoint) et pour les logiciels sollicitant fortement la manipulation de données en mémoire (ceci réduisant le nombre de réallocations et facilitant la lecture du diagramme).
Les icones des variables partagées, globales et locales ont changé de look, c’est un peu plus parlant.
Programmation : numérique
Ajout de la constante de type double. Avant il fallait positionner une constante de type entier puis changer sa représentation en double. Maintenant on pose directement la constante double sur le diagramme.
Programmation : booléen
Modification de l’icone de la constante booléenne : il est plus compact. Au lieu d’afficher T/F, il n’affiche que T ou que F, ceci permet d’alléger le diagramme et de gagner de l’espace.
Programmation : E/S sur fichiers
Ici c’est E/S sur fichiers de waveform qui fait sont apparition. C’est la copie des mêmes fonctions qu’on trouve également dans la palette waveform. Elle est donc à deux endroit : palette E/S sur fichiers et palette waveform. L’intérêt c’est qu’on ne risque pas de se dire “bon dieu, mais elle est où cette fonction déjà ?”. Et oui, ce n’est pas incohérent de la mettre aussi là puisqu’on traite un fichier après tout.
La palette des fichiers TDMS a évolué avec l’ajout de fonctions avancées comme ci-dessous.
Dans les fonctions de fichiers avancées, la gestion des bibliothèques empaquetées a été ajoutée. Mais c’est quoi donc ? Et bien pour ceux qui sont familiers avec le langage C, cela se rapproche des librairies statiques : ce sont des VIs compilés dans un même fichier .lvlibp. Les avantages sont : comme c’est déjà compilé ça fait gagner du temps lors de la génération d’un exécutable (pratique pour les gros exe), on peut distribuer ses fonctions à ses collègues plus facilement. Bref on les utilisera surtout pour des projets de grosse envergure et/ou chaque développeur travail sur sa partie.
Programmation : Dialogue et interface utilisateur
La fusion des erreurs est désormais une fonction et non un sous-vi. Outre le côté pratique de cette fonction qui accepte N entrées en l’étirant (à la manière de la fonction construire un tableau), gageons que qu’elle sera plus rapide que la version antérieur en sous-vi. J’en profite pour insister sur l’importance du suivi des erreurs : je ne compte pas le nombre de fois où j’ai gagné du temps tant durant la phase de développement que de la maintenance pour identifier la source d’un bug.
Communication de données
Les fonctions de flux réseau font leur apparition. Elles permettent le transfert sans perte de données et en continue de type waveform. Pour données qui ne sont pas à “flux tendu” ont préfèrera les variables partagées qu’on publiera sur le réseau. C’est simple et c’est efficace.
On note ici aussi le changement de look des icones des variables.
Au niveau des protocoles, c’est l’HTTP client qui a été ajouté. Ceci facilite la programmation car dans les versions antérieures, il fallait tout codé en utilisant les couches basses de la palette TCP. Désormais le dialogue avec un serveur Web est bien plus simple. Exemple d’utilisation : dialogue avec un serveur pour envoyer ou recevoir des informations, comme un mini serveur d’une carte ethernet low cost ou d’un serveur web embarqué dans un automate distant.
J’ai eu le plaisir de donner une conférence, encore une fois invité par une université mexicaine, pour parler les systèmes industriels et scientifiques utilisant les technologies de National Instruments, durant le congrès international d’ingénierie télématique de l’Université Polytechnique au Mexique. Cette conférence d’une heure est introduite par une description de ce qu’est le contrôle, la supervision, la simulation, le test et la mesure, en passant par une démonstration de programmation avec LabVIEW, une vidéo en directe avec l’institut technique Raspail à Paris pour présenter un banc frigorifique à deux chambres commandé par un module temps réel Compact Fieldpoint y son logiciel embarqué que j’ai développé sous LabVIEW et une démonstration de prise de contrôle à distance du banc installé en France depuis le Mexique.
La conférence est donnée en espagnol mais j’ai doublé en français les vidéos ci-dessous.
Partie 1/8: Introduction
Introduction de la conférence pour montrer l’évolution de la complexité des produits et son impact sur les technologies utilisées pour les fabriquer.
Partie 2/8: Contrôle, Supervision, Mesure, Validation, Simulation
Description du contrôle, la mesure, la validation et la simulation aux fins de la qualité dans l’industrie et la recherche scientifique.
Partie 3/8: Exemples de systèmes
Exemples de systèmes de contrôle, supervision, validation et mesure utilisant les technologies de National Instruments : LabVIEW, LabWindows/CVI, TestStand et le matériel.
Partie 4/8: Vidéo en directe depuis Paris
Vidéo en directe depuis Paris (Institut Technologique Raspail) pour décrire le banc frigorifique à double chambre utilisant un système de contrôle et supervision temps réel Compact Fieldpoint de National Instruments et son logiciel embarqué que j’ai développé sous LabVIEW, avec l’aimable participation de Daniel Garault, chef des travaux, de Guy Marcaillou, professeur de thermodynamique et de Clarisse Mbobda Fonking, professeur de sciences physiques.
Partie 5/8: Description technique du banc frigorifique
Description du matériel du système temps réel du banc frigorifique de l’institut technologique Raspail : les composants Compact Fieldpoint et le logiciel embarqué développé sous LabVIEW et son module temps réel.
Partie 6/8: Introduction à LabVIEW
Démonstration de programmation en langage Graphique avec LabVIEW : ici un générateur de signaux.
Partie 7/8: Shared Variables démonstration
Présentation les variables partagées réseau de LabVIEW et démonstration de la prise de contrôle à distance du banc frigorifique à Paris depuis le Mexique.
Partie 8/8: Shared Variables détails et Web Server avec LabVIEW
Description de l’architecture des variables partagées réseau puis description et démonstration du serveur web de LabVIEW embarqué dans le contrôleur Compact Fieldpoint de National Instruments pour superviser et prendre le contrôle à distance du banc frigorifique directement depuis le navigateur internet (ici les droits d’accès sont gérés par Moodle).
National Instruments, qui est actuellement le leader des solutions d’instrumentation, test et mesure, propose des solutions pour le développement de logiciels dans trois langages différents : LabVIEW, LabWindows/CVI et Measurement Studio; et un autre logiciel de développement spécialisé : TestStand. Mais, j’en convient et surtout vu de l’œil du non initié, on peut être un peut perdu face à toutes ces solution. Aussi, je vais faire une courte présentation de ces produits avec leurs différences et leurs points forts.
LabVIEW
LabVIEW est le produit phare de National Instruments depuis 1984.
Utilisation : développement de logiciels orientés industrie et science, le plus souvent fortement liés aux instruments de mesure, capteurs et appareils électroniques, sous Windows, Unix, Linux ou Macintosh, PDA (Windows Mobile et Palm OS), cible temps réel (de NI), FGPA (de NI).
Langage : langage G pour Graphique. On programme en posant des icones (représentant des fonctions) sur un diagramme et on les relie par des fils (représentants les flux de données, les variables).
Avantage : le langage G, entièrement graphique, permet de développer très rapidement des applications sans connaissance étendu de la programmation.
LabWindows/CVI
LabWindows/CVI est une déclinaison de LabVIEW pour la programmation en langage C.
Utilisation : développement de logiciels orientés industrie et science le plus souvent fortement liés aux instruments de mesure, capteurs et appareils électroniques, sous Windows, Unix, Linux et cible temps réel (de NI) - depuis la version 9.0 pour ce dernier point.
Langage : langage C. LabWindows/CVI contient bon nombre d’assistant pour faciliter le développement d’interfaces graphiques, la déclaration des variables, l’insertion de fonctions et structure du code et la communication avec les instruments et autres appareils électroniques.
Avantage : le langage C est un langage de base souvent connu des ingénieurs et techniciens. C’est un langage majeur qui permet l’utilisation de code source déjà existants. La programmation est facilité grâce aux assistants.
Measurement Studio
Measurement Studio est un pack de classes et librairies similaires à LabVIEW pour Visual Studio.
Utilisation : développement de logiciels orientés industrie et science le plus souvent fortement liés aux instruments de mesure, capteurs et appareils électroniques, sous Windows.
Langage : langages C++, C# et Visual Basic.
Avantage : facilite le développement d’applications d’instrumentation et de mesure sous Visual Studio grâce à ses librairies de fonctions dédiées et ses objets graphiques spécialisés.
TestStand
TestStand est un outil, ou plus exactement une suite de fonctionnalités, ou Framework, permettant de faciliter le développement de logiciels de type séquenceur.
Utilisation : développement de séquenceurs dans les domaines de l’industrie et des sciences, le plus souvent pour le séquencement de mesures et de tests sous Windows.
Langage : compatibilité avec LabVIEW, LabWindows/CVI, Java, HTbasic et tous langages produisant des DLL, EXE, des composants ActiveX et .NET. TestStand possède également son propre langage simple de script.
Avantage : il possède toutes les fonctions nécessaires à un séquenceur de tests; c’est autant de temps de gagné sur le développement. Il dispose, entre autres, des fonctions suivantes : génération de rapports, éditeur de séquence, génération automatique de code source, connexion aux bases de données, parallélisme, composants graphiques pour l’interface opérateur, gestions des droits des utilisateurs.
J’ai été invité pour donner une conférence dans le cadre du SIECC 2009 de titre “Fusing Worlds”, symposium international étudiant de science informatique sur trois jours, organisé par Institut Technologique de Durango au Mexique.
Le titre de ma conférence était “La mécatronique dans la qualité industrielle et la recherche scientifique” où j’ai exposé les enjeux du contrôle, de la mesure, du test et de la simulation dans des problématiques de plus en plus complexes au sein de la recherche et de l’industrie, agrémentée de d’exemples tirés de mon expérience professionnelle.
Entre autres conférenciers, on pouvait compter Leo Prieto (leo.prie.to), un chilien qui est à la tête de Fayerwayer.com premier site d’Amérique latine avec 4 millions de visiteurs par jour, pour parler de l’hyper connectivité; Álvaro López Ortega (Octality), espagnol, créateur du serveur libre “Cherokee”, pour présenter les modèles économiques applicables pour une entreprise développant en Open Source; Ricardo Meza, mexicain, membre de Mozilla, pour nous parler de FireFox et de l’Open Source; Mauricio Pastrana, colombien, pour nous parler des enjeux économiques des communautés du web; Alejandro Martinez, mexicain, membre de Microsoft pour nous présenter les nouvelles innovations technologiques de Microsoft; et Carlos Montelongo pour parler des applications JAVA. Ci-dessous une photo des conférenciers :
LabVIEW 2009 vient de sortir (on notera que le numéro de la version est en faite la 9.0). En plus des nouveautés annoncées par National Instruments sur son site, j’ai voulu faire un tour d’horizon des nouveautés dans les palettes de commandes en face avant et de fonctions pour les diagrammes. En voici la synthèse (les nouveautés sont encadrées en rouge :
Nouveautés dans les commandes (face avant)
Numérique
ajout de la commande de type réservoir
Graphe
ajout du tracé de compas, tracé à barres d’erreur, tracé de plume et matrice de tracés XY et ajout de la palette dédiée au graphe 3D
Graphe 3D
ajout des graphes 3D de type nuage, barres, camembert, bâtons, rubans, contour, champ vectoriel, comète, surface, maillage et chute d’eau.
Nouveautés dans les fonctions (diagramme)
Programmation, numérique, virgule fixe
ajout de : adapter de virgule fixe à entier, adapter d’entier à virgule fixe
Programmation, tableau, matrice
nouvelle palette avec : taille de matrice, construire une matrice, redimensionner une matrice, transposée d’une matrice, obtenir la diagonale d’une matrice, obtenir les éléments d’une matrice, obtenir une sous-matrice, définir une diagonale de matrice, définir des éléments de matrice, définir une sous-matrice
Programmation, cluster, classe et variant
ajout de préserver la classe à l’exécution
Programmation, E/S sur fichiers, constantes de fichiers
ajout de : obtenir le répertoire système et répertoire de l’application
Programmation, E/S sur les fichiers, XML, parseur XML
ajout de : obtenir le premier nœud correspondant et obtenir tous les nœuds correspondants.
à noter le changement des icones nouveau et fermer.
Programmation, E/S sur les fichiers, TDM en continu
ajout de : TDMS – convertir le format, créer des informations de mise à l’échelle
Programmation, contrôle d’applications, contrôle de mémoire
ajout de : nouvelle référence de valeur de données, supprimer une référence de valeur de données
Programmation, contrôle d’applications, informations sur le processeur
nouvelle palette avec : information sur le processeur, nombre de niveaux de cache, taille du cache de données
nouvelle palette avec : définir une EDP, définir un domaine d’EDP, définir la condition aux limites d’une EDP, définir la condition initiale d’une EDP, résolution d’EDP, rendu d’EDP
Communication de données, variable partagée
ajout de fonctions pour simplifier l’utilisation des variables partagées : établir une connexion à la variable, lire une variable, écrire une variable, fermer une connexion à une variable, nœud de propriété de variable.
pour les variable PSP : ouvrir et vérifier la connexion d’une variable, établir une connexion à une variable en arrière plan. pour les variables
E/S : lecture par balayage de la variable, écriture par balayage de la variable, lecture directe de la variable, écriture directe de la variable
Entrées/Sorties de mesures, moteur de balayage NI
nouvelle palette avec : synchronisation avec le moteur de balayage, obtenir la période du moteur de balayage, définir la période du moteur de balayage, obtenir le mode du moteur de balayage, définir le mode du moteur de balayage, rafraichir les modules locaux
Entrées/Sorties de mesures, moteur de balayage NI, contrainte
nouvelle palette avec : activer les contraintes de variables, désactiver les contraintes de variables, effacer les contraintes de variables, contraindre une variable, annuler une contrainte de variable
Entrées/Sorties de mesures, moteur de balayage NI, défaillances
nouvelle palette avec : obtenir une liste de défaillances, définir une défaillance, effacer une défaillance, effacer toutes les défaillances
Entrées/Sorties de mesures, moteur de balayage NI, configuration de défaillances
nouvelle palette avec : définir une configuration de défaillance, effacer une configuration de défaillance, obtenir toutes les configurations de défaillances
On peut maintenant faire appel à des classes JAVA directement depuis les séquences TestStand.
On sait que TestStand permet d’appeler des composants de type LabVIEW (VI), LabWindows/CVI (.C, .obj, .lib, .dll), DLL (donc tous langages capable de produire des DLL : C++, Pascal Object avec Delphi, Visual Basic et autres….), ActiveX (et donc tous langages compatibles), .NET assemblies (et langages compatibles…), HTbasic. On pourrait se dire que ces adaptateurs (adapters in english) sont principalement des technologies Microsoft. Choix commercial peut être, mais c’est sans compter sur la possibilité de les programmer soit même, surtout que l’ont peut prendre exemple des sources des adaptateurs, précédemment listés, qui nous sont fournis avec TestStand.
Dans cette veine, un nouvel adaptateur nous est livré : l’adaptateur JAVA. Il comprend trois groupes :
StartStop : pour le démarrage et l’arrêt de la machine virtuelle JAVA (JVM).
Methods : appel à une méthode d’une classe
Static methods : appel à une méthode statique d’une classe
L’appel aux méthodes permet les types de pas suivants : Numeric Limit Test, String Value Test, Pass/Fail Test et Action.
Regardez ci-dessous un exemple d’une séquence (ici pour une carte mère d’un PC) écrit avec des pas JAVA (voir Java dans le dossier des exemples TestStand).
Séquence de test en JAVA sous TestStand
Il est à noter que les sources des adaptateurs JAVA sont codés en C sous LabWindows/CVI. L’interface de configuration des propriétés ci-dessous est donc modifiable.
Propriétés d’un pas JAVA sous TestStand
L’adaptateur JAVA est compatible avec TestStand 3.0 et supérieur, LabWindows 6.0 et supérieur et Java 2 version 1.4.
Les options de compilation sont souvent un peu oubliées alors que l’on développe un programme; hors, elles sont aussi importantes que le code lui même et cela pour plusieurs raisons : elles permettent de configurer la profondeur d’analyse de détection d’erreur du code source et de gestion mémoire lors de l’exécution, elle fixent les adressages pour la compatibilité avec d’autres composants, DLL par exemple. Ainsi, on l’aura compris, la modification d’une option peut changer le niveau de détection des erreurs par le debugger de LabWindows/CVI. On aurait alors un comportement instable de notre programme sans en avoir été averti lors de la compilation ou de l’exécution en mode “debug”. Aussi, pour vous aider dans vos débuts sous LabWindows/CVI, je vous propose d’adopter la configuration ci-après pour les “Build Options” du menu “Options” de LabWindows/CVI 9.0 (les options sont légèrement différentes pour les versions précédentes mais l’essentiel est resté).
On peut définir un bon code source par plusieurs caractéristiques : déjà il faut qu’il fonctionne, qu’il soit facile à lire et facile à modifier donc aisément maintenable. Dans ces fins, on recherchera à structurer et non à jeter son code pèle-mêle sur le diagramme. On utilisera la palette de structures avec les bouclesFOR ou WHILE, les CONDITIONS, la structure d’événements (pour gérer les actions sur des éléments de l’interface graphique comme un clic sur un bouton) ou encore les séquences, sans oublier les décorations comme les encadrés et les texte pour ajouter des commentaires. Mais aussi des sous-VI qui regrouperons des instructions, se qui allégera les diagrammes, capitalisera les fonctionnalités et ainsi rendra aisé la distribution des sources et qui permettra, en outre, une meilleur gestion des ressources mémoire par le moteur de LabVIEW lors de l’exécution.
Saviez-vous que depuis la version 8.20 de LabVIEW, sortie en 2006, il est possible de programmer avec une architecture objet ? On peut ainsi créer des classes avec leurs propriétés et leurs méthodes, comme en C++, Java, C#, pascal object (Delphi) et autres langages évolués. J'entends certains d'entre vous dire "mais qu'est-ce que ça nous apporte en plus pour le développement de logiciel de test et mesure ?". Serte, il est vrai que pour un petit logiciel qui fait une mesure ou plusieurs mesures et un traitement simple, le langage objets n'est pas forcément le plus adapté... quoi que : on pense toujours développer en "one shot" et on se rend très souvent compte, après coup, qu'il faut faire évoluer le logiciel et/ou récupérer une fonctionnalité pour l'intégrer dans un autre développement. C'est là que la programmation objet (LVOOP sous LabVIEW pour LabView Oriented-Object Programming) a tout son intérêt : elle permet un concept et une architecture plus proche du monde physique et donc du raisonnement humain (exemple d'objet : une voiture avec ses méthodes, tourner, freiner, et ses propriétés, vitesse maximum, couleur). De plus, on peut alors profiter des outils de modélisation qui permettent de concevoir sous forme de schémas semi-formels la structure d'un programme, basé par exemple sur UML (d'ailleurs il y a un toolkit dédié sous LabVIEW).
Depuis 2006 je contribue à quelques articles sur ce merveilleux outil du savoir qu'est l'encyclopédie libre Wikipédia. Je m'étais pour le moment attelé à la rédaction d'articles sur l'histoire et la culture du nord du Mexique. Depuis quelque temps, je participe, quand j'ai le temps, à l'ajout d'articles concernant le test et la mesure et ses différents outils (mon profile sous Wikipédia : http://fr.wikipedia.org/wiki/Utilisateur:Adrienj). Si vous souhaitez participer à cet effort, qui n'a de noblesse que le partage des connaissances, alors rien de plus simple : créez un compte sous Wikipédia. Pas mal de chose reste à compléter, comme les articles sur : LabVIEW, LabWindows/CVI, TestStand, Measurement Studio, PXI, VXI... et beaucoup d'autres définitions ne font pas encore partie de l'encyclopédie : à vos claviers !
Avec l'implémentation du standard C99, une avancé est fait quant à la gestion de la mémoire : la déclaration de tables dynamiques (variable-length arrays in english).
Vous me direz, les tables je connais, je la déclare un tableau de dix entiers en dimensionnant avec une constante comme suit : int iTable[10]. Les tables dynamiques, ok je connais, je déclare un pointeur puis je fais un malloc ou calloc pour la dimmensionner avec une variable, en n'oubliant pas de libérer la mémoire allouée avec un free à la fin du traitement.
Alors que sont les variable-length arrays ?
C'est la possibilité de declarer des tables en les dimensionnant avec des variables et non plus qu'avec les seules constantes.
Voici deux exemples pour illustrer l'utilisation d'un tableau dynamique : On demande à l'utilisateur de dimmensionner une table que l'on alloue puis on affiche le contenu de cette table.
AVANT int rows, cols; int i, j; int *piTable = NULL;
printf("Entrez le nombre de ligne de la table: "); scanf("%d", &iNbLigne); printf("Entrez le nombre de colonne de la table: "); scanf("%d", &iNbColonne); *piTable = (int*)malloc(iNbLigne*iNbColonne*sizeof(int)); if (piTable != NULL) { for (int i = 0; i < iNbLigne;i++) { for (int j = 0; j <iNbColonne;j++) { piTable[i][j] = i*iNbColonne + j; printf("%d ", piTable[i][j]); } printf("\n"); } } free(piTable); piTable = NULL;
MAINTENANT
Dans le code suivant, on utilise également une autre nouveauté de la C99 : la déclaration des variables n'est plus cantonnée au début des blocs { }.
int iNbLigne, iNbColonne; int i, j;
printf("Entrez le nombre de ligne de la table: "); scanf("%d", &iNbLigne); printf("Entrez le nombre de colonne de la table: "); scanf("%d", &iNbColonne);
int tiTable[iNbLigne][iNbColonne]; for (int i = 0; i < iNbLigne; ++i) { for (int j = 0; j < iNbColonne; ++j) { tiTable[i][j] = i*iNbColonne + j; printf("%d ", tiTable[i][j]); } printf("\n"); }
Ici, la libération de la mémoire alouée à tiTable est effectuée à la fin de "vie" de cette variable. Comme tiTable est une variable locale, elle sera désalouée à la fin du traitement la fonction dans laquelle elle est déclarée.
Pas mal de nouveautés sont disponibles dans LabWindows/CVI 9.0 surtout avec l'implémentation du dernier standard du langage C : la C99. On aura donc attendu dix ans, le temps de maturation, pour bénéficier des avantages de ce nouveau standard.
Qu'apporte la C99 ?
Voici la liste de ces améliorations :
La déclaration des variables n'est plus cantonnée au début des blocs { }.
On peut déclarer des tables en les dimensionnant avec des variables et non plus qu'avec les seules constantes.
Chaque éléments des tables, structures et unions est maintenant initialisable distinctement et nommément.
Les éléments des tables, structures et unions peuvent être initialisés avec des variables.
nouveau type : les entiers de 64 bits (long long).
nouvelles fonctions snprintf et vsnprintf qui sont des versions "sécurisées" de sprintf et vsprintf puisqu'elles évitent les dépassements en contrôlant la taille de la chaîne d'entrée.
les macros à n arguments(...).
ajout de la variable du pré-compilateur __func__ contenant le nom de la fonction courante.
Je remarque que cette dernière nouveauté (__func__) de la C99 était déjà présente depuis quelques versions de CVI.
Je détaillerai dans des articles dédiés chaque aspect de la C99 pour LabWindows/CVI.