Accueil > Forum > Programmation IEC 61131 (LogicLab) > Gérer un compteur avec une valeur rémanente
- Ce sujet a 9 réponses, 2 participants et a été mis à jour pour la dernière fois 5 années, 7 mois da Sergio Bertana.
-
auteurPost
-
Octobre 31, 2017 à 8: 56 am #36161Alessandro CampodonicoPartecipante
Je devrais gérer un décompte en plaçant la valeur sur une variable rémanente (RETAIN), pour le décompte j'ai créé mon propre FB qui effectue les différentes vérifications et augmente un compteur puis je place la sortie sur une variable rémanente (Dans DB100.2048). Mais quand j'arrête et rallume le système, la valeur de comptage me réinitialise, que puis-je faire.
Octobre 31, 2017 à 9: 04 am #40003Sergio BertanaAdministrateur du forumVotre problème est que lorsque le FB est allumé, ses variables internes sont toutes réinitialisées, par conséquent, sa valeur de sortie est également réinitialisée, puisque vous placez la valeur de sortie sur la variable tampon, vous réinitialisez également la variable.
Pour utiliser des variables allouées dans la mémoire tampon (Backup ou Retain) au sein de fonctions ou de blocs fonctionnels, vous devez utiliser des pointeurs passant l'adresse de la variable. De cette façon, nous allons opérer sur la valeur réelle de la variable qui, étant mise en mémoire tampon, conservera la valeur qu'elle avait lorsqu'elle était désactivée lorsqu'elle est activée. Dans LogicLab, les pointeurs sont identifiés par le symbole @par conséquent, une variable @UINT est en fait un pointeur vers une variable UINT.
J'ai réalisé le projet RetainCounter (Imprimer le programme) qui illustre avec trois FB différents dans les langages LD, IL et ST comment gérer les variables RETAIN à partir d'un FB (Téléchargement du projet).
Juillet 18, 2018 à 6: 08 am #45121Alessandro CampodonicoPartecipanteBonsoir, j'ai encore du mal avec mon compteur FB, jusqu'à aujourd'hui j'ai réussi, en créant un petit programme dans le démarrage de la tâche qui copiait la valeur d'une variable rémanente à l'entrée de mon FB alors quand je démarre le plc mon FB prend la valeur de la variable rémanente et ne me réinitialise donc pas.
Le problème est que ce système «alourdit» le programme à la fois en tant qu'espace de code et en tant qu'espace variable, donc aujourd'hui je me retrouve à devoir modifier FB pour conserver correctement les valeurs rémanentes et éliminer cette partie inutile du code.
Je l'ai fait quelques tests en utilisant le programme que vous téléchargez, mon premier problème qui se pose est que, mon programme tout est écrit en langage IL et n'a pas encore réussi à trouver un moyen d'utiliser la fonction ADR dans cette langue, comme je le fais ?
Comment puis-je changer mon FB pour l'adapter au pointeur? Il me suffit de définir la variable avec le @ et de le définir en tant que variable d'entrée. la variable de support externe doit-elle toujours être un @ ou une variable normale?
Juillet 19, 2018 à 6: 36 am #45124Sergio BertanaAdministrateur du forumAfin de ne pas avoir à copier la variable, le seul moyen est de passer son adresse à la fonction ou au bloc fonction car il utilise le langage IL, voici comment écrire le programme qui utilise le FB ILRetainCtr. J'ai déclaré la variable dans le programme Counter de type ILRetainCtr.
VAR
Compteur: ILRetainCtr;
END_VAREt voici une simple liste IL, comme vous pouvez le voir l'entrée Di00CPU est connectée à l'horloge du compteur, et Value reçoit l'adresse de la variable Counters [0] qui est de type RETAIN.
LD Di00CPU
ST Counter.Clk
Compteurs ADR [0]
ST Counter.Value
Compteur CALJe joins le projet LogicLab pour le download.
Juillet 20, 2018 à 6: 26 am #45125Alessandro CampodonicoPartecipanteJ'avais été dupé par le fait qu'écrire la commande ADR (en IL) l'écriture n'était pas bleue ce qui se produit par exemple pour (LD ST ADD SUB GT ECC ECC) alors j'ai pensé que cela ne fonctionnait pas. Je profite donc de cette occasion pour vous demander encore une chose (désolé si je vais à l’OT)
Comment utiliser les "fonctions" en langage IL si j'essaie de mapper une variable, cela ne coche pas la case des fonctions, mais uniquement des blocs fonctionnels, et si j'essaye d'écrire CAL FUNCTIONNAME évidemment le compilateur me dit que ce n'est pas une variable.
Juillet 20, 2018 à 6: 47 am #45135Sergio BertanaAdministrateur du forumLa réponse à votre question se trouve dans le manuel LogicLab, avec LogicLab il y a deux manuels, l'un est celui qui explique le fonctionnement du programme (F1 sur n'importe quelle fenêtre de programme) et l'autre est celui avec des références à toutes les fonctions et FB fournis avec nos produits (F1 sur un nom de fonction ou FB).
Mais pour venir à votre question pour exécuter une fonction depuis IL, mettez simplement son nom comme premier opérande d'une ligne de programme. N'oubliez pas que le premier paramètre de la fonction est passé par l'accumulateur, tandis que les autres sont placés conformément à la définition. Le résultat de la fonction est renvoyé à l'accumulateur. Le voilà capture d'écran avec un exemple.
Juillet 20, 2018 à 2: pm 01 #45136Alessandro CampodonicoPartecipantePar exemple, j'ai essayé d'utiliser la fonction ValueScale mais le compilateur me donne une erreur:
G0001 Numero di operandi non valido.
Et je vais y répondre en écrivant seulement
LD Température
ValueScaleQue puis-je faire pour résoudre?
Juillet 20, 2018 à 2: pm 05 #45138Sergio BertanaAdministrateur du forumLa réponse est une erreur, la fonction ValueScale a plusieurs opérandes
Input (REAL) Valeur d'entrée à mettre à l'échelle.
ILow (REAL) Limite minimale de la valeur d'entrée à mettre à l'échelle.
IHigh (REAL) Limite maximale de la valeur d'entrée à mettre à l'échelle.
OLow (REAL) Limite minimale de la valeur de sortie mise à l'échelle.
OHigh (REAL) Limite maximale de la valeur de sortie mise à l'échelle.Et vous ne les avez pas mis. Par exemple, si vous souhaitez transformer une entrée analogique 4-20 en 10-50 PSI, vous devez écrire:
Capteur LD (* Entrée, valeur d'entrée à mettre à l'échelle *)
ValueScale 4.0, 20.0, 10.0, 50.0
ST PressionSeptembre 12, 2018 à 3: pm 17 #45361Alessandro CampodonicoPartecipanteBonjour, je suis revenu à mes prises avec les heures d'opération de comptage FB et les pointeurs. J'essayais de mettre à jour mon bloc, pour éviter d'avoir à toujours copier les valeurs mais je trouve un bloc de l'automate, je vous expliquerai mieux.
Ensuite, mon bloc compte l'activation de son temps d'entrée, divisée par secondes, minutes et heures, et à l'intérieur il exécute toutes les instructions sur ces variables 3 (bloc de sortie)
si je n'ai pas mal compris de mettre à jour correctement le bloc avec des pointeurs je devrais les "mapper" correctement en ajoutant le @ dans la liste de ces 3 variables, puis toujours ajouter le @ dans la liste d'instructions où ces variables sont utilisées, enfin affecter les 3 variables en entrée et pas comme sortie, ce faisant, en théorie, j'aurais dû mettre à jour correctement (encore une fois si je n'ai pas mal compris). Mais pour charger le programme sur le plc j'ai un bloc, le fichier journal me donne ce texte
[E] SFR050 [05/09/2018 10:24:06] 1020, Except: IVECTOR At:0x00000000
[L] SFR050 [05/09/2018 10:24:06] 1000, System power on
[L] SFW184 [05/09/2018 10:24:06] 5005, Starting Op. System SFW184B080
[E] SFW184 [05/09/2018 10:24:06] 6030, LLab Cn, ApplID:0x364F53D4Septembre 12, 2018 à 3: pm 23 #45377Sergio BertanaAdministrateur du forumL'utilisation de pointeurs fournit une puissance considérable dans le développement de programmes mais c'est TRÈS DANGEREUX, si vous passez une adresse incorrecte au pointeur, vous pouvez accéder à toute la mémoire système qui fonctionnera même sur des zones du système d'exploitation.
Dans votre cas, vous avez probablement un adressage incorrect qui bloque le système à une exception près. Suite à l'erreur, le système redémarre, puis si LogicLab était connecté il s'arrête en stop. Mais si LogicLab n'est pas connecté, le système essaie de redémarrer plusieurs fois jusqu'à ce qu'il s'arrête en mode veille.
Donc, dans votre cas, certainement une erreur dans la valeur transmise au pointeur, regardez l'exemple de projet des postes précédents et clones du programme pour votre usage.
-
auteurPost
- Vous devez être connecté pour répondre à ce sujet.