le 06-12-2009 09:59 AM
Bonjour,
je débute tt juste sur les cartes d'acquisition.
Ce que je voudrais au final:
-C'est initialiser ts les les lignes d'un port à 0
-Ecrire ensuite 1 valeur sur chacune d'elles
-Verifier les valeurs écrites
J'ai réalisé un pti code pr écrire 0 sur 1 ligne et ensuite je vx lire la valeur.
comment faut si prendre? Si qqun peut m'éclairer sur les horreurs que j'écris , ça m'aiderait à comprendre le fonctionnement
des fctions nidaq.
Voici le code:
Option Explicit 'carte PCI6224 'Le nom de ce périphérique NI-DAQmx est Dev4 Dim th6224HTask As Long 'Handle de tache Private blnAutoStart As Boolean 'Si vrai la tache démarre automatiquement Private bytWriteArray(0 To 7) As Byte Private bytReadArray(0 To 7) As Byte Private lngSamplePerChWritten As Long Private lngSamplePerChRead As Long Private Const lngLOWState As Long = 0 Private Const lngHIGHState As Long = 1 Private Sub Form_Load() WriteOutput (1) End Sub 'Initialise à 0 puis Ecrit 1 valeur Public Function WriteOutput(Value As Long) As Integer Dim status As Integer Dim intIndex As Integer blnAutoStart = True 'Crée la tache 'Si status est < 0, 1 message d'erreur est retourné DAQmxErrChk DAQmxCreateTask("", th6224HTask) 'Crée les voies de sorties numériques CreateDigitalOutputPort "Dev4/port0/line0:7" 'Reset toutes les sorties bytWriteArray(0) = 0 'bytWriteArray(1) = 0 'bytWriteArray(2) = 0 'bytWriteArray(3) = 0 'bytWriteArray(4) = 0 'bytWriteArray(5) = 0 'bytWriteArray(6) = 0 'bytWriteArray(7) = 0 lblValeur.Caption = "Remise à 0" 'Ecrit 0 sur les ports de sortie 'For intIndex = 0 To 7 DAQmxErrChk DAQmxWriteDigitalLines(th6224HTask, 1, blnAutoStart, 15#, DAQmx_Val_GroupByChannel, bytWriteArray(0), lngSamplePerChWritten, ByVal 0&) 'Next intIndex 'Lit la valeur DAQmxErrChk DAQmxReadDigitalLines(th6224HTask, 1, 15#, DAQmx_Val_GroupByChannel, bytReadArray(0), 8, lngSamplePerChRead, 8, ByVal 0&) Text1.Text = CStr(bytReadArray(0)) bytWriteArray(0) = 1 'bytWriteArray(1) = 0 'bytWriteArray(2) = 1 'bytWriteArray(3) = 0 'bytWriteArray(4) = 1 'bytWriteArray(5) = 0 'bytWriteArray(6) = 1 'bytWriteArray(7) = 1 'Ecrit la valeur du port de sortie DAQmxErrChk DAQmxWriteDigitalLines(th6224HTask, 1, blnAutoStart, 15#, DAQmx_Val_GroupByChannel, bytWriteArray(0), lngSamplePerChWritten, ByVal 0&) 'Lit la valeur DAQmxErrChk DAQmxReadDigitalLines(th6224HTask, 1, 15#, DAQmx_Val_GroupByChannel, bytReadArray(0), 8, lngSamplePerChRead, 8, ByVal 0&) Text1.Text = CStr(bytReadArray(0)) 'Stoppe la tache DAQmxErrChk DAQmxStopTask(th6224HTask) 'Supprime la tache DAQmxErrChk DAQmxClearTask(th6224HTask) End Function Public Sub CreateDigitalOutputPort(strLines As String) 'strLines: nom des sorties à creer DAQmxErrChk DAQmxCreateDOChan(th6224HTask, strLines, "", DAQmx_Val_ChanPerLine) End Sub
le 06-12-2009 12:02 PM
Bonjour,
Je crois que vous faites erreur lorsque vous voulez écrire ET lire sur une ligne d'entrées/sorties numériques.
En effet ce genre de ligne peut être soit en entrée, soit en sortie. Vous ne pouvez donc pas faire l'un puis l'autre. Si le canal 0 est configuré en sortie, vous pourrez y mettre un 1 ou un 0 mais vous ne pourrez pas le lire (il sort la donnée, il ne la rentre pas).
Inversement pour la lecture, si vous mettez le canal en lecture, il lira son niveau logique, rien de plus.
Je ne vois pas trop l'intérêt de vérifier si la sortie a le niveau souhaité. Dans le cas où la carte ne peut pas appliquer ce qui est demandée, elle retourne une erreur. Si tout se déroule bien, la sortie aura ce que vous avez demandé.
Si vraiment vous devez vérifier que les sorties sont comme vous le souhaitez, il serait plus judicieux d'utiliser un deuxième port (exclusivement en entrées) qui sera relié à votre port de sorties. Vous appliquez les valeurs des sorties puis vous lisez toutes les entrées pour vérifier. Ce n'est pas pour me faire insistant mais si vous créez correctement votre tâche pour que ce soit des sorties numériques, il n'y aura pas de soucis donc pas obligé de vérifier.
le 06-15-2009 05:01 AM
Merci de ta réponse Julien.
Mais je souhaite surtout vérifier parce que je ne suis pas sur de bien maitriser tous les arguments de ma fonction.
Par exemple lorsque j'écris je vx ecrire line0 = 1 line1 = 0 line2 = 0. J'ai une erreur: "attempted writting digital data that is not supported". voici ce que je fais:
Mes déclarations:
Dim th6224HTask As Long
Private blnAutoStart As Boolean 'Si vrai la tache démarre automatiquement
Private bytWriteArray(0 To 7) As Byte
Private lngSamplePerChWritten As Long
'Crée la tache 'Si status est < 0, 1 message d'erreur est retourné DAQmxErrChk DAQmxCreateTask("", th6224HTask) 'Crée les voies de sorties numériques DAQmxErrChk DAQmxCreateDOChan(th6224HTask, "Dev4/port0/line0", "", DAQmx_Val_ChanPerLine) DAQmxErrChk DAQmxCreateDOChan(th6224HTask, "Dev4/port0/line1", "", DAQmx_Val_ChanPerLine) DAQmxErrChk DAQmxCreateDOChan(th6224HTask, "Dev4/port0/line2", "", DAQmx_Val_ChanPerLine) bytWriteArray(0) = 1 bytWriteArray(1) = 0 bytWriteArray(2) = 0 'Ecrit sur les ports de sortie
DAQmxErrChk DAQmxWriteDigitalLines(th6224HTask, 1, blnAutoStart, 15#, DAQmx_Val_GroupByChannel, bytWriteArray(0), lngSamplePerChWritten, ByVal 0&) DAQmxErrChk DAQmxWriteDigitalLines(th6224HTask, 1, blnAutoStart, 15#, DAQmx_Val_GroupByChannel, bytWriteArray(1), lngSamplePerChWritten, ByVal 0&)
'Erreur ici: attempted writting digital data that is not supported DAQmxErrChk DAQmxWriteDigitalLines(th6224HTask, 1, blnAutoStart, 15#, DAQmx_Val_GroupByChannel, bytWriteArray(2), lngSamplePerChWritten, ByVal 0&) 'Stoppe les taches DAQmxErrChk DAQmxStopTask(th6224HTask) 'Supprime les taches DAQmxErrChk DAQmxClearTask(th6224HTask)
Est ce que j'utilise correctement mon tableau? J'ai un gros doute puisque le tableau est de type "Byte"
Les argument sont ils corrects?
le 06-15-2009 07:58 AM
Bonjour,
Je ne programme pas du tout en VB6 donc à première vue votre code me semble correct mais rien de certain.
Voilà un lien qui pourrait vous être très utile.
le 06-16-2009 04:42 AM
Ok merci qd meme.
J'ai remarqué que lorsque j'augmentais la taille du tableau et dc qu' a priori je déclare bien plus de valeur que nécessaire l'erreur : "-200562: Attempted writing digital data that is not supported" disparait! Quelqu'un a t il une idée? est ce que le fait de simuler une carte d'acquisition pr l'instant peut entrainer des comportements etranges?
le 06-18-2009 04:32 AM
le 06-18-2009 03:50 PM
Oui, c'est bon j'ai recu la carte, je px dc faire des tests physiques, ça m'a l'air de fonctionner correctement. Ca prend forme.