Pilotage de la carte Velleman VM167

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
PureDev
Messages : 31
Inscription : sam. 25/janv./2014 9:42

Pilotage de la carte Velleman VM167

Message 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
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Pilotage de la carte Velleman VM167

Message 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(
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 !
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Pilotage de la carte Velleman VM167

Message 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
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%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Pilotage de la carte Velleman VM167

Message 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.
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%
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Pilotage de la carte Velleman VM167

Message 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...
PureDev
Messages : 31
Inscription : sam. 25/janv./2014 9:42

Re: Pilotage de la carte Velleman VM167

Message 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.
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: Pilotage de la carte Velleman VM167

Message 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:
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Pilotage de la carte Velleman VM167

Message 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:
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%
PureDev
Messages : 31
Inscription : sam. 25/janv./2014 9:42

Re: Pilotage de la carte Velleman VM167

Message 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
PureDev
Messages : 31
Inscription : sam. 25/janv./2014 9:42

Re: Pilotage de la carte Velleman VM167

Message 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.
PureDev
Messages : 31
Inscription : sam. 25/janv./2014 9:42

Re: Pilotage de la carte Velleman VM167

Message 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
Avatar de l’utilisateur
SPH
Messages : 4722
Inscription : mer. 09/nov./2005 9:53

Re: Pilotage de la carte Velleman VM167

Message par SPH »

Met ton programme entre des balises CODE :idea:
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
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Pilotage de la carte Velleman VM167

Message 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
PureDev
Messages : 31
Inscription : sam. 25/janv./2014 9:42

Re: Pilotage de la carte Velleman VM167

Message 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.
Répondre