Discussion:
Read/Write on a single line with IO 6518 board
(too old to reply)
Masakikun
2008-05-08 06:10:07 UTC
Permalink
Hi, I'm trying to control input (16 line) and output (16 line) from a NI6518 card with visual C++. For that, I would like to read/write single line by single line. I tried the following code but that does'nt seem to operate.I wrote a class with to hereunder method: ReadLine and Write. Maybe, I confuse with the meaning channel/line,uInt8..Can somebody explain me my mistake? Thank you very much!READ INPUT:bool CTORInterface::ReadLine(int number,bool& value)//number 0 to 7{ TaskHandle hTask = NULL;CString szNameBoard = "IOBOARD1"CString szLineID;szLineID.Format("IOBOARD1/port0/line%d",number);//channel with 1 line//retrieve handle on taskDAQmxCreateTask("IOBOARD1",&hTask);//create input lineDAQmxCreateDIChan(hTask,szLineID,"",DAQmx_Val_ChanPerLine);//start taskDAQmxStartTask(hTask);//readinguInt8    data[8];int32    read,bytesPerSamp;DAQmxReadDigitalLines(hTask,1,10.0,DAQmx_Val_ChanPerLine,data,8,&read,&bytesPerSamp,NULL);//stop taskDAQmxStopTask(hTask);//release handleDAQmxClearTask(hTask);//extraction value from number bits datavalue = (bool)data[number];return true;} WRITE OUPUTbool CTORInterface::WriteLine(int number, bool value){ TaskHandle hTask = NULL;CString szNameBoard = "IOBOARD1"CString szLineID;szLineID.Format("IOBOARD1/port2/line%d",number);//channel with 1 line//retrieve handle on taskDAQmxCreateTask(szNameBoard,&hTask);//create output lineDAQmxCreateDOChan(hTask,szLineID,"",DAQmx_Val_ChanPerLine);//start taskDAQmxStartTask(hTask);//write value on lineuInt8 data[1];int32 numWritten = 0, regenMode;uInt32 bytesPerChan;data[1] = value?1:0;DAQmxWriteDigitalLines(hTask,1,1,10.0,DAQmx_Val_ChanPerLine,data,&numWritten,0);//stop taskDAQmxStopTask(hTask);//handle releaseDAQmxClearTask(hTask);return true;}
ManuelR
2008-05-09 14:10:08 UTC
Permalink
Hi, This program should work.  What do u mean by "that does'nt seem to operate". Do you have a DAQmx error message? If so can you please post a screenshot of this error?I ran a similar code (with the C language) and this sorks with the same parameters for the daq functions.The "uInt8" data type is a 8 bit integer sample to write.The Channel is "from where" you want to read or write data; This can be one line or one port. Do not hesitate to ask for more informations :smileywink:
Masakikun
2008-05-12 00:10:06 UTC
Permalink
Hi, merci pour vos réponses! Un DAQmx message apparaît seulement lors d'une writing operation: "Measurement: Attempted writing digital data is not supported"Pour info, je travaille avec une carte 6518 simulé sur mon portable car je n'ai pas encore recu le PC industriel pour mon projetMalheureusement, je dois attendre encore 1 ou 2 semaine.Est-ce que ce message provient de l'utilisation d'une carte simulée?Est-il possible de tester mes entrées à l'aide des outils de simulation de MAX?Dans mon code ReadLine, je définis une tableau uInt8 data[8], mais je lui demande de lire uniquement une ligne "line5", pas le port, ne devrais-je pasrécupérer le résultats dans data[0] plutot que data[5]? Ma première idée était de lire le port complet "port0/line0:7" est d'extraire le bit qui m'interessemais je souhaite rester cohérent avec la manière d'écrire.D'avance merci pour votre aide!
ManuelR
2008-05-13 15:40:12 UTC
Permalink
Bonjour, Le fait d'avoir une carte simulée ne devrait pas poser de problème. J'ai de mon coté fait aussi les tests avec une carte simulée ainsi qu'avec une carte physique.Pour recentrer un peu votre problème:- en écriture vous obtenez le message d'erreur suivant :"Measurement: Attempted writing digital data is not supported"- en lecture vous n'arrivez pas à lire sur une seule ligne.Ai je bien compris?
Masakikun
2008-05-14 01:10:07 UTC
Permalink
Bonjour, Oui, c'est exactement cela!Mais j'utilisais le panneau de test pour essayer de valider mon fonctionnement!Aujourd'hui, je viens de comprendre qu'il me faut créer des tasks sur les lignesde ma carte simulée avec MAX pour vérifier mon logiciel. Est-ce la bonne méthode pour simuler la carte et tester mon logiciel?J'ai donc créer et exécuter une ligne input et une output pour cela et j'obtiens les messages suivant:Sortie et entrée:Measurements: Requested operation could not be performed, because the specified digital lines are either reserved or the device isnot present in NI-DAQmx. It is possible that tese lines are reserved by another task...C'est parce que je tente d'accéder à une ligne en même temps que le simulateur NI, comment palier à cela?Existe-t-il une fonction de synchronisation DAQmx pour cela? J'utilise déjà des objets de synchronisation CEvent pour éviter d'avoir une lecture  et écriture en même temps,car j'ai monitor qui scrute en temps réels toutes les entrées et un opérateur qui doit envoyer des ordres à tout instant.Merci encore pour votre aide
Nacer_M
2008-05-20 14:10:08 UTC
Permalink
Bonjour,
Effectivement sous max vous pouvez verifier et tester votre carte.
Ensuite, effectivement vous ne pouvez reserver la ressource qu'une fois, c'est à dire soit utiliser le panneau de test de MAX, soit utilisez votre programme, ceci implique aussi une tache pour la lecture des voies.
Le fait que votre carte soit simulé ne change rien comme l'a dit mon collègue.Pour cette carte vous pouvez lire ou écrire sur une ligne ou (plusieurs lignes).Voici un exemple de code correct :
#include <stdio.h>
#include <NIDAQmx.h>
#define DAQmxErrChk(functionCall) if( DAQmxFailed(error=(functionCall)) ) goto Error; else
int main(void)
{
int32 error=0;
TaskHandle taskHandle=0;
uInt32 data;
char errBuff[2048]={'\0'};
int32 read;
/*********************************************/
// DAQmx Configure Code
/*********************************************/
DAQmxErrChk (DAQmxCreateTask("",&taskHandle));
DAQmxErrChk (DAQmxCreateDIChan(taskHandle,"Dev2/port0/line0", "",DAQmx_Val_ChanPerLine));
/*********************************************/
// DAQmx Start Code
/*********************************************/
DAQmxErrChk (DAQmxStartTask(taskHandle));
/*********************************************/
// DAQmx Read Code
/*********************************************/
DAQmxErrChk (DAQmxReadDigitalU32(taskHandle,1,10.0,DAQmx_Val_GroupByChannel,&data,1,&read,NULL));
printf("Data acquired: 0x%X\n",data);

Error:
if( DAQmxFailed(error) )
DAQmxGetExtendedErrorInfo(errBuff,2048);
if( taskHandle!=0 ) {
/*********************************************/
// DAQmx Stop Code
/*********************************************/
DAQmxStopTask(taskHandle);
DAQmxClearTask(taskHandle);
}
if( DAQmxFailed(error) )
printf("DAQmx Error: %s\n",errBuff);
printf("End of program, press Enter key to quit\n");
getchar();
return 0;
} Message Edité par Nacer_M le 05-20-2008 09:04 AM
Masakikun
2008-05-27 08:10:07 UTC
Permalink
Bonjour Manuel et Nacer, En premier lieu, merci pour vos explications, mon logiciel en mode simulation fonctionne.De plus, j'ai trouvé une erreur dans mon code:uInt8 data[1];int32 numWritten = 0, regenMode;uInt32 bytesPerChan;data[1] = value?1:0; data[0 ] = value?1:0;DAQmxWriteDigitalLines(hTask,1,1,10.0,DAQmx_Val_ChanPerLine,data,&numWritten,0);Je viens de recevoir mon matériel et me prépare à tester dès demain mes entrées et sorties. Lorsque j'ai choisi cette carte sur les specs du site web, je lisais niveau d'entrée/sortie: +/- 30V et mon signal d'entrée est + 5V (TTL).A l'époque, un conseiller téléphonique NI me disait aucun problème.Hors, je viens de récupérer la spec détaillée de la carte 6518 où il est écrit:Input logic low level: Min 0V et Max +/-4VInput logic hight level: Min +/-11V et Max +/-30VJe ne sais plus quoi penser de cela. Est-ce que je dois utiliser des résistances pour faire une pont diviseur de tensionest ainsi redescendre mon signal en dessous de +4V pour être détectable? C'est confus pour moi!Pour mes sorties, le signal externe est aussi +5V, la spec indique +/- 30V donc pas de problème....je pense!Est-ce que j'ai mal compris?Mon système au final doit pouvoir détecter 16 statuts d'équipements différents (moteur en rotation 1/0, bon fonctionnement, valve ouverte où fermée,....),tous en +5V TTL.D'avance merci pour votre aide!
Loading...