|
FORUMS PROFESSIONNELS WINDEV, WEBDEV et WINDEV Mobile |
| | | | | |
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
...
SINON
...
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 |
| |
| |
| | | |
|
| | | | |
| | |
| | |
| |
|
|
|