Page 1 sur 1

Pilotage de la carte Velleman VM167

Publié : lun. 29/avr./2019 14:14
par PureDev
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

Re: Pilotage de la carte Velleman VM167

Publié : lun. 29/avr./2019 14:42
par Micoute
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(

Re: Pilotage de la carte Velleman VM167

Publié : lun. 29/avr./2019 15:51
par falsam
Avec ce code tu vas pouvoir lister toutes les fonctions disponibles de ta dll

Code : Tout sélectionner

If OpenLibrary(0, "VM167.dll")
  ExamineLibraryFunctions(0)
  While NextLibraryFunction()
    Debug LibraryFunctionName()
  Wend  
  CloseLibrary(0)
EndIf
resultat
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

Re: Pilotage de la carte Velleman VM167

Publié : lun. 29/avr./2019 17:09
par falsam
Deux méthodes pour accéder à tes fonctions.

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
et maintenant avec les prototypes

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
Regarde l'aide consacrée à GetFunction() et à la façon d'utiliser les prototypes.

Re: Pilotage de la carte Velleman VM167

Publié : mar. 30/avr./2019 5:57
par Ollivier
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...

Re: Pilotage de la carte Velleman VM167

Publié : mar. 30/avr./2019 7:08
par PureDev
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.

Re: Pilotage de la carte Velleman VM167

Publié : mar. 30/avr./2019 8:24
par Marc56
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 : 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
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.

:wink:

Re: Pilotage de la carte Velleman VM167

Publié : mar. 30/avr./2019 8:40
par falsam
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 :wink:

Re: Pilotage de la carte Velleman VM167

Publié : mar. 30/avr./2019 9:13
par PureDev
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

Re: Pilotage de la carte Velleman VM167

Publié : mar. 30/avr./2019 10:40
par PureDev
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.

Re: Pilotage de la carte Velleman VM167

Publié : mar. 30/avr./2019 20:01
par PureDev
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

Re: Pilotage de la carte Velleman VM167

Publié : mar. 30/avr./2019 20:48
par SPH
Met ton programme entre des balises CODE :idea:

Re: Pilotage de la carte Velleman VM167

Publié : mar. 30/avr./2019 21:15
par Ollivier
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 : 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

Publié : mer. 01/mai/2019 8:15
par PureDev
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.