Commande carte ni6008 sous builder c++

Librairies

Le long de la réalisation de notre programme nous avons rencontré différents problèmes notamment en ce qui concerne les librairies. En effet, il nous a fallu inclure dans notre projet une nouvelle librairie qui nous a permis d'avoir accès aux fonctions indispensables à la réalisation de notre programme.

Suite aux recommandations de notre professeur nous avons trouvé une solution à ce problème :

Il faut importer les fichiers include et .lib qui sont dans le répertoire National Instrument puis ouvrir le dossier NI-DAQ puis le dossier Lib pour les .lib et dans le dossier include pour les include afin de les faire fonctionner sous Builder C++. Mais pour mettre la .lib <<NI-DAQ.h>> sous Builder C++, nous avons utilisé un fichier .dll de la librairie pour ensuite le convertir en fichier .lib pour Builder C++.

Aussi, il faudra donc aller dans le C:\Windows/Systeme32/nicaiu.dll pour récupérer les fichiers .dll, ensuite avec la fenêtre de commande (Démarrer->Exécuter->cmd) dans le disque D où vous aurez copier le fichier nicaiu.dll, tapez la commande suivante : Implib.exe NIDAQ.lib nicaiu.dll . Suite à cette opération, vous verrez apparaître dans le dossier où se trouve votre .dll un fichier .lib.

Par ailleurs, dans le code écrit sous Builder C++, il vous faudra rajouter au projet le fichier .lib précédemment créé et surtout que la librairie <<NIDAQ.h>> soit présente dans le répertoire du projet.

Réseaux

Pour la réalisation du notre réseaux TCI/IP sous Builder C++ nous avons utilisé des sockets indispensables dans les échanges entre le ou les clients et le serveur.

Serveur

//--------------------------------------------------------------------------------------- 


void_fastcall TForm1::FormActivate(TObjet *sender) 
{ 
    ServerSocket1-> Active = true; 
} 

//--------------------------------------------------------------------------------------- 
void_fastcall TForm1::ServerSocket1ClientConnect(TObjet *sender,TCustomWinSocket *Socket) 
{ 
    Application-> MessageBoxA("un client se connecte",NULL,MB_OK); 
    StatusBar1-> SimpleText= "connexion d'un client"; 
} 
//--------------------------------------------------------------------------------------- 

void_fastcall TForm1::ServerSocket1ClientDisconnect(TObjet*sender,TCustomWinSocket *Socket) 
{ 
    Application-> MessageBoxA("un client se déconnecte",NULL,MB_OK); 
    StatusBar1-> SimpleText= "déconnexion d'un client"; 
} 
//--------------------------------------------------------------------------------------- 


//--------------------------------------------------------------------------------------- 
void_fastcall TForm1::ServerSocket1ClientRead(TObjet *sender,TCustomWinSocket *Socket) 
{ 
    StatusBar1-> SimpleText= "Dialogue en cours"; 
    if(if==0) 
    { 
      Socket->ReceiveBuf(&data,sizeof(uInt32)); 
      //---------------------------------------------------------------------------------- 
      switch(data) 
      { 
        case 0x00000001: 
          Socket->SendBuf(&d2,sizeof(uInt32)); 
          break; 

        case 0xffffff01: 
          Edit3->Text=data; 
          DAQmxWriteDigitalU32(tache1,1,1,10.0,DAQmx_Val_GroupByChannel,&data,&written,NULL); 
          break; 

      case 0xffffff02: 
        Edit3->Text=0xffffff02; 
        DAQmxWriteDigitalU32(tache1,1,1,10.0,DAQmx_Val_GroupByChannel,&data,&written,NULL); 
        break; 

      case 0xffffff04: 
        Edit3->Text=data; 
        DAQmxWriteDigitalU32(tache1,1,1,10.0,DAQmx_Val_GroupByChannel,&data,&written,NULL); 
        break; 

      case 0xffffff08: 
        Edit3->Text=data; 
        DAQmxWriteDigitalU32(tache1,1,1,10.0,DAQmx_Val_GroupByChannel,&data,&written,NULL); 
        break; 

      case 0x00000002: 
        Edit->Text=data; 
        i=1; 
      break; 
    } 
  } 
  else 
  { 
    d3[0 * =d4; 
    DAQmxWriteAnalogF64(tache3,1,1,10.0,DAQmx_Val_GroupByChannel,&d3,NULL,NULL); 
    i=0; 
  } 
} 
//--------------------------------------------------------------------------------------- 

Le client envoie une requête. Aussi, deux cas peuvent se présenter :

  • Le serveur répond en fonction de la question contenue dans la requête.
  • Soit le serveur exécute l'ordre donné dans la requête.

Si la valeur de la data qui est ici le nom que nous avons attribué à la valeur envoyé par le client est égale à 0x00000001, le serveur renvoie la valeur de l'état des interrupteurs :

  • si data=0xffffff01, alors la led1 s'allume
  • si data=0xffffff02, alors la led2 s'allume
  • si data=0xffffff04, alors la led3 s'allume
  • si data=0xffffff08, le relais s'ouvre.

Pour ce faire il est nécessaire d'utiliser la fonction DAQmxWriteDigitalU32.

Aussi, si data=0x00000002 cela permet de passer une variable que nous avons nommé ici I à 1 ce qui nous permet de recevoir une autre valeur qui elle définie avec quelle tension nous alimentons le ventilateur et ensuite repasse à 0.

Client

//--------------------------------------------------------------------------------------- 
void_Fastcall TForm1::FormActivate(TObjet*Sender) 
{ 
    ClientSocket1->Active = true; 
}//connexion au serveur 

//--------------------------------------------------------------------------------------- 
void_Fastcall TForm1::ButtonClick(TObjet*Sender) 
{ 
    ClientSocket1->Socket->SendText(Edit1->Text); 
}//envoie de requête au serveur 


//--------------------------------------------------------------------------------------- 
void_Fastcall TForm1::ClientSocket1Read(TObjet *Sender,TCustomWinSocket *Socket) 
{ 
    unsigned int d2; 

    Socket->ReceiveBuf(&d2,sizeof(unsigned int)); 
    Edit1->Text= " "; 
}//demande état des interrupteurs 

//---------------------------------------------------------------------------------------- 
void_Fastcall TForm1::BitBtnClick(TObjet*sender) 
{ 
    ClientSocket1->Socket->SendText(" Au revoir!"); 
    lientSocket1->Active = false; 
}//déconnexion au serveur 

//--------------------------------------------------------------------------------------- 
void_Fastcall TForm1::ClientSocket1Error(TObjet *Sender,TCustomWinSocket *Socket, TErrorEvent ErrorEvent,int &ErrorCode) 
{ 
    Application->MessageBoxA("une erreur est survenue!",NULL,MB_OK); 
    Application->Terminate(); 
}//signal une erreur due l'arrêt du serveur 

//--------------------------------------------------------------------------------------- 
void_Fastcall TForm1::Button2Click(TObjet*sender) 
{ 
    data=0xffffff01; 
    ClientSocket1->Socket->SendBuf(&data,sizeof,unsigned int); 
}//déconnexion au serveur 

//--------------------------------------------------------------------------------------- 
void_Fastcall TForm1::Button3Click(TObjet*sender) 
{ 
    data=0xffffff02; 
    ClientSocket1->Socket->SendBuf(&data,sizeof,unsigned int); 
} 

//--------------------------------------------------------------------------------------- 
void_Fastcall TForm1::Button4Click(TObjet*sender) 
{ 
    data=0xffffff04; 
    ClientSocket1->Socket->SendBuf(&data,sizeof,unsigned int); 
} 


//--------------------------------------------------------------------------------------- 
void_Fastcall TForm1::Button5Click(TObjet*sender) 
{ 
    data=0xffffff08; 
    ClientSocket1->Socket->SendBuf(&data,sizeof,unsigned int); 
} 

//--------------------------------------------------------------------------------------- 

Nous avons créé 4 boutons, permettant chacun d'envoyer une valeur au serveur. Selon l'information reçue, le serveur saura quelle Led il doit éclairer ou s'il doit ouvrir le Relais. Aussi, grâce à un Trackbar on pourra en modifiant la position de celui changer la valeur de la données envoyée au serveur et ainsi lui permettre de savoir quelle valeur de tension il doit appliquer au moteur du ventilateur. Mais avant que cette valeur ne soit envoyée, il est nécessaire de prévenir le serveur de l'arrivée de celle-ci en lui envoyant data=0x00000002 pour qu'il sache que c'est la tension du moteur du ventilateur qu'il va recevoir.

Ouverture d'un Port

Pour ouvrir un Port à l'IUT, il faut :

  • Aller dans le Menu Démarrer
  • Puis, Panneau de Configuration
  • Pare-feux Windows
  • Une fenêtre s'ouvre alors, aller dans l'onglet exception
  • Ajouter s'y un Port
  • Entrer un nom et un numéro de Port

Ainsi, pour que notre réseau fonctionne, il faudra ajouter dans l'interface du Client IP du serveur et le numéro de Port, et dans l'interface du Serveur y ajouter le même Port.

Lecture État Interrupteurs

Grâce à la fonction DAQmxReadDigitalU32,nous avons pu lire l'état des interrupteurs dans un Edit.Text .

Par ailleurs, nous avons utilisé un timer afin de pouvoir lire l'état des interrupteurs toutes les secondes. Aussi, il en ressortait que :

  • quand tous les interrupteurs sont à 0, on a d2=248,
  • lorsque l'interrupteur de gauche passe à 1, cela ajoute 1 à d2
  • quand l'interrupteur est au milieu, on ajoute 2 à d2
  • et si c'est celui de droite qui est à 1, on ajoute 4 à d2
  • quand tous les interrupteurs sont à 1 alors d2=255.

Ainsi, de par les informations fournies par notre enseignant, nous vous présentons ci-après un exemple de code permettant la lecture de l'état des interrupteurs :

//--------------------------------------------------------------------------------- 
void_Fastcall TForm1::Timer1Timer(TObjet*sender) 
{ 
    DAQmxReadDigitalU32(tache2,1,10.0,DAQmx_Val_GroupByChannel,&d2,1,&Read,NULL); 
    Edit->Text=d2; 
} 

//--------------------------------------------------------------------------------- 

Comment faire varier la vitesse du ventilateur ?

Pour faire varier la vitesse du ventilateur nous avons créé un programme faisant varier la tension aux bornes du moteur entre 0 et 5V. Puis, à l'aide d'un TrackBar1 avons fait donc varier d3 de 0 à 5 et grâce au Edit2.Text avons pu visualiser la valeur de la donnée. Tout cela a été rendu possible de par l'utilisation de la fonction : DAQmxWriteAnalogF64.

Ci-après vous trouverez le code utilisé pour faire varier la tension aux bornes du moteur :

//--------------------------------------------------------------------------------- 
void_Fastcall TForm1::TrackBar1Change(TObjet*sender) 
{ 
    d3[0 * =TrackBar1->Position; 
    Edit2->Text=d3[0 * ; 
    DAQmxWriteAnalogF64(tache3,1,1,10.0,DAQmx_Val_GroupByChannel,&d3,NULL,NULL); 
    Edit->Text=d2; 
} 

//--------------------------------------------------------------------------------- 

Contrôle des Leds et du Relais ?

Pour contrôler les Leds et le Relais de notre NI6008 sous Builder C++ nous avons développé grâce à la fonction DAQmxWriteDigitalU32 une application permettant de changer la valeur de data en appuyant sur les boutons présent sur l'interface. En effet, si l'on appuie sur un bouton, alors la valeur de data change :

  • data=0xffffff01 : pour allumer la Led de gauche
  • data=0xffffff02 : pour allumer la Led du mileu
  • data=0xffffff04 : pour allumer la Led de droite
  • data=0xffffff08 : pour ouvrir le relais la Led

Ainsi, nous avons ajouté aux événements de chacun de nos boutons les informations suivantes :

//--------------------------------------------------------------------------------- 
void_Fastcall TForm1::Button1Click(TObjet*sender) 
{ 
    data=0xffffff01; 
    DAQmxWriteDigitalU32(tache1,1,1,10.0,DAQmx_Val_GroupByChannel,&data,&written,NULL); } 

//------------------------------------------------------------------------------------- 
void_Fastcall TForm1::Button2Click(TObjet*sender) 
{ 
    data=0xffffff02; 
    DAQmxWriteDigitalU32(tache1,1,1,10.0,DAQmx_Val_GroupByChannel,&data,&written,NULL); } 

//------------------------------------------------------------------------------------- 
void_Fastcall TForm1::Button3Click(TObjet*sender) 
{ 
    data=0xffffff04; 
    DAQmxWriteDigitalU32(tache1,1,1,10.0,DAQmx_Val_GroupByChannel,&data,&written,NULL); } 

//------------------------------------------------------------------------------------- 
void_Fastcall TForm1::Button4Click(TObjet*sender) 
{ 
    data=0xffffff08; 
    DAQmxWriteDigitalU32(tache1,1,1,10.0,DAQmx_Val_GroupByChannel,&data,&written,NULL); } 

//-------------------------------------------------------------------------------------

Ce document intitulé « Commande carte ni6008 sous builder c++ » issu de CodeS SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Rejoignez-nous