Discussions au sujet des autres produits NI

annuler
Affichage des résultats de 
Rechercher plutôt 
Vouliez-vous dire : 

Ecrire et vérifier ecriture sortie digital [NIDAQmx/VB6]

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

 

0 Compliments
Message 1 sur 7
3 903 Visites

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.

 

Cordialement,

Julien V.

[FIRST]

[LabVIEW Programming]


[FIRST]

0 Compliments
Message 2 sur 7
3 900 Visites

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?

 

0 Compliments
Message 3 sur 7
3 880 Visites

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.

Cordialement,

Julien V.

[FIRST]

[LabVIEW Programming]


[FIRST]

0 Compliments
Message 4 sur 7
3 871 Visites

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?

0 Compliments
Message 5 sur 7
3 859 Visites

Bonjour,

 

Avez-vous essayé de faire exactement ce qui est fourni dans l'exemple du lien ?

Si celui-ci fonctionne vous pourrez l'utiliser comme base pour développer votre programme.

Cordialement,

Julien V.

[FIRST]

[LabVIEW Programming]


[FIRST]

0 Compliments
Message 6 sur 7
3 838 Visites

 

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.

0 Compliments
Message 7 sur 7
3 832 Visites