Programmation sur automate - Langages fonctionnels - Programmation
Marsh Posté le 27-01-2011 à 18:57:49
Très (trop) complexe pour la section hardware du forum à mon avis...
Je vais demander à un modérateur de déplacer ton sujet dans la bonne section tu auras peut être des réponses là-bas
Ton cas est beaucoup trop pointu, c'est des logiciels très spéciaux réservés à des applications vraiment particulières.
Marsh Posté le 27-01-2011 à 19:10:10
salut
c'est pas complex
y faut juste connaitre le ladder
pour ton programme il y a deja quelque erreur
tu as 2 timer ... tout les 2 portent le même nom
ensuite tu utilise un timer de 1sec avec une clock de 1hz ... c'est pas fort utile
Citation : - Comment faire pour que le dernier calcul ne s'active que si le bloc comparaison (sortie M2) donne une réponse à l'état 0 et non pas tout le temps ? |
c'est du a ta logique m2 resulte de la comparaison de tes 2 compteurs si il ne sont jamais egaux alors non m2 sera toujours à 1, tu peux utiliser un detecteur de front pour qu il ne fasse le calcul uniquement lors de changement d etat
Marsh Posté le 27-01-2011 à 19:12:43
Programmer des automates c'est tout de même pas à la portée de tous, loin de là
Mais en lisant, j'ai franchement cru qu'il nous sortait un langage de l'espace là
Marsh Posté le 27-01-2011 à 19:19:16
non t as pas l air con
je ne veux pas faire de reproche à zilbou
mais c'est mal programmer, ça manque de mnemonique et de commentaire
dur , je n est jamais trouver cela dur , c'est de la logique quasiment pur
une fois que tu as compris ou tu dois aller le programme sort tout seul
Marsh Posté le 28-01-2011 à 17:35:01
Salut, alors merci pour les réponses.
Pour le temporisateur, bien vu, je vais changer ça.
Citation : ensuite tu utilise un timer de 1sec avec une clock de 1hz ... c'est pas fort utile |
Y aurait-il un moyen de simplifier ?
Citation : c'est du a ta logique m2 resulte de la comparaison de tes 2 compteurs si il ne sont jamais egaux alors non m2 sera toujours à 1, tu peux utiliser un detecteur de front pour qu il ne fasse le calcul uniquement lors de changement d etat |
Le problème est que je n'arrive pas à utiliser les fronts montants et descendants. Ils me répètent inlassablement que l'instruction est non-valide lorsque je tente de mettre %M2 ou %M0.2 et je ne vois pas la syntaxe que je devrais mettre pour qu'il accepte. Quelle est la bonne syntaxe ?
Marsh Posté le 29-01-2011 à 02:34:35
utilise la doc fourni avec le logiciel
tu dois y retrouver la syntaxe et les formats qu il accepte pour chaque bloc fonctionnel
comment simplifier ?
ben tu as un clock 1Hz qui set un retard a l enclenchement de 1sec du fait quand le timer arrive à 1Sec la clock s arrete donc le timer aussi soit a la sortie tu as une impulsion d'un cycle , soit tu n as rien du tout
Marsh Posté le 29-01-2011 à 12:44:11
Justement, comme on peut le voir ftp://ftp-developpez.com/thierrya [...] giciel.pdf :ici p27, le langage est
Type Description Repère ou valeur Nombre maximal Accès en écriture (1)
Interne
(mémoire) Les bits internes sont des zones de %Mi 128 Oui
mémoire internes utilisées pour stocker des TWDLC•A10DRF,
valeurs intermédiaires lorsqu'un TWDLC•A16DRF
programme est en cours d'exécution. 256 Tous les autres
Remarque : Les bits d'E/S non utilisés ne automates
peuvent pas être employés comme des bits
internes.
Pourtant %M2 ou %M1 ne marche pas sur les fronts montants et descendants (mais ça marche sur les contacts à ouverture par exemple) :
Citation : Symbole ou repère invalide pour ce type d'instructions |
Citation : |
Je vois le problème. Comme mes deux temporisateurs étaient les mêmes, quand j'ai fait passer le second à 3 secondes, le premier est passé lui aussi à 3 secondes. Je l'ai remis à 500ms =0.5s. Maintenant ça devrait être bon.
T=1s
Les deux horloges envoient un signal. Le premier arrive à %M0 tandis que le second reste bloqué au temporisateur.
T=1.5s
%M1 est activé car le temporisateur a fait passé le signal.
T=2s
Les deux horloges renvoient un signal.
...
Ça fait bien un signal toutes les secondes pour chaque horloge mais avec un décalage entre les deux de 0.5s.
Marsh Posté le 31-01-2011 à 18:58:15
Désolé d'accumuler ainsi trois messages à la suite mais j'ai besoin de votre aide et mon temps est compté.
J'ai pu résoudre le problème du dessus en ... supprimant les fronts.
En effet, j'ai utilisé un compteur rapide (FC) à 5khZ qui est bien plus pratique qu'avant côté précision.
Alors, voilà la version 3 de mon programme :
http://www.pixenli.com/image1296496179045214500.html Première partie
http://www.pixenli.com/image1296495411006632600.html Seconde partie
Note :
%KW0 = 1000
%KW1 = 250
http://www.pixenli.com/image1296495415031118000.html Bloc FC
Si tout va bien, les actions suivantes devraient se dérouler ?
Lorsque l'entrée %I0.0 est activée, le bloc se met à compter.
Lorsque l'entrée %I0.1 est activée, le calcul s'arrête.
Prenons l'exemple de 0.5s ce qui correspond à 2500Hz
Alors, à ce moment là, on divise cette valeur par 1000 ce qui fait 2.5. On divise 250 par 2.5 ce qui nous donne 100.
Donc pour 0.5s le rapport cyclique du bloc PWM est de 100%. Pour 1s, il serait de 50% ...
Cette information est envoyée au moteur en sortie %Q0.0.
Dès que %I0.2 est activée, les sorties %Q0.0 et %Q0.1 sont activées pendant 2 secondes. (temporisateur TON). Et le chronomètre est remis à 0.
Est-ce que l'automate va digérer les contacts à ouverture %I0.3 qui ne sont reliés à rien (le but est d'avoir un signal toujours à 1)?
Est-ce qu'il acceptera les contacts à ouvertures à l'entrée du compteur ?
Est-ce que le programme est juste ?
Marsh Posté le 31-01-2011 à 19:35:30
Citation : Est-ce que l'automate va digérer les contacts à ouverture %I0.3 qui ne sont reliés à rien (le but est d'avoir un signal toujours à 1)? |
oui, même si il doit y avoir un bit systeme
oui
et oui
de toute façon si le programme pose probleme a l automate il te le dira lors de la compilation
Marsh Posté le 10-02-2011 à 16:12:05
Ça ne marche pas !!
Le câblage, les capteurs et le moteur sont sûrs (on a fait des programmes tests)
Il détecte les capteurs mais quel que soit le temps entre les deux, la lumière %Q0.0 ne s'allume pas.
(le bouton poussoir marche par contre : les sorties %Q0.0 et %Q0.1 sont activées)
Quelqu'un a une idée ?
On doit rendre le travail demain.
Marsh Posté le 10-02-2011 à 17:24:32
je dirais que c'est normal que tu n ait pas de sortie pwm
en connaissant le cycle que fait un automate tu te rend vite compte pq le pwm ne fonctionne pas et les bp bien
le cycle de l automate est
1/ lecture des entrées
2/exécution du programme, du haut vers le bas et de droite à gauche ( ça ne parait pas important pourtant en ladder ça l est
3/écriture des sortie
ensuite il recommence
ton problème résulte du fait que ta sortie apparait 2 fois dans ton programme
j explique
tu fais tes calcul pour trouver la valeur de %pwm.r
au reseaux suivant tu mets la fonction %pwm0
c elle si selon le temps et la valeur de %pwm.r va dire si q0.0 est à 1 ou a 0 cette valeur (1 ou 0 ) est ecris dans une memoire en vu d etre réellement appliqué a ta sortie
puis sur ton dernier reseau tu as ton reset avec le timer ...
comme tu n appuye pas sur le reset le timer ne fonctionne pas ( evident ) et la sortie vers q0.0 est à 0 hors le programme voyant ce 0 va aller ecrire dans s memore de sortie 0 en effaçant ce que la fonction %pwm0 a ecrit dedans
resultat uniquement ton reset fonctionne
ce qui me fait conclure ( et ton enseignant aurais du te le dire )
c 'est que les sorties doivent apparaitre une seul et unique fois dans un programme, generalement soit a la fin du ladder ou soit dans une sous routine regroupant toutes les sorties du programmes
au niveau des entrées il est preferable aussi des les utilisées qu une seul fois mais uniquement pour avoir un programme plus clair et plus organiser
voici un extrait d un programme ( excuse pour la dimension )
Spoiler : |
tu remarquera en bas de page la référence croisée qui indique bien que la sortie est present qu une fois dans le programme
Marsh Posté le 10-02-2011 à 18:16:20
Ah d'accord.
Mais comment faire pour modifier puisqu'il n'y a pas de sous-routine et parce que le PWM va directement à la sortie %Q0.0 sans passer par une bobine ?
Marsh Posté le 10-02-2011 à 19:29:14
sur ton dernier reseau i0.2 active une sous routine ou sera placer le timer et tes 2 sorties
ça devrais regler le probleme
Marsh Posté le 10-02-2011 à 19:33:50
la solution serai de gerer ta sortie a coup de set/reset, c'est la seul solution pour avoir 2 actions sur la meme sortie
ton timer de periode fait le SET bobine, le timer variable le reset
c'est la solution la plus simple pour moi
m'enfin bon a se propos .. je pourrai te demander de me filer une copie du dossier de PL707 .. j'ai 2 vieux nano a la maison et j'ai plus le soft
et mon PL7 pro refuse de reconnaitre du si vieux matos
Marsh Posté le 10-02-2011 à 21:11:09
arkrom : Voici le lien : http://www.global-download.schneid [...] ctric.com/
J'avais aussi scanné quelques pages des instructions de service.
http://www.pixenli.com/image1297368169053609300.html
http://www.pixenli.com/image1297368173040886100.html
http://www.pixenli.com/image1297368178003409700.html
http://www.pixenli.com/image1297368183054137600.html
http://www.pixenli.com/image1297368187042265100.html
Auras tu besoin des autres pages ?
arkrom :
Si j'ai bien compris, je transforme la bobine %Q0.0 en bobine SET sur ce screen ? http://www.pixenli.com/image1296495411006632600.html
madpo :
Mais comment fais tu une sous-routine sous PL7107 ? J'ai tenté un Ctrl+F dans la documentation de TwidoSoft (pratiquement comme PL707) et je ne trouve rien à "sous-routine", "sub", ...
Au passage, j'ai réussi à m'arranger pour avoir quelques jours de délai pour mon travail.
Marsh Posté le 10-02-2011 à 21:52:15
normalement tu dois pouvoir rajouter une page de ladder
( regarde le screen que j aposter , tu as le main plus toute une ribambelle de sous programmes, tu arriver au même genre de resultat
par contre je ne peux pas t aider plus , je n utilise ni le twido ni le tsx nano
Marsh Posté le 11-02-2011 à 11:34:52
je vais eplucher ton code cet aprem je me l'ecrit en une seule fois sur un papier et je te dit ca
ton but est quoi ?.. un PWM sur la sortie %Q0/0 ?
quel sont tes conditions d'entrees ?
Marsh Posté le 11-02-2011 à 11:35:52
sinon pour ajouter des reseaux de memoir "suffit" de tapper dans le "fin de programme" pour ajouter une ligne"
Marsh Posté le 11-02-2011 à 11:43:59
Ce sujet a été déplacé de la catégorie Hardware vers la categorie Programmation par DraCuLaX
Marsh Posté le 11-02-2011 à 17:20:17
draculax: Cette catégorie m'avait échappée ; merci pour le déplacement.
arkrom : Je l'ai marqué plus haut mais je le réécris pour que ce soit plus clair :
Le capteur %I0.0 détecte un objet et envoie un signal.
Un chronomètre s'active (ici le compteur rapide %FC à 5kHz)
Le capteur %I0.1 détecte à son tour l'objet.
Le compteur s'arrête.
A ce moment là, le bloc PWM s'active et son rapport cyclique est inversement proportionnel à la valeur courante %FC.V du compteur.
Pour avoir ce %PWM.R, on divise la valeur courante par 1000 pour avoir des nombres digérables par le logiciel puis on divise une constante par ce nouveau nombre. Cette constante (250 actuellement) pourra être probablement modifié selon d'autres essais.
Lorsqu’on appuie sur le bouton poussoir %I0.2, l'entrée %Q0.0 passe à l'état 1 24H/24 et la sortie %Q0.1 s'active aussi (amène à un double relais).
Si tu penses qu'il y a plus simple que cette démarche, n'hésite pas à modifier.
Les screens de mon programme sont 12 posts au dessus du mien et le but recherché est à la fin du premier post.
Je peux te passer le fichier .pl7 s'il le faut.
madpo : J'ai bien vu le screen et pas de problème pour créer un nouveau réseau mais d'ici là ... je ne sais pas créer un sous-programme.
Merci à vus deux pour vous être intéressés à mon problème en tout cas.
Marsh Posté le 18-02-2011 à 12:11:20
je suis sur ton code .. deja il y a un truc etrange ...
ton %M1 est commandé par un TON de 1S avec %S6 comme trigger .. a quoi ca sert ca S6 c'est le bit systeme qui bat la seconde deja
tu t'utilise comme substitue de front montant ou quoi ??
Marsh Posté le 18-02-2011 à 12:23:15
tu a 2 fois TM0 dans le code : ilfaut changer ca pour TMO /TM1
ensuite regarde un truc sur tes MW ... je pense que tu pourrai avoir des chevauchements de variable ... j'ai pas utilisé PL707 depuis 3 ans et j'ai un doute .. il me semble me souvenir que pour WORD i faut compte de 2 en deux pour pas que se recouvre
Marsh Posté le 18-02-2011 à 12:26:49
ensuite .. de memoire tu regle ton PWM uniquement par le ration PWM.R
et la je capte pas ta logiue pour charger cette variable ... elle obeie a quel loi ta regulations ?
tu charge PWM.R avec KW2/C0.V si et seulemet si C0.V et C1.V sont egaux ( %M2 ) ca me parais un peut etrange non ??
surtout que CO et C1 ont des conditions de comptages similaire : l'un incremente sur I0.3 et l'autre sur I0.3 barre ...
tu detecte donc une difference de duree du temps entre les etats ON et OFF de cette entree .. je n'en capte pas le but
Marsh Posté le 18-02-2011 à 20:49:54
En fait, les photos du premier post sont obsolètes.
J'ai mis les photos de l'autre version dans le topic mais vu la longueur de celui-ci mais je vais les remettre ici :
http://www.pixenli.com/image1296496179045214500.html
http://www.pixenli.com/image1296495411006632600.html
%KW0 = 1000
%KW1 = 250
Bloc FC : http://www.pixenli.com/image1296495415031118000.html
Exit donc tous les fronts montants, les variables internes, ...
Voici le fonctionnement que j'ai tenté d'avoir :
Le capteur %I0.0 détecte un objet et envoie un signal.
Un chronomètre s'active (ici le compteur rapide %FC à 5kHz)
Le capteur %I0.1 détecte à son tour l'objet.
Le compteur s'arrête.
A ce moment là, le bloc PWM s'active et son rapport cyclique est inversement proportionnel à la valeur courante %FC.V du compteur.
Pour avoir ce %PWM.R, on divise la valeur courante par 1000 pour avoir des nombres digérables par le logiciel puis on divise une constante par ce nouveau nombre. Cette constante (250 actuellement) pourra être probablement modifié selon d'autres essais.
Lorsqu’on appuie sur le bouton poussoir %I0.2, l'entrée %Q0.0 passe à l'état 1 24H/24 et la sortie %Q0.1 s'active aussi (amène à un double relais).
Le principal problème de cette version, c'est le fait qu'il y ait deux sorties %Q0.0 comme madpo l'a remarqué. Je ne sais pas s'il y a d'autres erreurs.
Marsh Posté le 18-02-2011 à 21:06:01
comment ca 2 sorties %Q0.0 j'en vois qu'une sur tes screens ?
Marsh Posté le 19-02-2011 à 11:50:56
et tu a un relais au cul PWM + contacteur = DTC
ta bobine vas bruler en moins de 2 c'est pas bon du tout ca
le PWM c'est de l'analogique pure, ca doit connecté a un recepeteur adapté et pas a un relai
y a QUOI reelement au cul de %Q0.O ?? si tu 'as pas le choix il te reste la solution frustre mais tres efficace de gerer ton problème en externe en logique cablé : tu met ton bye-pass sur %Q0.3 au lieu de %Q0.0 et tu fit le pontage en externe ( ne pas oublier d'iniber le bloc PWM sur %Q0.3 )
Marsh Posté le 19-02-2011 à 13:07:31
Non, non la bobine du relais n'est pas connecté au %Q0.0 mais à %Q0.1.
Voilà le schéma de câbalge des sorties : http://www.pixenli.com/image1298117222038935000.html
%Q0.0 = on/off
%Q0.1 = sens
Marsh Posté le 19-02-2011 à 13:24:35
la oki par contre tu a une condition qui force la sortie Q0.0 @ 1 permanent non ??
I0.2 il me semble avoir vu
et donc tu a une commande sur %Q0.0 comme une bobine classique, et ca risque de coincer avec le bloc PWM non ?
pour eviter ca tu pourrai faire que le ratio du PWM est forcé a 1 ce qui emulera un 1 permanent
Marsh Posté le 19-02-2011 à 13:38:27
C'est vrai que ça résoudrait le problème ... mais le but est justement d'avoir un bloc PWM avec un rapport cyclique variable : sans cela la vitesse du moteur Q0.0) ne serait pas inversement proportionnelle au temps entre les activations de %I0.0 et %I0.1. C'est le but du programme. Je me demandais s'il n'y avait pas moyen de contourner le problème.
Marsh Posté le 19-02-2011 à 13:43:03
ben ton verrouillage "a fond" n'as lieu que si %I0.3 est activé non ?
tu ajoute un I0.3 barre dans les conditions de tes compteurs pour le figer et tu fait un
rung activer par %I0.3 qui recharge une valeur forcé a 1
Marsh Posté le 19-02-2011 à 16:58:05
I0.3 ne sert en fait qu'à mettre un signal toujours à l'état 1.
Par contre, je ne comprend pas la seconde phrase, désolé.
Marsh Posté le 19-02-2011 à 17:05:45
atta je te code ca
Marsh Posté le 19-02-2011 à 17:13:45
je te code ca a la rustre sur une entree @ lacon a toi d'adapter a ton usage dedié
pour le moment tu a ca
Code :
|
que tu converti en
Code :
|
comme ca quand l'entree 7 est activé , ca coupe le reglage "normal" pour forcer la valeur a 1
simple, brutal, efficace
au besoin penser a mettre aussi un [/] %I0.7 sur dans le IN du %FC pour empecher qu'in ne continu a compter dans le vide pendant que I0.7 est activé et que ca fasse de la merde une fois que tu relache
Marsh Posté le 19-02-2011 à 18:18:37
Aaah ! Génial ! Merci.
Je viens de faire les modifications.
Si j'ai bien compris :
Avant, pwm donnait une valeur 24H/24 à %Q0.0. Soit 0, soit 1. Sauf que lorsqu'il y avait le bouton poussoir I0.2, il venait interférer ce que disait le bloc pwm et du coup ça ne marchait pas.
Maintenant, lorsque i0.2 n'est pas activée; c'est le pwm qui détermine l'état de la sortie %q0.0.
Quand le bouton poussoir est activé, le pwm se tait et la sortie %Q0.0 est toujours à l'état 1.
Je vais quand même reprendre des photos pour vérifier que tout est correct.
Est-ce qu'il y aurait sinon quelque chose qui permettrait de simuler le programme ?
Marsh Posté le 19-02-2011 à 18:44:07
en fait c'est pas tout a fait ca ...
dans ton code I0.2 intefere sur Q0.0 donc la sortie est prioritaire sur e PWM et ca marche pas
avec ma methode le PWM est le seul a gerer Q0.0 par contre quand tu a besoin, avec l'entree de forcage tu prend la main sur le programme pour forcer le bloc PWM a sortir 1 en forcant le ratio cyclique a fond
mais c'est toujours le bloc PWM qui gere la sorti et personne d'autre
Marsh Posté le 19-02-2011 à 19:34:46
Ça me ferait donc ça ?
http://www.pixenli.com/image1298140479009229800.html
Marsh Posté le 19-02-2011 à 20:31:58
a verifier la valeur a coller dans %KW2 sinon ca me parais bon oui
Marsh Posté le 27-01-2011 à 18:31:01
Bonjour à tous !
J'ai crée un programme sous PL707 pour l'automate TSX Nano. Si vous ne maîtrisez pas le logiciel PL707, peut-être maîtrisez vous le langage à contacts Ladder qui est le langage utilisé.
Mon programme est terminé mais je en suis pas du tout sûr de ce que j'ai fait.
Pourriez vous le vérifier ?
Puisque PL707 ne permet pas les captures d'écran, j'ai pris des photos que j'ai hébergées sur pixenli. Si cela vous intéresse, je peux vous fournir le fichier .pl7
Voici les photos. J'explique juste après ce que j'ai fait et le but recherché.
http://www.pixenli.com/image1296056511074549700.html
http://www.pixenli.com/image1296056508023071600.html
http://www.pixenli.com/image1296056512002238700.html
La fin est :
Mes incertitudes sont ici :
- Je n'arrive pas à l'utiliser avec %M0, donc je ne peux pas l'utiliser avec la bobine. J'ai donc mis un contact à fermeture mais je ne suis pas sûr
- Les histoires de repères et symboles avec les bits internes (M0 et compagnie.)
-Pour avoir un signal toujours en 1, utiliser un contact à ouverture %I0.3, entrée non utilisée, suffit ?
- Comment faire pour que le dernier calcul ne s'active que si le bloc comparaison (sortie M2) donne une réponse à l'état 0 et non pas tout le temps ?
Explication de mon programme :
1)Le bit système, s'activant toutes les secondes, active M0.
2)Cette donnée est comptée par le compteur C0, activé à l'aide de %I0.0 et arrêté à l'aide de %I0.1, %I0.2 servant pour la remise à 0.
3) Les étapes 1 et 2 sont répétées avec une différence de 0.5 s (cela permet d'avoir une meilleure précision qui était nécessaire)
4) Bloc comparaison entre les deux compteurs.
Si la comparaison est bonne, alors on utiliser n'importe quel capteur.
Si elle est mauvaise, on utilise la donnée du compteur le plus lent à laquelle on ajoute 0.5. (%KW0 = 2 ; %KW1 = 1)
5) Deux blocs opérations qui permettent de trouver %PWM.R, donnée inversement proportionnelle au résultat du comptage (%KW3 sera défini par expérimentations de sorte que %PWM.R soit compris entre1 et 100.).
6) Bloc PWM relié à la sortie %Q0.0
7) Quand %I0.2 est activée, alors pendant 3 secondes, les sorties %Q0.0 et %Q0.1 sont activées aussi.
Explication du but recherché :
Le but est d'ouvrir une porte en fonction de la vitesse de la bille. Cette bille est détectable par les capteurs %I0.0 puis %I0.1. Comme la distance entre les deux capteurs est constante, la vitesse sera inversement proportionnelle au temps.
Plus la vitesse de la bille est grande, plus le rapport cyclique du moteur %Q0.0 est important. Lorsqu'il atteint 100, alors le moteur tourne à plein régime. A 50, il tourne puis s'arrête, puis retourne de sorte que depuis notre échelle, il ne va simplement que deux fois moins vite (inertie du moteur).
%I0.2 est un bouton poussoir qui est placé sur le mur de sorte que la porte l'active en étant complètement ouverte. Ce bouton permet à la fois de remettre à zéro le chronomètre mais aussi de faire tourner le moteur dans l'autre sens (%Q0.1 est un double relais qui permet de faire un pont en H). La temporisation permet d'arrêter tout. (3 secondes sera peut-être redéfini selon les expérimentations)
Merci de votre aide !