Digital I/O

cancel
Showing results for 
Search instead for 
Did you mean: 

PCI-6528 questions

Bonjour,

Actuellement, j'utilise la carte NI PCI 6528 en acquisition de signal. une fonction recupere l'état des entrées à un moment donné.

Mes besoins ont changé et j'aurais besoin de conseil sur la façon d'utiliser ma carte :

Ma carte PCI-6528 est sur un PC maitre, j'utilise 2 ports pour relier mon PC maitre à un PC client (quand le premier port est à 1 cela signifie que j'ai une info sur le deuxieme port).
Plusieurs PC client sont ainsi connectés au PC maitre sur la carte PCI-6528.
Chaque PC Client fourni à un moment une information sur le port2(0 ou 1) en mettant le port1 à 1. Les PC clients ne fournissent pas l'info en même temps. (a T0:aucune info, a T1:info du PC1 et PC3, a T2:aucune info, a T3: info du PC2...)
J'aurais besoin de récuperer sur une periode donnée, l'information provenant des différents PC clients.

Pour l'instant j'ai fait une fonction qui scrute mes ports en continue le plus rapidement possible mais cela a plusieurs inconvenients : utilisation du processeur 100% et je loupe plusieurs mesures (la carte est plus rapide que le PC).

J'ai pensé à deux solutions mais je ne sais pas comment les inplementer :
- utiliser un thread qui attend que la carte lui transmette l'etat des ports dés qu'il y a une modification sur un etat.
- récuperer sur la carte à un moment donné un tableau contenant les valeurs de tous les ports depuis la derniere lecture

Pour l'instant, j'opterais plus pour al deuxieme solution mais laquelle me conseilleriez vous ? avez vous des exemples pour programmer de telles fonctions ?

Voici le code que j'utilise pour l'instant :

#include
#include
#include
#include
#pragma comment(lib, "NIDAQmx")
using namespace std;

int main(int argc, char *argv[])
{
int32 read,bytesPerSamp;
uInt8 data[100];
TaskHandle mytaskHandle=0;
int sizeOfData=100,error;
char errBuff[2048]={'\0'};
int32 i;

DAQmxErrChk (DAQmxCreateTask("",&mytaskHandle));
DAQmxErrChk (DAQmxCreateDIChan(mytaskHandle,"Dev1/port0/line0:7","",DAQmx_Val_ChanForAllLines));
DAQmxErrChk (DAQmxStartTask(mytaskHandle));
DAQmxErrChk (DAQmxReadDigitalLines(mytaskHandle,1,10.0,DAQmx_Val_GroupByChannel,data,sizeOfData,&read,&bytesPerSamp,NULL));
DAQmxErrChk (DAQmxStopTask(mytaskHandle));
DAQmxErrChk (DAQmxClearTask(mytaskHandle));

Error:
if( DAQmxFailed(error) )
DAQmxGetExtendedErrorInfo(errBuff,2048);
if( mytaskHandle!=0 )
{
DAQmxStopTask(mytaskHandle);
DAQmxClearTask(mytaskHandle);
}
if( DAQmxFailed(error) )
printf("DAQmx Error: %s\n",errBuff);
else
for(i=0;i<8;++i)
printf("Données acquise, channel %d: 0x%X\n",i,data[i]);
system("PAUSE");
return 0;
}

Merci de votre aide !!!

David MARQUIS (Proko)

Message Edité par Proko le 03-23-2005 04:18 AM

0 Kudos
Message 1 of 3
(3,570 Views)
Une autre petite question en complement de mon message précedent :

Quand je récupere l'etat d'un plage de ports (par exemple 1 à 12), que devient l'etat des autres ports sur la carte ?
est ce que la carte les garde en memoire ou est ce qu'elle reinitialise tout ?

Le but est d'utiliser la carte pour 2 fonctions différents :
la premiere est de recuperer l'etat des PC clients (entre 8 et 12 ports utilisés) (fonction dans mon message precédent)
la deuxieme est de récuperer l'état de capteurs pour ensuite utiliser des actionneurs.

Les deux fonctions s'execute en meme temps et aucune valeur ne doit etre perdu.

Cordialement,

Marquis David

Message Edité par Proko le 03-23-2005 04:29 AM

0 Kudos
Message 2 of 3
(3,557 Views)
up !!!
Si je me suis mal exprimé ou que vous avez besoin de plus d'info, demandez.

C'est assez urgent !!!

Merci
0 Kudos
Message 3 of 3
(3,524 Views)