Timers Multithread sous CVI

Bonjour,
J'ai plusieurs questions concernant mon programme avec LabWindows CVI 9.0 et 4 cartes NI PCI 6229, sous Windows XP et dual core Intel 3GHz.
Je souhaite réaliser un programme qui réalise une boucle d’asservissement et également un contrôle et affichage sur des acquisitions. Je n’ai malheureusement pas le choix sur l’OS et je ne peux pas m’orienter sur une solution temps réel.
Pour cela, je souhaite réaliser
-          une boucle qui gère l’asservissement (acquisition sur 20 entrées, calcul sur ces acquisitions, et génération sur 10 sorties, tout ceci en 10ms, c’est la BOUCLE CRITIQUE)
-          une boucle pour le contrôle (simple contrôle sur ces acquisitions: comparaison à une valeur seuil, 10ms)
-          une boucle pour l’affichage (affichage des résultats sur la face avant des contrôles OK ou non OK, toutes les 200ms)
Je souhaitais à la base utiliser 3 timers asynchrones de CVI, mais je me suis aperçu qu’on ne pouvait utiliser qu’un seul Timer asynchrone à la fois.
J’ai donc vu qu’il y avait une autre solution, le multithread en utilisant les thread pool. Cette solution m’intéresse, car je souhaiterai mettre la boucle critique dans 1 thread sur le 1er coeur, la boucle de contrôle dans un 2ème thread sur le 2ème coeur, et la boucle d’affichage dans un 3ème thread sur le 2ème coeur.
La boucle d’asservissement est la boucle critique et doit être de 10ms à +/- 2ms.
Les autres bouclent ne sont pas critiques et peuvent avoir un décalage de +/- 10ms, le but est de ne pas perdre de données et de contrôler toutes les acquisitions. Un affichage toute les 200ms suffit.
Voilà j’ai alors 2 questions :
-          est-ce que mon approche (timers en multithread et diviser sur les 2 cœurs) convient pour mon application ?
-          et comment mettre un timer classique dans un thread spécifique ? J’ai vu qu’il fallait utiliser «CmtScheduleThreadPoolFunction (int Pool_Handle, ThreadFunctionPtr Thread_Function, void *Thread_Function_Data, int *Thread_Function_ID)” Mais cette fonction appelle une fonction de type “CVICALLBACK FonctionThread(void *functionData)” et mon timer classique est de type “CVICALLBACK Timer_Classique (int panel, int control, int event, void *callbackData, int eventData1, int eventData2)” Comment donc appeler un timer classique avec une fonction CmtScheduleThreadPoolFunction ? Faut-il procéder d’une autre manière ?
Je vous remercie de votre aide.
Cordialement,
Hédi.

Bonjour,
L'approche multi-thread est en effet la bonne, dès qu'il faut séparer plusieurs tâches. Je vous invite à consulter cet article du Rebel Site, qui traite du multithread et constitue une référence en la matière. Attention, le multithread n'implique pas obligatoirement une gestion multicoeur. Il faut pour le mettre en oeuvre passer par l'API de Windows.
Est-il bien nécessaire de faire de du contrôle 10ms? (deuxième boucle) Au quel cas, je ne suis pas absolument sûr qu'il faille créer un thread séparé. Si cette tâche peut supporter un cadencement plus lent, il serait plus malin de venir la traiter dans le troisième thread.
Il serait intéressant d'utiliser une Thread Safe Queue pour faire circuler les données d'un thread à l'autre. Ce mécanisme permettra de ne pas perdre de données. D'autre part, vous pouvez alors installer une callback sur un nombre d'éléments dans la TSQ (Thread Safe Queue) et venir déclencher la callback associée à cette TSQ dès que 20 éléments sont présents pour piloter le troisième thread depuis le premier.
Dans cette configuration, il n'y a plus besoin que d'un timer, pour la partie temps critique - bien que sous Windows, on ne puisse pas garantir le déterminisme d'une boucle à 10ms - les autres thread étant 'esclave' du premier.
Cordialement,
.mrLeft{float:left} .mrInfo{border-left:solid 1px #989898;font-size:x-small;color:#989898}
Mathieu R.  
  CTD - Certified TestStand Developer / Développeur TestStand Certifié  
  CLAD - Certified LabVIEW Associate Developer  

Similar Messages

  • Programme sous CVI 6.0 vers CVI 7.0

    Bonjour,
    Je travail actuellement sur un système qui lis les capteurs puis affiche les courbes avec les valeurs.
    Le programme fut développé par des étudiant à l'époque sous Labwindows CVI6.0 et les ordinateur sont sous windows 98
    Seulement, ils ont fait leur époque donc on a acheté des nouveaux ordinateurs sous XP, une nouvelle carte d'acquisition la 6321
    cette carte nécessite Labwindows CVI7.0, ce qui fait que le programme ne peut plus fonctionner.
    Pouvez vous me dire comment je dois faire pour que mon programme qui fonctionne sous CVI 6.0 puisse fonctionner sous CVI7.0
    merci

    Bonjour,
    Je pense que le problème vient plus de la version des drivers installés que du programme en lui même étant donné qu'un code fait en LabWindows/CVI 6.0 peut être édité en LabWindows/CVI 7.0.
    Avez vous recompilé (édité et sauvegardé) le code en LabWindows/CVI 7.0?
    Quelle est la version de DAQmx utilisé par vos étudiants (quel est le matériel qu'ils avaient utilisé?)
    Cordialement
    David S.| Certified LabVIEW Associate Developer
    National Instruments France
    #adMrkt{text-align: center;font-size:11px; font-weight: bold;} #adMrkt a {text-decoration: none;} #adMrkt a:hover{font-size: 9px;} #adMrkt a span{display: none;} #adMrkt a:hover span{display: block;}
    Journées Techniques LabVIEW 2012 : du 27 septembre au 22 novembre
    2 sessions en parallèle : Débuter a...

  • Pilotage PXI-2530B sous CVI et DAQmx

    Bonjour,
    Je dois piloter une carte PXI-2530B sous CVI avec DAQmx.
    Avec les exemples, j’ai accès au relais voulu parmi les 128 disponibles (k0 à k128),
    mais également aux relais internes (kbc01..., kcom1...kref...) !
    Cela signifie-t-il que malgré la topologie que je choisis (“2530/3-Wire Quad 16x1 Mux”),
    c’est à moi de gérer la fonction de multiplexage, par exemple pour la voie 0, en pilotant
    les relais k0, k16, kcom1... et en ouvrant tous les autres ? Ou bien la topologie choisie
    ***** charge-t-elle de gérer tous les relais de manière à ce que par exemple pour la voie 0,
    il suffit de piloter uniquement le relais k0, et alors ensuite, les autres seront
    automatiquement pilotés ?
    Je pensais également à NI-Switch, mais cela à l’air moins convivial au niveau des
    fonctions, et à priori pas nécessaire pour des simples MUX ?
    Merci.
    Pascal Taunay - Atelec.

    In English :
    I need to drive a board PXI-2530B under CVI with DAQmx.
    With the examples, I can access to the desired relay (from k0 to k128), but also to
    the internal relays (kbc01..., kcom1...kref...) !
    Does this mean that even if I choose the topology (“2530/3-Wire Quad 16x1 Mux”), I need
    to manage the mux function by myself, for example for the channel 0, with the driving of the
    k0, k16, kcom1... and openning all other relays ? Or the chosen topology manage by itself
    all the relays so that for example for the channel 0, I need to drive only the relay k0, and
    then all other relays will be automatically driven ?
    I thought also about NI-Switch, but it seems to be less easy regarding the CVI functions,
    and perhaps not necessary to manage simple muxs ?

  • Création dll sous CVI vers LabView (Callback function)

    Bonjour,
    J'utilise un capteur de champ magnétique dont la communication se fait sous labwindows/CVI 2012.
    Ensuite je dois récupérer la valeur de champ magnétique (mesure en continu) sous labview pour ensuite la traiter.
    Je pense qu'il faut utiliser une dll, en regardant dans votre forum j'ai vu comment créer des dll, sauf que les fonctions callback (dans CVI) ne sont pas transformées.
    Je ne sais absolument quelles modifications apporter au programme CVI, pouvez-vous m'aider ?
    Cordialement,
    Fabien65

    Bonjour Fabien65,
    Que voulez vous dire par: La communication avec le capteur se fait sous Labwindows/CVI??
    Quel système d'acquisition utilisez vous ?
    Si vous avez vraiment besoin de créer une dll avec Labwindows/CVI, vous devez impérativement spécifier que vous créez une dll et non un .exe.
    Voici un document qui pourrait vous être utile:
    http://www.ni.com/white-paper/3341/en#toc7
    Cordialement.
    Aurélien Corbin
    National Instruments France
    #adMrkt{text-align: center;font-size:11px; font-weight: bold;} #adMrkt a {text-decoration: none;} #adMrkt a:hover{font-size: 9px;} #adMrkt a span{display: none;} #adMrkt a:hover span{display: block;}
    Cahiers de vacances de NI
    Présentations en ligne : 12 fondamentaux à réviser, du 9 juillet au 29 aoû...

  • NI USB 8473s sous Labwindows/CVI

    Bonjours à tous.
    Je me rettrouves bien embeté par cette petite boite. En éffet je dois développer un programme exclusivement sous Labwindows CVI ayant pour but de tracer les courbes des informations reçues par ma CAN box et le hic est que je n'arrive tout bonnement pas à le faire à cause de l'incompatibilité entre Channel API et Frame API. Y à t'il une solution sous CVI pour réaliser celà? Peut on réaliser ce programme sous Labwindows sans utiliser les fonctions proposées par le constructeur?

    Bonjour,
    Je remonte un peu votre topic mais je ne sais pas si vous avez trouvé une solution entre-temps.
    Je ne comprends pas tout à fait où se situe votre problème. Pourriez-détailler un peu plus ? Pour l'instant, je ne vois pas trop d'où vient un potentiel problème d'affichage.
    Par ailleurs, qu'entendez vous par "sans utiliser les fonctions proposées par le constructeur" ?
    Cordialement,
    Mathieu P. | Certified LabVIEW Associate Developer
    National Instruments France
    #adMrkt{text-align: center;font-size:11px; font-weight: bold;} #adMrkt a {text-decoration: none;} #adMrkt a:hover{font-size: 9px;} #adMrkt a span{display: none;} #adMrkt a:hover span{display: block;}
    Journées techniques : des fondamentaux aux dernières technologies pour la mesure et le contrôle/comm...

  • Mise en oeuvre d'une tache d'acquisition analogique sur plusieurs cartes (6321/6323) et de plusieurs taches de génération analogique sur ces memes cartes (LabWindows CVI10 sous Windows SEVEN)

    Objet : Impossibilité de faire tourner une tache de mesure analogique sur deux cartes 6321, lorsque une ou plusieurs tache(s) de génération analogiques sur ces mêmes cartes existe(nt)…
    Configuration NI :
    Dev1 = Dev2 = carte 6321
    Code de création de la tache de mesure analogique :
                DAQmxCreateTask("",&AIRecordingtaskHandle);
           DAQmxCreateAIVoltageChan(AIRecordingtaskHandle,chan,"",DAQmx_Val_NRSE,min,max,DAQmx_Val_Volts,NULL);
           DAQmxCfgSampClkTiming (AIRecordingtaskHandle, "", rate, DAQmx_Val_Rising, DAQmx_Val_FiniteSamps, sampsPerChan);
           DAQmxGetTaskAttribute(AIRecordingtaskHandle,DAQmx_Task_NumChans,&gNumChannels);
    Chan vaut : "Dev1/ai0, Dev1/ai1, Dev1/ai2, Dev2/ai1"
    Code de création des taches de génération analogique :
           DAQmxErrChk (DAQmxCreateTask("",&AOtaskHandle_C1_DAC0));
           DAQmxErrChk (DAQmxCreateAOVoltageChan (AOtaskHandle_C1_DAC0, chan, "", min, max,DAQmx_Val_Volts, ""));  // chan vaut Dev1/ao0
           DAQmxErrChk (DAQmxCreateTask("",&AOtaskHandle_C1_DAC1));
           DAQmxErrChk (DAQmxCreateAOVoltageChan (AOtaskHandle_C1_DAC1, chan, "", min, max,DAQmx_Val_Volts, "")); // chan vaut Dev1/ao1
           DAQmxErrChk (DAQmxCreateTask("",&AOtaskHandle_C2_DAC0));
           DAQmxErrChk (DAQmxCreateAOVoltageChan (AOtaskHandle_C2_DAC0, chan, "", min, max,DAQmx_Val_Volts, "")); // chan vaut Dev2/ao0
    Au premier ReadBinary, le système sort en erreur avec le message suivant : voir pièce jointe
    Notre compréhension de cette erreur : dans le cas où on met en œuvre une tache de mesure analogique sur plus d'une carte, couplée à une ou plusieurs tache(s) de génération analogique sur ces mêmes cartes, il est impossible d'utiliser l'horloge interne pour le cadencement des CAN/CNA.
    Nous avons effectué plusieurs tests :
    Modifications des horloges interne lors de la configuration des taches : "/Dev1/ai/SampleClock" pour la tache de mesure et "Devk/ao/SampleClock" pour les taches de génération analogique : erreur.
    Abandon d'une des taches de génération analogique : même erreur
    Abandon de l'ensemble des taches de génération analogique (la tache de mesure analogique couvre des voies issues des cartes Dev1 et Dev2): pas d'erreur
    Suppression des voies de la carte Dev2 dans la tache d'acquisition analogique : plus d'erreur
    Merci d'avance
    Pièces jointes :
    MsgErreur NIDAQmx.JPG ‏38 KB

    Bonjour Sisyphe42, 
    Les exemples en PJ montrent comment faire du multi-tâches et du multi-cartes sous CVI.
    Cordialement 
    Sabri JATLAOUI - Certified LabVIEW Developer
    Pièces jointes :
    ContAI-ReadDigChan.c ‏8 KB
    SynchAI-AO.c ‏9 KB
    ContinuousAI.c ‏11 KB

  • CVI - Lister les fichiers dans un dossier

    Bonjour, je cherche une solution pour lister des fichiers dans un repertoire sous CVI.
    j'ai effectué plusieurs recherches mais sans succès.
    Pouvez-vous m'aider ?

    Bonjour,
    Une telle fonction n'existe pas dans LabWindows/CVI. En revanche, ce que vous voulez faire à déjà été développé et le code associé est disponible sur notre site internet sur le lien suivant.
    http://zone.ni.com/devzone/cda/epd/p/id/2157
    Cordialement
    David S.| Certified LabVIEW Associate Developer
    National Instruments France
    #adMrkt{text-align: center;font-size:11px; font-weight: bold;} #adMrkt a {text-decoration: none;} #adMrkt a:hover{font-size: 9px;} #adMrkt a span{display: none;} #adMrkt a:hover span{display: block;}
    Journées Techniques LabVIEW 2012 : du 27 septembre au 22 novembre
    2 sessions en parallèle : Débuter a...

  • Kit distribution cvi 8.0 (install et uninstall)

    Bonjour,
    J'ai crée un kit d'installation de mon programme (sous cvi 8.0).
    Je lance l'install en lançant de setup.exe (avec l'option /qb pour le mode silent),
    par contre pour la desinstallation il n'y a plus l'option "/x" comme dans les versions précédentes de CVI (6.0 et 7.1)
    Comment puis je donc faire une desinstallation sans passer par le panneau de config....
    Merci pour vos réponses

    Bonjour tesvd,
    Cette fonctionnalité a en effet été désactivée depuis quelques années. A ma connaissance, le seul moyen de désinstaller actuel est de passer par la fonction Désinstaller ou Modifier un programme de Windows.
    Cordialement,
    Mathieu P. | Certified LabVIEW Associate Developer
    National Instruments France
    #adMrkt{text-align: center;font-size:11px; font-weight: bold;} #adMrkt a {text-decoration: none;} #adMrkt a:hover{font-size: 9px;} #adMrkt a span{display: none;} #adMrkt a:hover span{display: block;}
    Journées techniques : des fondamentaux aux dernières technologies pour la mesure et le contrôle/comm...

  • Rapport cyclique variable - Labwindows CVI - PXI 5411

    Bonjour Madame, Monsieur,
    Je développe actuellement une application sous Labwindows CVI permettant de faire varier en fréquence 3 signaux déphasés de 120° entre eux . Pour cela je dispose de 3 cartes PXI 5411.
    Cependant, le rapport cyclique est fixé à 50% par défaut. Mes signaux doivent avoir un rapport cyclique Th=75%.
    Je ne sais pas comment programmer cela sous CVI.
    Voici mon bout de code (dans moin exemple j'ai fixé la fréquence à 500Hz) :
    int CVICALLBACK COMMANDBUTTON (int panel, int control, int event, void *callbackData, int eventData1, int eventData2)
     ViReal64 DC=75.00; 
     ViReal64 frequence=500.00;
     ViChar GBF1[256]="DAQ::3";
     ViChar ChannelGBF1[256]="0";
     ViReal64 Amplitude1=5;
     ViReal64 DCOffset1=2.5;
     ViInt32  Waveform1=NIFGEN_VAL_WFM_SQUARE;
     ViChar GBF2[256]="DAQ::5";
     ViChar ChannelGBF2[256]="0";
     ViReal64 Amplitude2=5;
     ViReal64 DCOffset2=2.5;
        ViInt32  Waveform2=NIFGEN_VAL_WFM_SQUARE;
     ViChar GBF3[256]="DAQ::7";
     ViChar ChannelGBF3[256]="0";
     ViReal64 Amplitude3=5;
     ViReal64 DCOffset3=2.5;
        ViInt32  Waveform3=NIFGEN_VAL_WFM_SQUARE;
     switch (event)
      case EVENT_COMMIT:
       /* Ressource 1 maître, ressource 2 et 3 esclaves*/  
     if(vi1 != VI_NULL) { niFgen_close(vi1);}  
     if(vi2 != VI_NULL) { niFgen_close(vi2);}
     if(vi3 != VI_NULL) { niFgen_close(vi3);}  
     niFgen_init(GBF1, VI_TRUE,1, &vi1);
     niFgen_init(GBF2, VI_TRUE, 1, &vi2);  
     niFgen_init(GBF3, VI_TRUE,1, &vi3);  
      /* Configuration du maître*/
     niFgen_ConfigureRefClockSource(vi1, NIFGEN_VAL_RTSI_CLOCK);
     niFgen_RouteSignalOut(vi1, "0", NIFGEN_VAL_OUT_START_TRIGGER,NIFGEN_VAL_RTSI_1);
     niFgen_RouteSignalOut(vi1, "0", NIFGEN_VAL_SYNCHRONIZATION,NIFGEN_VAL_RTSI_0);   
       /* Configuration esclave 1*/
     niFgen_ConfigureRefClockSource(vi2, NIFGEN_VAL_RTSI_CLOCK);
        niFgen_ConfigureTriggerSource(vi2, "0", NIFGEN_VAL_RTSI_1);
        niFgen_ConfigureSynchronization (vi2, "0", NIFGEN_VAL_RTSI_0);  
       /* Configuration esclave 2*/
     niFgen_ConfigureRefClockSource(vi3, NIFGEN_VAL_RTSI_CLOCK);
        niFgen_ConfigureTriggerSource(vi3, "0", NIFGEN_VAL_RTSI_1);
        niFgen_ConfigureSynchronization(vi3, "0", NIFGEN_VAL_RTSI_0);   
      /* Configuration et generation forme d'onde esclave 1*/
        niFgen_ConfigureOutputMode(vi2, NIFGEN_VAL_OUTPUT_FUNC); 
     niFgen_ConfigureStandardWaveform(vi2, ChannelGBF2, Waveform2, Amplitude2, DCOffset2, frequence,120);
     niFgen_InitiateGeneration(vi2);
        niFgen_ConfigureOutputEnabled(vi2, "0", VI_TRUE);     
     niFgen_SetAttributeViReal64 (vi2, ChannelGBF2, NIFGEN_ATTR_FUNC_DUTY_CYCLE_HIGH, DC); 
      /* Configuration et generation forme d'onde esclave 2*/
        niFgen_ConfigureOutputMode(vi3, NIFGEN_VAL_OUTPUT_FUNC); 
     niFgen_ConfigureStandardWaveform(vi3, ChannelGBF3, Waveform3, Amplitude3, DCOffset3, frequence,-120);
     niFgen_InitiateGeneration(vi3);
        niFgen_ConfigureOutputEnabled(vi3, "0", VI_TRUE);
     niFgen_SetAttributeViReal64 (vi2, ChannelGBF2, NIFGEN_ATTR_FUNC_DUTY_CYCLE_HIGH, DC); 
     /* Configuration et generation forme d'onde maître*/
        niFgen_ConfigureOutputMode(vi1, NIFGEN_VAL_OUTPUT_FUNC);
        niFgen_ConfigureStandardWaveform(vi1, ChannelGBF1, Waveform1, Amplitude1, DCOffset1, frequence,0);   
        niFgen_InitiateGeneration(vi1);
        niFgen_ConfigureOutputEnabled(vi1, "0", VI_TRUE); 
        niFgen_SetAttributeViReal64 (vi2, ChannelGBF2, NIFGEN_ATTR_FUNC_DUTY_CYCLE_HIGH, DC); 
        break;
     return 0;
    Naturellement, je me connecte sur la sortie SYNC OUT des cartes PXI. Aussi, j'ai essayé à l'aide du Front Panel NiFgen et là j'arrive à faire varier le rapport cyclique (quelque soit le signal généré sur la sortie ARB OUT).
    Pourriez-vous m'aider??
    La fonction ; niFgen_SetAttributeViReal64(vi2,ChannelGBF2,NIFGEN​_ATTR_FUNC_DUTY_CYCLE_HIGH, DC);
    ne fonctionne pas.
    Cordialement,
    Eric

    Bonjour Eric,
    Tu as posté ta question sur la partie internationale du forum.
    Si tu souhaites avoir plus de chance d'avoir une réponse je te conseille soit d'y poser ta question en anglais soit de la poser sur le forum francophone : French forum
    Nevertheless, you should be able to change the duty cycle with the following function:
    ViStatus niFgen_SetAttributeViReal64 (ViSession vi, ViConstString Channel_Name, ViAttr Attribute_ID, ViReal64 Attribute_Value);
    You can take a look at CVI examples and especially to the 5404ClockGeneration. cws example which change dynamically the duty cycle with the function above. (Help>>Find Examples)
    Regards,
    Valentin
    Certified TestStand Architect
    Certified LabVIEW Developer
    National Instruments France
    #adMrkt{text-align: center;font-size:11px; font-weight: bold;} #adMrkt a {text-decoration: none;} #adMrkt a:hover{font-size: 9px;} #adMrkt a span{display: none;} #adMrkt a:hover span{display: block;}
    Travaux Pratiques d'initiation à LabVIEW et à la mesure
    Du 2 au 23 octobre, partout en France

  • DLL CVI pour TestStand

    Bonjour,
    dans une séquence de test créée avec TestStand, je voudrai faire afficher une interface graphique
    que j'ai créé avec CVI contenant des checkbox.
    Le problème est que je suis complètement novice dans ce domaine et je ne sais pas trop par où commencer.
    J'ai créé une interface graphique et généré le code qui va avec.
    Mais dans le .c je ne sais pas comment faire pour activer les checkbox pour que leurs états soient reconnus
    dans TestStand. L'état des checkbox devra mettre à jour des variables dans TestStand.
    Est ce qu'un aurait un exemple tout simple avec une interface graphique qui soit reconnu dans TestStand et qui 
    met à jour une variable.
    Ou un lien vers un tuto, je n'en n'ai pas trouvé correspondant à mes besoins.
    Merci

    Ouai c'est juste sous CVI. Lorsque j'"aurai accès à mon IHM,
    il ne me restera plus qu'a mettre à jour les paramètres qui vont bien 
    en fonction de l'état des boutons.
    ci-joint mon code crée à partir d'un exemple fournit dans le dossier
    exemple de TestStand (loin d'être opérationel).
    Mais vous pourrez m'indiquer si je suis dans les choux ou pas ^^
    Pièces jointes :
    EssaiCreationDLL.jpg ‏270 KB

  • Modificati​on d'un step avec une CVI

    Bonjour,
    Je souhaiterai pouvoir modifier des modes d'exécution sur des steps à partir d'une DLL faite sous CVI.
    J'utilise TS_StepSetRunModeEx mais je n'arrive pas à sauver ma séquence mise à jour.
    Comment dois je faire?
    merci d'avance

    Bonjour,
    Que vaut le chemin du fichier ? Il faut faire attention à sa valeur, en effet si celui-ci est "C:\dossier1\fichier.seq" la fonction n'enregistrera rien, il faut que vous fassiez attention au caractère \ en ajoutant un \ avant pour indiquer qu'il s'agit d'un caractère spécial comme cela : "C:\\Dossier\\fichier.seq".
    Vous pouvez utiliser la fonction MakePathName pour réaliser cela (vous trouverez plus d'informations dans l'aide LabWindows/CVI).
    De plus avez vous essayé d'utiliser un errChk sur la fonction TS_SeqFileSave ?
    Cordialement,

  • Retour paramètre string par Labwindows/CVI pour Teststand

    Bonjour à tous,
    j'utilise Teststand 2012 Development System et Labwindows/CVI 2012 Development System sous Windows 7 professionnel.
    Le contexte : grâce à une DLL crée avec Labwindows/CVI j'appel la fonction "Traitement" par TS.
    Le prototype de la fonction est le suivant void __declspec(dllexport) Traitement (char message[256], car reponse[256]);
    Je passe en paramètre deux strings à cette fonction. Cette fonction reçoit un "message", effectue un traitement sur celui-ci et le renvois sous le tableau "reponse" à TS. Cette fonction a été testée et fonctionne sous CVI.
    Mon problème : J'ai vérifié ma fonction reçoit bien le message mais me retourne quelque chose d'erroné( cf. image) et n'est censé me retourner, dans"reponse", que les chiffres au début mais me rajoute des instructions en temps que string. Je ne comprend pas comment cette suite d'instruction ce rajoute et pourquoi?
    J'ai consulté tous les messages disponibles sur le forum et je n'ai pas réussi à trouver un problème équivalent et donc une solution.
    J'espère que vous aurez une idée, voir pourquoi pas une solution
    Dans l'attente d'une réponse,
    Cordialement,
    Erwan.
    Résolu !
    Accéder à la solution.
    Pièces jointes :
    message.png ‏74 KB

    Bonjour Akagi,
    Dans une chaîne de caractère, "Null" ou "\0", correspond effectivement à une fin de chaîne.
    Pour éviter ce comportement, vous pouvez changer le type de passage de paramètre dans TS en tableau de Numérique.
    Ce faisant, aucun traitement ne sera fait sur le caractère "NULL". pour rappel un char = 1 Octet, on peut donc utiliser un tableau de numérique U8 pour représenter une chaîne de caractère.
    En résumé, si votre chaîne de caractère = 3"Null"01, vous obtiendrez ainsi: tab[0] = 3, tab[1] = 0, tab[2]=1.
    Je suis désolé, mais j'ai du mal à saisir où est intégré le caractère "NULL" dans CVI, est-ce une entrée clavier saisie par l'utilisateur, autre?
    Est-il possible d'utiliser un autre caractère ou série de caractère(non spécial) permettant d'identifier cette transition/caractère spécial "Null"?
    EX: (\) = "Null", soit la chaîne 3(\)01 équivalent à 3"Null"01. Il suffit ensuite d'établir un algorithme permettant de changer (\) en "NULL".
    Cordialement,
    Rémi D.
    National Instruments France
    #adMrkt{text-align: center;font-size:11px; font-weight: bold;} #adMrkt a {text-decoration: none;} #adMrkt a:hover{font-size: 9px;} #adMrkt a span{display: none;} #adMrkt a:hover span{display: block;}
    >> Les rencontres techniques de NI - Mesures et acquisition de données : de la théorie à la mise en ...

  • Problème RunTime Lab/CVI

    Salut à tous,
    Je voudrais savoir quelle sont les éléments nécessaires pour exécuter une application développer sous CVI sur un hôte au labwindows/CVI n'est pas installé, la solution de mettre dans le système 32 la liste des éléments suivantes:
    cvirte, cvirt.dll, cvirte.dll, mesa.dll  n'est pas efficaces pour certains cas.
    En faite j'ai une application créé sous CVI qui refuse de s'exécute que après l'installation de Lab/CVI.
    J’ai reçu un message d'erreur lorsque l'IDE CVI n'est pas installé sur la cible :
    "L'application n'a pas réussi à s'initialiser correctement (0xc0150002). Cliquer sur OK pour arrêter l'application. "
    J’ai même mettre dans le Sys 32 tous les DLL, les dépendance utilisé par mon appli mais sans succès.
    L’installation de la RunTime (Fichier Binaire télécharger depuis le SITE NI) ne résoudre pas le problème, j’ai aussi installé le framworke .NET mais toujours le même message d'erreur ("L'application n'a pas réussi à s'initialiser correctement (0xc0150002). Cliquer sur OK pour arrêter l'application. ")
    Si il y a une solution (par exemple : copier les dépendances dans le sys32) sans passer par l'installation de Lab/CVI au leur RunTime je suis preneur.
    Merci d'avance
    Cordiales Salutations.
    Tawfik.

    Merci pour votre réponse,
    Quel type d'application s'agit-il?
    L’outil en question est une application de supervision et outils d’aide pour le dépannage des cartes électroniques (Décodeurs, Modems, Routeurs WiFi….) l’appli gère des instruments de mesure (wattmètre RS232, modules RF USB, …)  et aussi un client SQL pour un serveur postgresql (pour voir et mettre a jour les statuts de test effectuées sur les cartes).
    A quels éléments logiciels faîtes vous appel?
    L’application fait appel à des DLL, Contrôle ActiveX pour:
    Gérer le Traça DLL libpq.dll, ssleay32.dll, …
    Interfaçage avec l'annuaire LDAP & authentification (wldap32.dll)
    Envoi de mail (vbSendMail.dll, MSWINSCK.OCX)
    Création des rapports PDF (libhpdf.dll)
    Et j’ai aussi utilisé le SDK pour afficher des Message Box, Modifier la transparence des IHM ….
    La première étape est de créer un programme de test sous LabWindows/CVI
    Oui effectivement ça fait long temps que je développe sous Lab/CVI, pour les applications simples que ne fait pas appel à des composants spéciales (ActiveX, DLL,DAQmx, wrapper .NET,…) tous marche nickel sans installation de CVI, juste je mettre les DLL  indiqué au post précédent dans le Sys 32 de la cible et dans certain cas enregistrement de quelque DLL est ! Voila mes exe tourne correctement sans problème.
    J’ai mettre les dépendance retourner avec Dependency Walker (depends.exe) dans le sys32 mais ça marche pas toujours le même message d’erreur !!!
    Ci_joint vous trouver les dépendance retourner avec Dependency Walker (dependence.png)
    Merci pour un piste.
    Pièces jointes :
    dependence.png ‏3 KB

  • Execute a non Stop Action during others actions

    Hello,
    I have a problem with my program. I have developping a communication with the serial port with the example of Labwindows. But it read when the users rest on the button. I would like read the serial port all the time and can do other action in the same time. Can you help me please ?
    Thank you,
    Regards

    Hi romess, here you are with the need of performing several tasks inside the single program. This can be obtained in several ways; here a non-exhaustive list of possible solution, in order of increasing complexity:
    Standard UI timer: inside the callback perform the serial port activity. Given the time of the serial port process, you must define a timer interval so that some time is left for user interface activity
    Asyncronous timer: the same as above, with some multithreading added due to the way async timers are structured. CVI offers a specific instrument (<cvidir>\toolslib\toolbox\asynctmr.fp) to handle such timers; they have the same callback definition of standard UI timers so that what you have developed for the above solution can be portes almost 'as is' to async timers
    Multithreading
    When developing programs that have two or more independent tasks, some precautions are to be taken in order to prevent contemporaneous access to shared resources or to internal variables/objects: a good starting point is to read <cvidir>\bin\MultithreadingOverview.pdf document, which even if aimed to pure multithreading structures, nevertheless gives you a conceptual framework on the possible problems you can find and how to prevent them.
    Proud to use LW/CVI from 3.1 on.
    My contributions to the Developer Zone Community
    If I have helped you, why not giving me a kudos?

  • Error in call to loadpanel . Error Code: -94

    Bonjour,
    Sous cvi, quand je créé l'execultable, j'embarque l'UIR (Embed project.UIRs)
    Si je deplasse le fichier.exe créé, le message suivant apparait :
    Error in call to loadpanel. / Parent Panel Handle: 0 / Panel Resource ID: 1 / Error Code: -94 / File not found
    Que signifie ce code '' -94 '' ?
    Merci de votre aide
    Cdlt
    Hello,
    Under CVI, when I build my project, I embed the UIR panel ( ''Embed project.UIRs'' )
    When I mov the exe file created, thr error message appear :
    Error in call to loadpanel. / Parent Panel Handle: 0 / Panel Resource ID: 1 / Error Code: -94 / File not found
    Please, what is this error cod ?
    Thanks in advance for you help
    Regards

    Dale;
    That is happening because you probably installed the new version of NI-DAQ on the top of the old one, without uninstalling it first. Now, you will need to uninstall everything, clean the windows registry entries up, and install NI-DAQ 6.9.1 from scratch.
    To unsitall the driver, go to Add/Remove programs, and to clean up the registry, type RegEdit in Start->Run, and go to HKWY_LOCAL_MACHINE->Software->National Instruments, and delete the NI-DAQ folders, if they are still there after you unistall everything.
    Hope this helps.
    Filipe

Maybe you are looking for

  • Animated gif in IWeb?

    I am trying to add an animated GIF to my site. I downloaded a program called "pixen", and it seems easy enough to use. However, it doesn't seem to work. Anyone have any suggestions? I'm just looking to be able to add some scrolling text. Thanks! Kim

  • No longer able to access Web Management after Firmware Update [SF200]

    Hello! Today I was attempting to set up SNMP on our SF200-48 switch. I realized we were running old firmware which does not support SNMP and that the most current version (1.4.0.88) does support it. I attempted to upgrade the firmware but it failed,

  • Keeps asking for password when deleting file ?

    I updated to Mac OS Lion and now every time I delete any file it asks me for my password. Any file - be it on the Desktop, in the Downloads folder or in any other place. It asks me for my password every time. That behaviour is annoying. Is it the new

  • Getting filename from a string including filepath and filename

    How I can get a filename from a string which includes both filepath and filename? The filepath is not always the same. For example, the variable could include a "C:\temp\test.doc" or "C:\files\docfiles\test.doc" and I need to get the filename "test.d

  • Install Tiger on Mac OS X Server

    Actually there are two questions: 1) Is it possible to install X11 on Mac OS X Server 10.4.8 running on Dual 1.8GHz PPC G5? 2) If not, is it possible to install Tiger (Mac OS X 10.4.5) using the install disk I got along with my MacBook Pro on the abo