PureBasic https://www.purebasic.fr/french/ |
|
Pilotage de la carte Velleman VM167 https://www.purebasic.fr/french/viewtopic.php?f=1&t=17668 |
Page 1 sur 1 |
Auteur: | PureDev [ Lun 29/Avr/2019 14:14 ] |
Sujet du message: | 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 |
Auteur: | Micoute [ Lun 29/Avr/2019 14:42 ] |
Sujet du message: | 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( |
Auteur: | falsam [ Lun 29/Avr/2019 15:51 ] |
Sujet du message: | Re: Pilotage de la carte Velleman VM167 |
Avec ce code tu vas pouvoir lister toutes les fonctions disponibles de ta dll Code: If OpenLibrary(0, "VM167.dll") resultatExamineLibraryFunctions(0) While NextLibraryFunction() Debug LibraryFunctionName() Wend CloseLibrary(0) EndIf Citation: ReadBackInOutMode ReadBackPWMOut Connected ResetCounter VersionDLL VersionFirmware ReadCounter InOutMode ReadAllDigital ReadDigitalChannel SetAllDigital SetDigitalChannel ClearAllDigital ClearDigitalChannel OutputAllDigital OutputAllPWM SetPWM ReadAllAnalog ReadAnalogChannel CloseDevices OpenDevices Le descriptif de chacune des fonctions est disponible sur ce lien https://www.velleman.eu/downloads/0/inf ... manual.pdf |
Auteur: | falsam [ Lun 29/Avr/2019 17:09 ] |
Sujet du message: | Re: Pilotage de la carte Velleman VM167 |
Deux méthodes pour accéder à tes fonctions. Exemple avec le numero de version de la dll Code: If OpenLibrary(0, "VM167.dll") et maintenant avec les prototypes; Déclaration du ou des functions *VersionDLL = GetFunction(0, "VersionDLL") ; Test version = CallFunctionFast(*VersionDLL) Debug version CloseLibrary(0) EndIf Code: If OpenLibrary(0, "VM167.dll") Regarde l'aide consacrée à GetFunction() et à la façon d'utiliser les prototypes.
; Déclaration du ou des functions Prototype.i VM_VersionDLL() VersionDLL.VM_VersionDLL = GetFunction(0, "VersionDLL") ;Resultat Debug VersionDLL() CloseLibrary(0) EndIf |
Auteur: | Ollivier [ Mar 30/Avr/2019 5:57 ] |
Sujet du message: | 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... |
Auteur: | PureDev [ Mar 30/Avr/2019 7:08 ] |
Sujet du message: | 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. |
Auteur: | Marc56 [ Mar 30/Avr/2019 8:24 ] |
Sujet du message: | 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 Code: 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: ReadBackInOutMode ReadBackPWMOut Connected ResetCounter VersionDLL VersionFirmware ReadCounter InOutMode ReadAllDigital ReadDigitalChannel SetAllDigital SetDigitalChannel ClearAllDigital ClearDigitalChannel OutputAllDigital OutputAllPWM SetPWM ReadAllAnalog ReadAnalogChannel CloseDevices OpenDevices 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. ![]() |
Auteur: | falsam [ Mar 30/Avr/2019 8:40 ] |
Sujet du message: | 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. Ollivier 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. 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 prototype ![]() |
Auteur: | PureDev [ Mar 30/Avr/2019 9:13 ] |
Sujet du message: | 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 |
Auteur: | PureDev [ Mar 30/Avr/2019 10:40 ] |
Sujet du message: | 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. |
Auteur: | PureDev [ Mar 30/Avr/2019 20:01 ] |
Sujet du message: | 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 |
Auteur: | SPH [ Mar 30/Avr/2019 20:48 ] |
Sujet du message: | Re: Pilotage de la carte Velleman VM167 |
Met ton programme entre des balises CODE ![]() |
Auteur: | Ollivier [ Mar 30/Avr/2019 21:15 ] |
Sujet du message: | 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 : Code: ;****************************************************************************
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 |
Auteur: | PureDev [ Mer 01/Mai/2019 8:15 ] |
Sujet du message: | 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. |
Page 1 sur 1 | Heures au format UTC + 1 heure |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |