Question en boucle !!!

Résolu
jackripper Messages postés 46 Date d'inscription samedi 26 mars 2005 Statut Membre Dernière intervention 11 octobre 2006 - 24 mai 2005 à 08:54
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 - 24 mai 2005 à 22:29
Bonjour tous,

je cherches à faire une boucle en appuyant sur un boutton sous delphi.
Peux ton la faire avec la commande Repeat ?

Merci de votre réponse.

16 réponses

jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
24 mai 2005 à 13:28
au fait dans ton appli le timer ne sert pas.

en effet lorsque tu appuie sur le bouton tu fait un pas et un seul
quelque soit l'interval que tu mets dans le timer. La commande est
"MONOCOUP"

Si tu veux que le moteur fonctionne tant que le bouton est enfoncé utilise les évements onmousedown et onmouseup.

OnMouseDown=>>>>timer.enabled:=true; mise en marche du moteur

OnMouseUp=>>>>>timer.enabled:=false; arret du moteur

et tu places la gestion de la sequence dans OnTimer.

un conseil cree autant de timer que de direction de deplacement.
3
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
24 mai 2005 à 13:49
en complement le code pourait etre celui ci:

procedure TForm1.Timer2Timer(Sender: TObject);

begin
Timer1.Enabled := False; // arreter le timer pendant le traitement

etat2 : = inp32(888);


edit2.text := inttostr (etat2);

case etat2 of //plus efficace que des if successifs
17 : out32 (888,68);
136 : out32 (888,17);


34 : out32 (888,136);


68 : out32 (888,34);

end

Timer2.Enabled : = True;// remettre le timer en sevice


end;

procedure TForm1.SpeedButton2MouseDown(Sender: TObject,Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

Timer2.interval: = 100; //interval suivant frequence a obtenir


Timer2.Enabled := True;
end ;

procedure TForm1.SpeedButton2MouseUp(Sender: TObject,Button: TMouseButton; Shift: TShiftState; X, Y: Integer);


begin


Timer2.Enabled : = false;

end;
3
cs_sim51 Messages postés 240 Date d'inscription dimanche 31 octobre 2004 Statut Membre Dernière intervention 31 décembre 2006 2
24 mai 2005 à 13:55
Bonjour,

Moi je comprend pas pourquoi tu as besoin d'un timer, en effet là il
sert à rien puis que la preocedure timer2timer tu mets "
timer2.enable:= false "

D'ou cela au même que d'appuyer sur le bouton.

Je te conseil de relire la réponse de moldove.

En effet, le timer permet d'exécuter du code tout les X unités de
temps. Pour cela le code se trouve dans la procédure timer.timer

Cependant ceci s'effectue que lorsque le timer est en marche ( timer.enable:=true ).



procedure TForm1.Timer2Timer(Sender: TObject);

begin

etat2 : = inp32(888);


edit2.text := inttostr (etat2);


if etat2=17 then out32 (888,68);


if etat2=136 then out32 (888,17);


if etat2=34 then out32 (888,136);


if etat2=68 then out32 (888,34);

end;

procedure TForm1.SpeedButton2Click(Sender: TObject);

begin

Timer2.Enabled : = True;



end;



Donc là quand tu appuera sur ton bouton, le timer sera actif et
exécutera le code de la procédure TForm1.Timer2Timer tout les X unité
de temps ( que tu paramètre dans l'inspecteur objet de ton timer à
interval ). Cependant ici, tu active le timer, mais il ne s'éteint pas.
D'où la réponse de jlen qui préconise de faire :



procedure TForm1.SpeedButton2OnMouseDown(Sender: TObject);

begin

Timer2.enable:= true;

end;

procedure TForm1.SpeedButton2OnMouseUp(Sender: TObject);

begin

Timer2.enable: =false;

end;

procedure TForm1.Timer2Timer(Sender: TObject);


begin


etat2 := inp32(888);



edit2.text := inttostr (etat2);



if etat2=17 then out32 (888,68);



if etat2=136 then out32 (888,17);



if etat2=34 then out32 (888,136);



if etat2=68 then out32 (888,34);


end;



Ceci aura pour effet que tant que tu gardes le bouton enfoncé, le code
de la procedure timer2timer s'effectura, et quand tu relachera le
bouton, le timer s'arrêtra.



Voilà je crois que c'est tout, en esperant que cela t'aidera pour ton prog.

Bonne continuation.


N'oubliez pas de cliquer sur réponse acceptée si la réponse vous convient !!!
3
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
24 mai 2005 à 09:11
salut,

il est toujours possible de faire une boucle dans un evenement d'un
bouton mais ne pas oublier de prevoir une condition de sortie, sinon
gare au plantage!!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jackripper Messages postés 46 Date d'inscription samedi 26 mars 2005 Statut Membre Dernière intervention 11 octobre 2006
24 mai 2005 à 11:13
Bonjour jlen,

Merci de répondre. Et surtout de m'apporter votre aide.
Y a t-il une source ou un bout de code qui explique la répétition.
De l'appuie d'une des cinqs touches ci-dessous.

Ceci est la source que j'essais de développer j'ai nommé ROBIBOX

Qui permettrons de piloté par le port parallèle et part l'intermédiaire
d'une carte interface deux moteur pas à pas comme la photo
ci-dessous.

J'utilises aussi par la meme occasion la dll inpout.dll

function Inp32(port:integer):integer;Stdcall;external 'inpout32.dll' name 'Inp32';
function Out32(port, valeur:integer):integer;Stdcall;external 'inpout32.dll' name 'Out32';

Tout cela est maitrisé pour l'instant.
Mais la ou je rencontres la difficultée. C'est que ces quatres touches(avant, arriere, droite, gauche) interragissent soit à droite lorsque j'appuis sur la gauche ou l'arriere lorsque j'appuis sur l'avant et vis versa. Dans cette commande j'utilises la commande TTimer avec intervale. Je penses que le problème vient de ces timers.
Question : peut on mettre la fonction timer dans un boutton ?

D'avance merci de votre aide à tous.
Cette source finalisé sera mis à votre disposition sur ce site pour ce qui cherche à développer dans le même type de projet...

J'en ai les nerones qui chauffent. Voyez un peu le topo .....
0
moldov Messages postés 165 Date d'inscription mercredi 8 octobre 2003 Statut Membre Dernière intervention 10 novembre 2008
24 mai 2005 à 11:24
Salut,



Pour executer ton timer dans ton bouton tu fais.



Tu fais ta fonction OnTimer

Tu déclare ton Timer a Timer1.Enabled := False, et dans l'action de ton
bouton tu met Timer1.Enabled := True, et a ce moment il va passer dans
ta fonction timer.



Voila ,je sais pas si c'était ta question



Bonne Prog
0
jackripper Messages postés 46 Date d'inscription samedi 26 mars 2005 Statut Membre Dernière intervention 11 octobre 2006
24 mai 2005 à 12:20
Bonjour moldov,

Voici la parti commande à droite.
procedure TForm1.Timer2Timer(Sender: TObject);
begin
Timer1.Enabled := False;
end;
procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
Timer2.Enabled : = True;
etat2 := inp32(888);
edit2.text := inttostr (etat2);
if etat2=17 then out32 (888,68);
if etat2=136 then out32 (888,17);
if etat2=34 then out32 (888,136);
if etat2=68 then out32 (888,34);
end;

Et si j'ai bien compris je régle l'intervale dans l'inspecteur d'objet .
0
jackripper Messages postés 46 Date d'inscription samedi 26 mars 2005 Statut Membre Dernière intervention 11 octobre 2006
24 mai 2005 à 12:49
477446 Bonjour moldov,

Voici la parti commande à droite.

procedure TForm1.Timer2Timer(Sender: TObject);
begin
Timer1.Enabled : =False;
end;
procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
Timer2.Enabled := True;
etat2 := inp32(888);
edit2.text := inttostr (etat2);
if etat2=17 then out32 (888,68);
if etat2=136 then out32 (888,17);
if etat2=34 then out32 (888,136);
if etat2=68 then out32 (888,34);
end;

Et si j'ai bien compris je régle l'intervale dans l'inspecteur d'objet .
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
24 mai 2005 à 13:00
si tu expliquait un le fonctionnement de ta carte de pilotage on pourrait surement t'aider un plus.

tu peux regler l'inteval du timer dans TForm1.SpeedButton2Click(Sender: TObject); par l'instruction Timer2.interval:=XXX en ms;

si j'ai bien compris tu lis l'etat de la carte tous les N ms et suivant l'etat tu renvoie une commande a la carte.

je pense que tu fais la commande de sequnce du moteur; il y a toutefois
une limite de performance pour ce procede en effet windows ne permet
que difficelement de descendre en dessous de 10ms d'interval;

j'ai moi-meme en cours de developpement un equipement compreneant 14
axes numeriques et j'ai ete oblige de passer par des cartes de pilotage
a microcontroleur (Z8Encore de zilog + puissance a base d'un circuit
STM) montees en reseau, le PC n'etant utiliser que pour suveiller le
fonctionnement de l'ensemble
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
24 mai 2005 à 14:10
salut sim51,

je vois que nous avons eu la meme approche. Pourtant suivant mon
exoerinece en pilotage de moteur Pas a Pas ceci n'est pas tres efficace
en termes de performances

en effet la frequence est limitee au mieux a 1000Hz et d'autre part on
ne peut pas gerer les acceleration et deceleration du moteur.

Un bon syteme de pilotage doit pouvoir rester efficace jusqu'a des
frequence de plus de 20 000Hz avec des acceleration de l'ordre de 500 a
1000Hz/ms on en est donc tres moin.



bonne continuation.
0
jackripper Messages postés 46 Date d'inscription samedi 26 mars 2005 Statut Membre Dernière intervention 11 octobre 2006
24 mai 2005 à 14:20
Tu as raison pour le mono coup. Il est aussi vrai l'interval est limité au mini à 10ms.
J'utilises 5 Timers.
Exact, je lis le port 888 pour d'une part informer l'utilisateur des bits D4 à D7 ici pour le moteur 2
et aussi commandé le pas du moteur en fonction du bit pré-commande.

Pour l'info sur le fonctionnement de la carte. Je gardes le fonctionnement. Sinon tu risque de me macher le travail.
Mais ceci dit les réponses donner à 13:00:33 et 13:28:42 et à exploiter.

Je te recontact sur le forum. Ou en message privé sur ce forum.
0
jackripper Messages postés 46 Date d'inscription samedi 26 mars 2005 Statut Membre Dernière intervention 11 octobre 2006
24 mai 2005 à 14:20
Tu as raison pour le mono coup. Il est aussi vrai l'interval est limité au mini à 10ms.
J'utilises 5 Timers.
Exact, je lis le port 888 pour d'une part informer l'utilisateur des bits D4 à D7 ici pour le moteur 2
et aussi commandé le pas du moteur en fonction du bit pré-commande.

Pour l'info sur le fonctionnement de la carte. Je gardes le fonctionnement. Sinon tu risque de me macher le travail.
Mais ceci dit les réponses donner à 13:00:33 et 13:28:42 et à exploiter.

Je te recontact sur le forum. Ou en message privé sur ce forum.
0
jackripper Messages postés 46 Date d'inscription samedi 26 mars 2005 Statut Membre Dernière intervention 11 octobre 2006
24 mai 2005 à 14:23
Eh bien je vois que le topic fais parler çà fait plaisir merci les delphiens.
çà s'est super.
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
24 mai 2005 à 16:04
a sim51,

excuse-moi pour le retard dans ma reponse mais j'avais un bourdonnement
dans les oreilles et ce n'etait pas le ronronnement du ventilateur mais
un essai d'abeilles entrain d'elire ses quartiers d'été dans mon
grenier enfin le temps de m'occuper de ces charmantes peteites bébêtes
et je reviens sur cette question de timer.

je te remercie pour l'info sur la source de Kenavo mais je l'ai déja
chargée et dans mon cas précis cela n'est encore pas suffisant.

je m'explique:

dans mon appli je dois piloter 14 moteurs

chaque moteur a besoin de 3 compteurs

le premier genere la frequence de rotation jusqu'a environ 16000Hz

le second genere un interval de 1ms pour le calcul
de la frequence en phase d'acceleration et de deceleration et modifie
l'interval du 1er

le troisieme est en fait un PWM pour controler le courant du du moteur

si je compte bien j'ai donc besoin de 42 timers temps reel.

Sachant que l'equipement effectue 180 mouvements en environ 5s il faut
generer autant de rampes d'acceleration et de deceleartion auquel il
convient d'aujout le controle de quelques entree/sortie et fin de
course.

cela commense a faire un joli "m..dier" pour un PC malheureux qui n'en
demande pas tant pour planter au beau mileiu du processus

si l'on ajoute a cela une interface utilisateur pour le client (car en
plus s'agissant d'une commande numerique le cycle de fonctionnement
doit être parametrable sino ce serait trop simple) , un syteme pour la
mise au point; j'ai préféré divisé (pour régner!! )les difficultés:

un module qui gére le process 1 carte a
microcontroleur par axe avec programme ecrit en C (ces carte ne se
programme qu'avec ce langage) le tout mis sur un bus SPI

tournant a 1Mega.

une carte 'chef d'orchestre' pour la laison avec le PC par liason serie.

un PC qui gére l'interface utilisateur et collecte les informations de fonctionnement de l'equipement



Mais mis a part ces quelques petits details c'est tres simple..



bonne prog..
0
jackripper Messages postés 46 Date d'inscription samedi 26 mars 2005 Statut Membre Dernière intervention 11 octobre 2006
24 mai 2005 à 20:00
Merci. Mais j'en suis pas encore là.
Pour l'instant l'idée n'est pas anodine.
Tu passes par un seule port // .
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
24 mai 2005 à 22:29
En fait je n'utilise qu'un seul port serie a 57.6kbauds. je passe
toutes les commandes par la carte master 'chef d'orchestre' qui
dispatche les ordres aux autres cartes. Chacune de ces cartes peut
executer un certains nombres de commandes élementaires:

-mouvement relatif

-position absolue

-recherche de reference

-......etc

on peut programmer les differentes sequences soit en 'C' au niveau du
master soit a partir du PC ( programme de mise au point et/ou de
reglage et/ou de parametrage)

Dans la configuration actuelle le master adresse 15 cartes mais on peut etendre l'adressage a 255 cartes.

Pour l'instant j'utilise les cartes d'evaluation ZILOG (acheter 40$ aux
US) accoupler a des cartes de puissance que j'ai developpées.(
2A/phase en 42V cout 15? unitaire le courant est reglable par logiciel
).

La version definitive en cours de test regroupe toute les fonctions de
chaque axe sur la meme carte (cout unitaire<25?/axe) connectique
comprise.

Cette facon de faire permet de mettre au point chaque element independament des autres.

a+
0
Rejoignez-nous