PureBasic

Forums PureBasic
Nous sommes le Lun 23/Sep/2019 12:19

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 14 messages ] 
Auteur Message
 Sujet du message: Pilotage de la carte Velleman VM167
MessagePosté: Lun 29/Avr/2019 14:14 
Hors ligne

Inscription: Sam 25/Jan/2014 9:42
Messages: 31
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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Pilotage de la carte Velleman VM167
MessagePosté: Lun 29/Avr/2019 14:42 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 02/Oct/2011 16:17
Messages: 2174
Localisation: 50200 Coutances
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 GT 640 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.62, 5.70 LTS
Un homme doit être poli, mais il doit aussi être libre !


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Pilotage de la carte Velleman VM167
MessagePosté: Lun 29/Avr/2019 15:51 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6849
Localisation: IDF (Yvelines)
Avec ce code tu vas pouvoir lister toutes les fonctions disponibles de ta dll
Code:
If OpenLibrary(0, "VM167.dll")
  ExamineLibraryFunctions(0)
  While NextLibraryFunction()
    Debug LibraryFunctionName()
  Wend 
  CloseLibrary(0)
EndIf
resultat
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

_________________

➽ Config PureBasic : i3, RAM 4Go, NVidia (1024 Mo), Windows 10 - PB 5.70 LTS
➽ Je papote aussi sur http://purebasic.chat

➽ Sites personnels http://falsam.com & EasySprite.js

➽ Je ne réponds pas aux MP techniques


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Pilotage de la carte Velleman VM167
MessagePosté: Lun 29/Avr/2019 17:09 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6849
Localisation: IDF (Yvelines)
Deux méthodes pour accéder à tes fonctions.

Exemple avec le numero de version de la dll
Code:
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:
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.

_________________

➽ Config PureBasic : i3, RAM 4Go, NVidia (1024 Mo), Windows 10 - PB 5.70 LTS
➽ Je papote aussi sur http://purebasic.chat

➽ Sites personnels http://falsam.com & EasySprite.js

➽ Je ne réponds pas aux MP techniques


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Pilotage de la carte Velleman VM167
MessagePosté: Mar 30/Avr/2019 5:57 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3492
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...


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Pilotage de la carte Velleman VM167
MessagePosté: Mar 30/Avr/2019 7:08 
Hors ligne

Inscription: Sam 25/Jan/2014 9:42
Messages: 31
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.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Pilotage de la carte Velleman VM167
MessagePosté: Mar 30/Avr/2019 8:24 
Hors ligne

Inscription: Sam 08/Fév/2014 15:19
Messages: 1595
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.

:wink:

_________________
Windows 10 Famille x64 + Linux (Slackware, Debian sur Oracle VirtualBox 6.0)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Pilotage de la carte Velleman VM167
MessagePosté: Mar 30/Avr/2019 8:40 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6849
Localisation: IDF (Yvelines)
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:

_________________

➽ Config PureBasic : i3, RAM 4Go, NVidia (1024 Mo), Windows 10 - PB 5.70 LTS
➽ Je papote aussi sur http://purebasic.chat

➽ Sites personnels http://falsam.com & EasySprite.js

➽ Je ne réponds pas aux MP techniques


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Pilotage de la carte Velleman VM167
MessagePosté: Mar 30/Avr/2019 9:13 
Hors ligne

Inscription: Sam 25/Jan/2014 9:42
Messages: 31
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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Pilotage de la carte Velleman VM167
MessagePosté: Mar 30/Avr/2019 10:40 
Hors ligne

Inscription: Sam 25/Jan/2014 9:42
Messages: 31
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.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Pilotage de la carte Velleman VM167
MessagePosté: Mar 30/Avr/2019 20:01 
Hors ligne

Inscription: Sam 25/Jan/2014 9:42
Messages: 31
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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Pilotage de la carte Velleman VM167
MessagePosté: Mar 30/Avr/2019 20:48 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 09/Nov/2005 9:53
Messages: 4067
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 ////
Portable LENOVO ideapad 110-17ACL 64 bits
Version de PB : 5.70LTS - 32 bits


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Pilotage de la carte Velleman VM167
MessagePosté: Mar 30/Avr/2019 21:15 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3492
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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Pilotage de la carte Velleman VM167
MessagePosté: Mer 01/Mai/2019 8:15 
Hors ligne

Inscription: Sam 25/Jan/2014 9:42
Messages: 31
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.


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 14 messages ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Google [Bot] et 1 invité


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  
cron

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye