Pilotage de la carte Velleman VM167
Pilotage de la carte Velleman VM167
Bonjour,
J'ai besoin d'aide. J'ai acheté la carte d'interface Velleman VM167. Elle se connecte sur port USB, et se commande par l'intermédiaire d'une dll (VM167DLL). Celle-ci est installée dans le répertoire suivant : C:\Program Files (x86)\Velleman\VM167 SDK\DLL\VM167.dll.
Je souhaite la programmer avec Purebasic dont je suis un inconditionnel.
J'arrive à piloter cette carte en VBA Excel grâce la déclaration suivante (la DLL comporte 21 fonctions), fourni en exemple :
Option Explicit
Private Declare Function OpenDevices Lib "vm167.dll" () As Long
Private Declare Sub CloseDevices Lib "vm167.dll" ()
Private Declare Sub InOutMode Lib "vm167.dll" (ByVal CardAddress As Long, ByVal HighNibble As Long, ByVal LowNibble As Long)
Private Declare Function ReadAnalogChannel Lib "vm167.dll" (ByVal CardAddress As Long, ByVal Channel As Long) As Long
Private Declare Sub ReadAllAnalog Lib "vm167.dll" (ByVal CardAddress As Long, ByRef Buffer As Long)
Private Declare Sub OutputAllDigital Lib "vm167.dll" (ByVal CardAddress As Long, ByVal Data As Long)
Private Declare Sub ClearDigitalChannel Lib "vm167.dll" (ByVal CardAddress As Long, ByVal Channel As Long)
Private Declare Sub ClearAllDigital Lib "vm167.dll" (ByVal CardAddress As Long)
Private Declare Sub SetDigitalChannel Lib "vm167.dll" (ByVal CardAddress As Long, ByVal Channel As Long)
Private Declare Sub SetAllDigital Lib "vm167.dll" (ByVal CardAddress As Long)
Private Declare Function ReadDigitalChannel Lib "vm167.dll" (ByVal CardAddress As Long, ByVal Channel As Long) As Boolean
Private Declare Function ReadAllDigital Lib "vm167.dll" (ByVal CardAddress As Long) As Long
Private Declare Function ReadCounter Lib "vm167.dll" (ByVal CardAddress As Long) As Long
Private Declare Sub ResetCounter Lib "vm167.dll" (ByVal CardAddress As Long)
Private Declare Sub SetPWM Lib "vm167.dll" (ByVal CardAddress As Long, ByVal Channel As Long, ByVal Data As Long, ByVal Freq As Long)
Private Declare Sub OutputAllPWM Lib "vm167.dll" (ByVal CardAddress As Long, ByVal Data1 As Long, ByVal Data2 As Long)
Private Declare Function VersionDLL Lib "vm167.dll" () As Long
Private Declare Function VersionFirmware Lib "vm167.dll" (ByVal CardAddress As Long) As Long
Private Declare Function Connected Lib "vm167.dll" () As Long
Private Declare Sub ReadBackPWMOut Lib "vm167.dll" (ByVal CardAddress As Long, ByRef Buffer As Long)
Private Declare Function ReadBackInOutMode Lib "vm167.dll" (ByVal CardAddress As Long) As Long
J'ai tenté d'activer la librairie dans PureBasic avec le programme suivant :
If OpenLibrary(2, "C:\Program Files (x86)\Velleman\VM167 SDK\DLL\VM167.dll")
Debug "DLL2 ouverte"
Else
Debug "Erreur DLL2"
EndIf
Est-ce la bonne méthode? Faut-il comme en VBA déclarer chaque fonction? Faut-il placer la DLL dans un autre répertoire?
Merci de bien vouloir m'apporter une aide.
Cordialement.
Jean-Pierre MONROUZEAU
J'ai besoin d'aide. J'ai acheté la carte d'interface Velleman VM167. Elle se connecte sur port USB, et se commande par l'intermédiaire d'une dll (VM167DLL). Celle-ci est installée dans le répertoire suivant : C:\Program Files (x86)\Velleman\VM167 SDK\DLL\VM167.dll.
Je souhaite la programmer avec Purebasic dont je suis un inconditionnel.
J'arrive à piloter cette carte en VBA Excel grâce la déclaration suivante (la DLL comporte 21 fonctions), fourni en exemple :
Option Explicit
Private Declare Function OpenDevices Lib "vm167.dll" () As Long
Private Declare Sub CloseDevices Lib "vm167.dll" ()
Private Declare Sub InOutMode Lib "vm167.dll" (ByVal CardAddress As Long, ByVal HighNibble As Long, ByVal LowNibble As Long)
Private Declare Function ReadAnalogChannel Lib "vm167.dll" (ByVal CardAddress As Long, ByVal Channel As Long) As Long
Private Declare Sub ReadAllAnalog Lib "vm167.dll" (ByVal CardAddress As Long, ByRef Buffer As Long)
Private Declare Sub OutputAllDigital Lib "vm167.dll" (ByVal CardAddress As Long, ByVal Data As Long)
Private Declare Sub ClearDigitalChannel Lib "vm167.dll" (ByVal CardAddress As Long, ByVal Channel As Long)
Private Declare Sub ClearAllDigital Lib "vm167.dll" (ByVal CardAddress As Long)
Private Declare Sub SetDigitalChannel Lib "vm167.dll" (ByVal CardAddress As Long, ByVal Channel As Long)
Private Declare Sub SetAllDigital Lib "vm167.dll" (ByVal CardAddress As Long)
Private Declare Function ReadDigitalChannel Lib "vm167.dll" (ByVal CardAddress As Long, ByVal Channel As Long) As Boolean
Private Declare Function ReadAllDigital Lib "vm167.dll" (ByVal CardAddress As Long) As Long
Private Declare Function ReadCounter Lib "vm167.dll" (ByVal CardAddress As Long) As Long
Private Declare Sub ResetCounter Lib "vm167.dll" (ByVal CardAddress As Long)
Private Declare Sub SetPWM Lib "vm167.dll" (ByVal CardAddress As Long, ByVal Channel As Long, ByVal Data As Long, ByVal Freq As Long)
Private Declare Sub OutputAllPWM Lib "vm167.dll" (ByVal CardAddress As Long, ByVal Data1 As Long, ByVal Data2 As Long)
Private Declare Function VersionDLL Lib "vm167.dll" () As Long
Private Declare Function VersionFirmware Lib "vm167.dll" (ByVal CardAddress As Long) As Long
Private Declare Function Connected Lib "vm167.dll" () As Long
Private Declare Sub ReadBackPWMOut Lib "vm167.dll" (ByVal CardAddress As Long, ByRef Buffer As Long)
Private Declare Function ReadBackInOutMode Lib "vm167.dll" (ByVal CardAddress As Long) As Long
J'ai tenté d'activer la librairie dans PureBasic avec le programme suivant :
If OpenLibrary(2, "C:\Program Files (x86)\Velleman\VM167 SDK\DLL\VM167.dll")
Debug "DLL2 ouverte"
Else
Debug "Erreur DLL2"
EndIf
Est-ce la bonne méthode? Faut-il comme en VBA déclarer chaque fonction? Faut-il placer la DLL dans un autre répertoire?
Merci de bien vouloir m'apporter une aide.
Cordialement.
Jean-Pierre MONROUZEAU
Re: Pilotage de la carte Velleman VM167
Je n'y connais strictement rien en carte d'interface, ton petit programme me parait bien, mais je ne comprend pas d'où vient ta constante 2 après OpenLibrary(
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Un homme doit être poli, mais il doit aussi être libre !
- falsam
- Messages : 7244
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Pilotage de la carte Velleman VM167
Avec ce code tu vas pouvoir lister toutes les fonctions disponibles de ta dll
resultat
https://www.velleman.eu/downloads/0/inf ... manual.pdf
Code : Tout sélectionner
If OpenLibrary(0, "VM167.dll")
ExamineLibraryFunctions(0)
While NextLibraryFunction()
Debug LibraryFunctionName()
Wend
CloseLibrary(0)
EndIf
Le descriptif de chacune des fonctions est disponible sur ce lienReadBackInOutMode
ReadBackPWMOut
Connected
ResetCounter
VersionDLL
VersionFirmware
ReadCounter
InOutMode
ReadAllDigital
ReadDigitalChannel
SetAllDigital
SetDigitalChannel
ClearAllDigital
ClearDigitalChannel
OutputAllDigital
OutputAllPWM
SetPWM
ReadAllAnalog
ReadAnalogChannel
CloseDevices
OpenDevices
https://www.velleman.eu/downloads/0/inf ... manual.pdf
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
- falsam
- Messages : 7244
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Pilotage de la carte Velleman VM167
Deux méthodes pour accéder à tes fonctions.
Exemple avec le numero de version de la dllet maintenant avec les prototypesRegarde l'aide consacrée à GetFunction() et à la façon d'utiliser les prototypes.
Exemple avec le numero de version de la dll
Code : Tout sélectionner
If OpenLibrary(0, "VM167.dll")
; Déclaration du ou des functions
*VersionDLL = GetFunction(0, "VersionDLL")
; Test
version = CallFunctionFast(*VersionDLL)
Debug version
CloseLibrary(0)
EndIf
Code : Tout sélectionner
If OpenLibrary(0, "VM167.dll")
; Déclaration du ou des functions
Prototype.i VM_VersionDLL()
VersionDLL.VM_VersionDLL = GetFunction(0, "VersionDLL")
;Resultat
Debug VersionDLL()
CloseLibrary(0)
EndIf
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Re: Pilotage de la carte Velleman VM167
Je suggère timidement (le mieux aurait été de tester concrètement, ce qui n'est pas mon cas) de faire d'abord sans les prototypes.
Ça permrt de se familiariser avec les différents comportements des arguments :
Function(Argument1, Argument2, etc...)
Leur taille (8, 16, 32 ou 64 bits) et leur manière d'être traité doit être comprise parfaitement.
Sont-il des arguments uniquement lus dans la fonction (procédure) ?
Sont-il des arguments lus et modifiés par la fonction ?
Les questions assez nombreuses au départ, une fois répondues permettent la simplicité de compréhension au final.
Ma suggestion peut être inexacte. Et je laisse les habitués des prototypes argumenter...
Ça permrt de se familiariser avec les différents comportements des arguments :
Function(Argument1, Argument2, etc...)
Leur taille (8, 16, 32 ou 64 bits) et leur manière d'être traité doit être comprise parfaitement.
Sont-il des arguments uniquement lus dans la fonction (procédure) ?
Sont-il des arguments lus et modifiés par la fonction ?
Les questions assez nombreuses au départ, une fois répondues permettent la simplicité de compréhension au final.
Ma suggestion peut être inexacte. Et je laisse les habitués des prototypes argumenter...
Re: Pilotage de la carte Velleman VM167
Merci à tous pour votre aide.
Jai testé les programmes de Falsam. Malheureusement aucun des codes fonctionnent. La "Library" n'est pas ouverte. La boite Debug ne s'ouvre pas. Les fonctions ne sont pas listées.
Plusieurs hypothèses :
* la dll n'est pas installée au bon endroit.
* le chemin d'accès n'est pas accepté par PureBasic.
* la dll n'est pas compatible avec PureBasic (dll 32 bits et Windows 10 en 64bits).
J'ai installé la dll dans le dossier de PureBasic. Pas de résultat positif. Je suis à cours d'idée.
Avez-vous des suggestions à faire?
Falsam, je suppose que tu as téléchargé la dll de Velleman, et la lise des fonctions est apparue dans Debug avec ton 3ième code.
Jai testé les programmes de Falsam. Malheureusement aucun des codes fonctionnent. La "Library" n'est pas ouverte. La boite Debug ne s'ouvre pas. Les fonctions ne sont pas listées.
Plusieurs hypothèses :
* la dll n'est pas installée au bon endroit.
* le chemin d'accès n'est pas accepté par PureBasic.
* la dll n'est pas compatible avec PureBasic (dll 32 bits et Windows 10 en 64bits).
J'ai installé la dll dans le dossier de PureBasic. Pas de résultat positif. Je suis à cours d'idée.
Avez-vous des suggestions à faire?
Falsam, je suppose que tu as téléchargé la dll de Velleman, et la lise des fonctions est apparue dans Debug avec ton 3ième code.
Re: Pilotage de la carte Velleman VM167
Je viens de charger la DLL et utiliser le code de Falsam (auquel j'ai ajouté une clause Else pour avoir un affichage en cas d'erreur)
et ça fonctionne.
Mais
Windows 10 x64 avec la version 32 bits de PB
(Oui, on peut avoir les deux versions sur le même PC (64 bits) et même utiliser l'IDE 64 pour compiler du 64 et/ou du 32 bits. Compilateur > Option du Compilateur > PB xxx Windows x86)
Avec PB 64 bits cela ne fonctionne pas
Si tu as une version de Windows x64, télécharge et installe les deux versions de PB
La version x64 ira automatiquement dans Program File et la version x86 (32 bits) dans Program Files (x86)
Sans chemin complet, un programme cherche ses dépendances dans le répertoire en cours, puis dans celui défini dans les variables environnement puis dans les répertoires définis dans le PATH.
et ça fonctionne.
Mais
Windows 10 x64 avec la version 32 bits de PB
(Oui, on peut avoir les deux versions sur le même PC (64 bits) et même utiliser l'IDE 64 pour compiler du 64 et/ou du 32 bits. Compilateur > Option du Compilateur > PB xxx Windows x86)
Avec PB 64 bits cela ne fonctionne pas
Code : Tout sélectionner
If OpenLibrary(0, "C:\Program Files (x86)\Velleman\VM167 SDK\Demo\VM167.dll") ; "VM167.dll")
ExamineLibraryFunctions(0)
While NextLibraryFunction()
Debug LibraryFunctionName()
Wend
CloseLibrary(0)
Else
Debug "Ne peut pas trouver/ouvrir la DLL"
EndIf
Code : Tout sélectionner
ReadBackInOutMode
ReadBackPWMOut
Connected
ResetCounter
VersionDLL
VersionFirmware
ReadCounter
InOutMode
ReadAllDigital
ReadDigitalChannel
SetAllDigital
SetDigitalChannel
ClearAllDigital
ClearDigitalChannel
OutputAllDigital
OutputAllPWM
SetPWM
ReadAllAnalog
ReadAnalogChannel
CloseDevices
OpenDevices
La version x64 ira automatiquement dans Program File et la version x86 (32 bits) dans Program Files (x86)
Sans chemin complet, un programme cherche ses dépendances dans le répertoire en cours, puis dans celui défini dans les variables environnement puis dans les répertoires définis dans le PATH.
- falsam
- Messages : 7244
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Pilotage de la carte Velleman VM167
J'aurais du précisé que la dll étant 32 bits, j'ai utilisé la version 32 bits de PureBasic et que ai installé la dll dans le même dossier que le code pour ce test.
Mon cher Ollivier, comme tu as pu le lire dans mes commentaires, j'ai pris le temps de downloader cette DLL et de faire deux propositions d'utilisation avec et sans prototypeOllivier a écrit :Je suggère timidement (le mieux aurait été de tester concrètement, ce qui n'est pas mon cas) de faire d'abord sans les prototypes.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Re: Pilotage de la carte Velleman VM167
Merci à tous pour votre aide.
Je chargerai PB 32 bits et testerai cet après midi.
Je reviendrai vers vous pour le résultat.
Je me doutais de cette incompatibilité.
A bientôt
Je chargerai PB 32 bits et testerai cet après midi.
Je reviendrai vers vous pour le résultat.
Je me doutais de cette incompatibilité.
A bientôt
Re: Pilotage de la carte Velleman VM167
Merci Falsam.
Chargement de PureBasic 32 bits et placement de la dll dans le même dossier que le code.
Tous tes programmes fonctionnent, le mien aussi.
Je teste maintenant les fonctions.
A bientôt.
Chargement de PureBasic 32 bits et placement de la dll dans le même dossier que le code.
Tous tes programmes fonctionnent, le mien aussi.
Je teste maintenant les fonctions.
A bientôt.
Re: Pilotage de la carte Velleman VM167
Encore merci.
Grace à votre aide j'ai réussi à atteindre mon objectif. j'ai encore un peu souffert pour la mise en œuvre des fonctions.
Par contre, Falsam pourrait tu m'expliquer l'avantage des prototypes?
Voici un exemple d'un programme réalisé grâce à votre aide.
If OpenLibrary(0, "VM167.dll")
; Déclaration du ou des functions
*VersionDLL = GetFunction(0, "VersionDLL")
*OpenDevices = GetFunction(0, "OpenDevices")
*InOutMode = GetFunction(0, "InOutMode")
*SetAllDigital = GetFunction(0,"SetAllDigital")
*ClearAllDigital = GetFunction(0,"ClearAllDigital")
; Test
version = CallFunctionFast(*VersionDLL)
Debug version
Card = CallFunctionFast(*OpenDevices)
Debug Card
Delay (50)
ModeEntreeSortie = CallFunctionFast(*InOutMode ,1,0,0)
For i=1 To 10
Debug i
Delay(50)
ActiverToutesSorties = CallFunctionFast(*SetAllDigital,1)
Delay(50)
ArreterToutesSorties = CallFunctionFast(*ClearAllDigital,1)
Next
Debug "FIN"
CloseLibrary(0)
EndIf
Grace à votre aide j'ai réussi à atteindre mon objectif. j'ai encore un peu souffert pour la mise en œuvre des fonctions.
Par contre, Falsam pourrait tu m'expliquer l'avantage des prototypes?
Voici un exemple d'un programme réalisé grâce à votre aide.
If OpenLibrary(0, "VM167.dll")
; Déclaration du ou des functions
*VersionDLL = GetFunction(0, "VersionDLL")
*OpenDevices = GetFunction(0, "OpenDevices")
*InOutMode = GetFunction(0, "InOutMode")
*SetAllDigital = GetFunction(0,"SetAllDigital")
*ClearAllDigital = GetFunction(0,"ClearAllDigital")
; Test
version = CallFunctionFast(*VersionDLL)
Debug version
Card = CallFunctionFast(*OpenDevices)
Debug Card
Delay (50)
ModeEntreeSortie = CallFunctionFast(*InOutMode ,1,0,0)
For i=1 To 10
Debug i
Delay(50)
ActiverToutesSorties = CallFunctionFast(*SetAllDigital,1)
Delay(50)
ArreterToutesSorties = CallFunctionFast(*ClearAllDigital,1)
Next
Debug "FIN"
CloseLibrary(0)
EndIf
Re: Pilotage de la carte Velleman VM167
Met ton programme entre des balises CODE
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Re: Pilotage de la carte Velleman VM167
Je suis impressionné : son code sans balise est plus lisible que son code entre balises.
Les prototypes sont une manière de travailler plus simplement l'appel des fonctions : on s'épargne de réécrire 'CallFunctionFast'. Mais j'ai un peu de mal avec cette logique : j'ai l'impression de perdre le contrôle d'ouverture/fermeture de la librairie. Après chacun y trouve ses préférences.
Falsam a mis (et me l'a rappelé très promptement) les deux versions pour une fonction sans argument. Les arguments se rajoutent selon la syntaxe indiquée dans la page des prototypes de la doc si tu souhaites les utiliser.
Pour les balises de code source, on met le code entre une balise de départ et une balise de fin.
Balise de départ de code :
1) ouvrir le crochet
2) écrire "code" sans les guillemets
3) fermer le crochet
Balise de fin de code :
1) ouvrir le crochet
2) écrire un slash de droitier
3) écrire "code" (toujours sans les guillemets)
4) fermer le crochet
Ça donne à peu près ça :
Les prototypes sont une manière de travailler plus simplement l'appel des fonctions : on s'épargne de réécrire 'CallFunctionFast'. Mais j'ai un peu de mal avec cette logique : j'ai l'impression de perdre le contrôle d'ouverture/fermeture de la librairie. Après chacun y trouve ses préférences.
Falsam a mis (et me l'a rappelé très promptement) les deux versions pour une fonction sans argument. Les arguments se rajoutent selon la syntaxe indiquée dans la page des prototypes de la doc si tu souhaites les utiliser.
Pour les balises de code source, on met le code entre une balise de départ et une balise de fin.
Balise de départ de code :
1) ouvrir le crochet
2) écrire "code" sans les guillemets
3) fermer le crochet
Balise de fin de code :
1) ouvrir le crochet
2) écrire un slash de droitier
3) écrire "code" (toujours sans les guillemets)
4) fermer le crochet
Ça donne à peu près ça :
Code : Tout sélectionner
;****************************************************************************
If OpenLibrary(0, "VM167.dll")
; Déclaration du ou des functions
*VersionDLL = GetFunction(0, "VersionDLL")
*OpenDevices = GetFunction(0, "OpenDevices")
*InOutMode = GetFunction(0, "InOutMode")
*SetAllDigital = GetFunction(0,"SetAllDigital")
*ClearAllDigital = GetFunction(0,"ClearAllDigital")
; Test
version = CallFunctionFast(*VersionDLL)
Debug version
Card = CallFunctionFast(*OpenDevices)
Debug Card
Delay (50)
ModeEntreeSortie = CallFunctionFast(*InOutMode ,1,0,0)
For i=1 To 10
Debug i
Delay(50)
ActiverToutesSorties = CallFunctionFast(*SetAllDigital,1)
Delay(50)
ArreterToutesSorties = CallFunctionFast(*ClearAllDigital,1)
Next
Debug "FIN"
CloseLibrary(0)
EndIf
Re: Pilotage de la carte Velleman VM167
Bien enregistré pour les conseils concernant la mise en forme des codes.
Pour les prototypes, je vais faire ma propre expérience en tentant de les mettre en œuvre.
Je reviendrai vous donner mon avis.
Pour les prototypes, je vais faire ma propre expérience en tentant de les mettre en œuvre.
Je reviendrai vous donner mon avis.