PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → kit velleman
kit velleman
Débuté par Raymond, 23 sep. 2017 14:35 - 9 réponses
Membre enregistré
9 messages
Posté le 23 septembre 2017 - 14:35
Bonjour,
J'ai assemblé le kit K8097 (commande de 4 moteurs pas à pas), quelqu'un a t'il déjà programmé la DLL mtrapi32.dll.
Je ne trouve pas les paramètres a indiquer dans les fonctions.

Voila a quoi j'en suit

//Charge DLL
Fichier_DLL = "C:\Velleman\Stepper Motor Cards\Native DLL\mtrapi32.dll"
Instructions_DLL = ChargeDLL(Fichier_DLL)
SI Instructions_DLL=0 ALORS
Erreur("Chargement DLL impossible")
//RETOUR
SINON
Info("DLL chargée")
FIN
//Connexion avec la carte
gnCode=AppelDLL32(Fichier_DLL,"SMCConnect","COM1",4)
Info(gnCode)
SI gnCode = -1 ALORS
Info ("la carte n'est pas branchée")
RETOUR
SINON
Info ("C'est parti")
HModifie(Semences)

FIN

Il indique "C'est parti" alors que la carte n'est pas branchée
Si quelqu'un sait m'aider.

--
Raymond
Membre enregistré
948 messages
Popularité : +30 (92 votes)
Posté le 23 septembre 2017 - 21:22
Coucou,

Le type de gnCode correspond au type renvoyer par SMCConnect#mtrapi32.dll ?

--
Charly CanDo.
Forg en Nouvelle-Zélande ;-) - In üs we trust
Nasi Goreng en Indonesie ;-) - #oulouou
Char Kuey Tiao en Malaisie ;-) - #OKLM
Ratatouille en Provence ;-)
irc.freenode.net - ##pcsoft
Membre enregistré
9 messages
Posté le 24 septembre 2017 - 08:09
Bonjour,
Je crois gnCode est un entier

Merci

--
Raymond
Membre enregistré
9 messages
Posté le 19 octobre 2017 - 11:47
J' ai fais un bouton pour faire tourner le moteur 1 à droite, pas d'erreur, mais rien ne fonctionne quelqu'un sais t'il m'aider

// Ouverture de COM3
gbLignecom3 = sOuvre(3, 2000, 2000)
SI gbLignecom3 = Vrai ALORS
sFixeParamètre(3, 9600, 1, 8, 0)
//INFO(gbLignecom3)
SINON
Erreur("Erreur d'ouverture de COM3")
FIN

//Charge DLL
Fichier_DLL = "C:\Velleman\Stepper Motor Cards\Native DLL\mtrapi32.dll"
Instructions_DLL = ChargeDLL(Fichier_DLL)
SI Instructions_DLL=0 ALORS
Erreur("Chargement DLL impossible")
RETOUR
SINON
//Info("DLL chargée")
FIN
// DESCRIPTION DES FONCTIONS
//connection paramètres
ConnectionP est une Description d'API
ConnectionP..NomDLL = Fichier_DLL
ConnectionP..NomFonction = "SMCConnect"
ConnectionP..TypeRetour = apiBooléen
ConnectionP..Paramètre[1]..Type = apiChaîne //Port
ConnectionP..Paramètre[2]..Type = apiEntierSystème //Moteur, à faire pour chaque moteur
//Connexion
Connection est une Description d'API
Connection..NomDLL = Fichier_DLL
Connection..NomFonction = "SMCConnected"
Connection..TypeRetour = apiBooléen
//Mouvement paramètres
MouvementP est une Description d'API
MouvementP..NomDLL = Fichier_DLL
MouvementP..NomFonction = "SMCMove"
MouvementP..Paramètre[1]..Type = apiEntierSystème //Moteur
MouvementP..Paramètre[2]..Type = apiEntierSystème //Pas total
MouvementP..Paramètre[3]..Type = apiEntierSystème //Direction
MouvementP..Paramètre[4]..Type = apiEntierSystème //Vitesse
//PAS Moteur
PasM est une Description d'API
PasM..NomDLL = Fichier_DLL
PasM..NomFonction = "SMCGetMotorCount"
PasM..Paramètre[1]..Type = apiEntierSystème //Pas ici 200
//Direction
Direct est une Description d'API
Direct..NomDLL = Fichier_DLL
Direct..NomFonction = "SMCGetDirection"
Direct..TypeRetour = apiEntierSystème
Direct..Paramètre[1]..Type = apiEntierSystème //Moteur
//Moteur control (Torque)tourne oui/non
Tourne est une Description d'API
Tourne..NomDLL = Fichier_DLL
Tourne..NomFonction = "SMCGetTorque"
Tourne..TypeRetour = apiBooléen
Tourne..Paramètre[1]..Type = apiEntierSystème //Moteur
//Mouvement action
MouvementA est une Description d'API
MouvementA..NomDLL = Fichier_DLL
MouvementA..NomFonction = "SMCGetMoving"
MouvementA..TypeRetour = apiBooléen
MouvementA..Paramètre[1]..Type = apiEntierSystème //Moteur
//Couple oui/non
Couple est une Description d'API
Couple..NomDLL = Fichier_DLL
Couple..NomFonction = "SMCSetTorque"
Couple..Paramètre[1]..Type = apiEntierSystème //Moteur
Couple..Paramètre[2]..Type = apiBooléen //Appliquer couple
//Stop moteur arrêt d'urgence
StopUrg est une Description d'API
StopUrg..NomDLL = Fichier_DLL
StopUrg..NomFonction = "SMCStop"
StopUrg..Paramètre[1]..Type = apiEntierSystème //Moteur
//Déconnecte moteurs
DECONNECT est une Description d'API
DECONNECT..NomDLL = Fichier_DLL
DECONNECT..NomFonction = "SMCDisconnect"
//Connexion avec les moteurs
ConnectionP("COM3",1)
//ConnectionP("COM3",2)
//ConnectionP("COM3",3)
//ConnectionP("COM3",4)
Connection()
//gnCode=Connection
//info(gnCode)
//PARAMETRES MOTEURS
PasM(200)
Direct(50)

//MouvementP(1,200,1,50)
Tourne(50)
Couple(1,50)
MouvementP(1,300,1,50)
MouvementA(1)
//MouvementP(1,200,1,50)
//info("Moteur 1 tourne",MouvementA)



//Fermeture de COM3
sFerme(3)

--
Raymond
Membre enregistré
351 messages
Popularité : +75 (75 votes)
Posté le 19 octobre 2017 - 17:57
Bonjour Raymond,

Remplace déjà tes "apiEntierSystème" par "apiEntier_4" parce que ce sont des DWORD et donc sur 4 octets.

Ta fonction "ConnectionP" n'a pas comme paramètre une chaîne mais le pointeur de la chaîne ... c'est donc un apiEntierSystème. Il te faudra passer ton port sous la forme &Port et non Port.

Il semble que cette DLL soit développée en Delphi (mais rien de sûr car je n'ai pas trouvé la documentation), il est donc possible que "Port" ne soit pas une chaîne mais une chaîne Pascal, vérifie également le type BOOL qui de mémoire était sur 4 octets au lieu de 1 comme le booléen de Windev (et des autres langages) .... mais bon rien de sûr, tes tests te donneront la réponse.

N'ouvre pas ton port COM ... cela ne sert à rien car c'est ta DLL qui s'en chargera.

Une fois que tu as réussi a faire tourner tes moteurs ... je te conseille fortement de sniffer ce qui passe sur ta liaison série, d'analyser par toi-même le protocole (qui doit être d'une simplicité enfantine), de supprimer cette DLL inutile et d'attaquer directement le port COM avec les commandes du protocoles que tu généreras à la volée.

En réalisant cela, tu pourras piloter ta carte avec n'importe quoi puisque tu l'attaqueras directement sur le port série. Il semble que l'USB de ta carte ne soit qu'un VCP (port COM virtuel).

Une fois que tu as fait tout ça ... et si ça marche ... poste donc le protocole que tu as trouvé, ça aidera les prochains acheteurs de cette carte.

Quand tu utilises une DLL externe, il y a une règle à respecter : NE JAMAIS aller plus loin tant que ta fonction ne te retourne pas quelque chose de cohérent (et quand c'est la première ... c'est encore pire), tu vas perdre ton temps ! By-passer un test, c'est foncer droit dans le mur ... la preuve ... on dirait que tu as frappé fort !

Port est une chaîne = "COM3"
SI ConnexionP(&Port,1) ALORS

... je continue mon programme

SINON

... je cherche où est le problème et je ne vais pas plus loin tant que je n'ai pas la solution !

FIN


Ma réponse s'est basée sur cela car je n'ai pas ta carte, ni sa documentation :

function SMCConnect(Port: PChar; Motors: DWORD): BOOL; stdcall;
function SMCDisconnect; stdcall;
function SMCConnected: BOOL; stdcall;
function SMCGetMotorCount: DWORD; stdcall;
function SMCGetInputCount: DWORD; stdcall;
function SMCGetOutputCount: DWORD; stdcall;
function SMCSetDemo(Enabled: BOOL); stdcall;
function SMCDemo: BOOL; stdcall;
function SMCMove(Motor, Steps: DWORD; Direction: DWORD; Speed: DWORD); stdcall;
function SMCStop(Motor: DWORD); stdcall;
function SMCGetMoving(Motor: DWORD): BOOL; stdcall;
function SMCGetDirection(Motor: DWORD): DWORD; stdcall;
function SMCSetTorque(Motor: DWORD; Enabled: BOOL); stdcall;
function SMCGetTorque(Motor: DWORD): BOOL; stdcall;
function SMCGetInput(Index: DWORD): BOOL; stdcall;
function SMCSetOutput(Active: BOOL); stdcall;
function SMCGetOutput: BOOL; stdcall;

--
Bon développement, Patrick [3po.fr]
Message modifié, 19 octobre 2017 - 18:01
Membre enregistré
9 messages
Posté le 20 octobre 2017 - 08:57
Merci Patrick,

je vais tester cela dimanche, c'est vrai que l'on ne trouve pas grand chose sur cette carte

Bonne journée

--
Raymond
Membre enregistré
9 messages
Posté le 24 octobre 2017 - 12:16
Bonjour Patrick,

Les moteurs tournent, il faut utiliser l'autre dll MotorLibnet.dll, l'importer dans assemblages.net de WinDev et voila le code pour 1 moteur

sRes est une chaîne
bSResultat est un booléen
nStep est un entier
nSpeed est un entier
nMotor est une entier
nDirection est un entier

nMotor = 0
nStep = 300
nSpeed = 50
nDirection = 0

//
SMC.Connect("COM3",4)

IF SMC.Connected() ALORS
ToastAffiche("Connecté")
ELSE
RETOUR
END

//Moteur 3 Motte
nMotor=2 //2 pour le trois!ème
nStep=400 //2Tours
nDirection = 0 //droite
nSpeed = 50 //vitesse
SMC.SetTorque(nMotor,0)//lache le frein
SMC.Move(nMotor,nStep,nDirection,nSpeed)
bSResultat=SMC.GetMoving(nMotor)
bSResultat = SMC.GetTorque(nMotor)
ToastAffiche(bSResultat)
SMC.SetTorque(nMotor,1)
bSResultat = SMC.GetTorque(nMotor)
Multitâche(100)
nDirection = 1
SMC.SetTorque(nMotor,0)//lache le frein
SMC.Move(nMotor,nStep,nDirection,nSpeed)
SMC.SetTorque(nMotor,1)

SMC.Disconnect()

Et les procédures importées


SMC



// Connect
//
// Paramètres :
// port : chaîne UNICODE
// motors : entier
// Valeur de retour :
// booléen

[ <Résultat> = ] Connect (LOCAL port est un(e) chaîne UNICODE, LOCAL motors est un(e) entier)


// Connected
// Valeur de retour :
// booléen

[ <Résultat> = ] Connected ()


// Disconnect

Disconnect ()


// GetMotorCount
// Valeur de retour :
// entier

[ <Résultat> = ] GetMotorCount ()


// GetInputCount
// Valeur de retour :
// entier

[ <Résultat> = ] GetInputCount ()


// GetOutputCount
// Valeur de retour :
// entier

[ <Résultat> = ] GetOutputCount ()


// SetDemo
//
// Paramètres :
// enabled : booléen

SetDemo (LOCAL enabled est un(e) booléen)


// Demo
// Valeur de retour :
// booléen

[ <Résultat> = ] Demo ()


// Move
//
// Paramètres :
// motor : entier
// steps : entier
// direction : entier
// speed : entier

Move (LOCAL motor est un(e) entier, LOCAL steps est un(e) entier, LOCAL direction est un(e) entier, LOCAL speed est un(e) entier)


// Stop
//
// Paramètres :
// motor : entier

Stop (LOCAL motor est un(e) entier)


// GetMoving
//
// Paramètres :
// motor : entier
// Valeur de retour :
// booléen

[ <Résultat> = ] GetMoving (LOCAL motor est un(e) entier)


// GetDirection
//
// Paramètres :
// motor : entier
// Valeur de retour :
// entier

[ <Résultat> = ] GetDirection (LOCAL motor est un(e) entier)


// SetTorque
//
// Paramètres :
// motor : entier
// enabled : booléen

SetTorque (LOCAL motor est un(e) entier, LOCAL enabled est un(e) booléen)


// GetTorque
//
// Paramètres :
// motor : entier
// Valeur de retour :
// booléen

[ <Résultat> = ] GetTorque (LOCAL motor est un(e) entier)


// GetInput
//
// Paramètres :
// index : entier
// Valeur de retour :
// booléen

[ <Résultat> = ] GetInput (LOCAL index est un(e) entier)


// SetOutput
//
// Paramètres :
// active : booléen

SetOutput (LOCAL active est un(e) booléen)


// GetOutput
// Valeur de retour :
// booléen

[ <Résultat> = ] GetOutput ()


// ToString
// Valeur de retour :
// chaîne UNICODE

[ <Résultat> = ] ToString ()


// Equals
//
// Paramètres :
// obj : Object
// Valeur de retour :
// booléen

[ <Résultat> = ] Equals (LOCAL obj est un(e) Object)


// Equals
//
// Paramètres :
// objA : Object
// objB : Object
// Valeur de retour :
// booléen

[ <Résultat> = ] Equals (LOCAL objA est un(e) Object, LOCAL objB est un(e) Object)


// ReferenceEquals
//
// Paramètres :
// objA : Object
// objB : Object
// Valeur de retour :
// booléen

[ <Résultat> = ] ReferenceEquals (LOCAL objA est un(e) Object, LOCAL objB est un(e) Object)


// GetHashCode
// Valeur de retour :
// entier

[ <Résultat> = ] GetHashCode ()


// GetType
// Valeur de retour :
// Type

[ <Résultat> = ] GetType ()


// Finalize

Finalize ()


// MemberwiseClone
// Valeur de retour :
// Object

[ <Résultat> = ] MemberwiseClone ()

--
Raymond
Membre enregistré
351 messages
Popularité : +75 (75 votes)
Posté le 24 octobre 2017 - 16:39
Bonjour Raymond,

Même si je n'ai pas cette carte, je te remercie pour ton retour qui permettra à d'autres utilisateurs de trouver une solution rapide.

Je trouve juste dommage de devoir utiliser un assemblage .net pour quelques commandes sur un port série, mais au moins ça fonctionne et c'est le principal.

Je reviens juste sur ta précédente DLL, car j'aurai dû te mettre plutôt ce genre de code :
Port est une chaîne Asciiz = "COM3"
SI ConnexionP(&Port,1) ALORS
....
FIN

Sans le "Asciiz", la DLL ne voit pas la fin de chaîne, c'est un oubli de ma part. Si tu as l'occasion de tester ça pour voir si ça fonctionne mieux, c'est toujours une piste intéressante.

--
Bon développement, Patrick [3po.fr]
Membre enregistré
9 messages
Posté le 24 octobre 2017 - 17:10
Bonjour,
J' ai un petit soucis, la commande GetMoving qui devrait me dire si le moteur est en fonction pour lancer le processus suivant donne toujours 0
J'ai installé des pauses et cela fonctionne bien (La durée = le 1/4 du pas).

--
Raymond
Membre enregistré
9 messages
Posté le 04 septembre 2018 - 12:17
Bonjour


En WEBDEV 18
J'ai un problème avec le bouton lit suivant, il lit le deuxième article mais pas le troisième ni les suivants.
Ceci ne fonctionne pas
HLitSuivant(Produits,Nom)
FichierVersEcran(Page_Produits,Produits)
Et ceci bien, il lit tous les articles
TANTQUE HEnDehors(Produits)=Faux
HLitSuivant(Produits,Nom)
FichierVersEcran(Page_Produits,Produits)
FIN
Info(Produits.Nom)

J'ai un fichier catégorie et tout fonctionne

Je ne comprend vraiment pas

--
Raymond