Acasă > forum > Programare IEC 61131 (LogicLab) > Gestionați un contor cu o valoare retentivă
- Acest subiect are 9 răspunsuri, 2 participanți și a fost actualizat ultima dată 5 ani, acum 7 luni da Sergio Bertana.
-
AutorPost
-
Octombrie 31, 2017 la 8: 56 am #36161Alessandro Campodonicoparticipant
Ar trebui să gestionez un număr plasând valoarea pe o variabilă retentivă (RETAIN), pentru numărul am creat propriul meu FB care efectuează diferitele verificări și mărește un contor, apoi plasez ieșirea pe o variabilă retentivă (În DB100.2048). Dar când opresc și pornesc din nou sistemul, valoarea contorului mă resetează, ce pot face.
Octombrie 31, 2017 la 9: 04 am #40003Sergio BertanaAdministrator al forumuluiProblema dvs. este că, atunci când porniți FB, toate variabilele sale interne sunt resetate, prin urmare și valoarea sa de ieșire este resetată, deoarece puneți valoarea de ieșire pe variabila tampon, resetați și variabila.
Pentru a utiliza variabilele alocate în memoria tampon (Backup sau Retain) în cadrul funcțiilor sau blocurilor funcționale, trebuie să utilizați pointeri care trec adresa variabilei. În acest fel, vom opera valoarea reală a variabilei, care, fiind tamponată, va menține valoarea pe care a avut-o când a fost oprită la pornire. În LogicLab indicatorii sunt identificați cu simbolul @, deci o variabilă de tip @UINT este de fapt un pointer către o variabilă UINT.
Am făcut proiectul RetainCounter (Programul de imprimare) care ilustrează cu trei FB-uri diferite în limbile LD, IL și ST cum să gestionați variabilele RETAIN dintr-un FB (Proiect descărcare).
Iulie 18, 2018 la 6: 08 am #45121Alessandro CampodonicoparticipantBună seara, încă mă lupt cu contorul meu FB, până astăzi am reușit, creând un mic program în bootarea sarcinii care a copiat valoarea unei variabile retentive la intrarea FB-ului meu, așa că atunci când încep plc-ul meu FB ia valoarea variabilei retentive și, prin urmare, nu mă resetează.
Problema este că acest sistem „cântărește” programul atât ca spațiu de cod, cât și ca spațiu variabil, așa că astăzi trebuie să modific FB pentru a păstra corect valorile retentive și a elimina acea parte inutilă a codului.
Am făcut câteva teste folosind programul pe care l-ai încărcat, prima mea problemă este aceasta, tot programul meu este scris în limbajul IL și încă nu am reușit să găsesc modalitatea de a utiliza funcția ADR în această limbă, așa cum trebuie să fac ?
Cum îmi schimb FB-ul pentru a-l adapta la indicatorul? Trebuie doar să setez variabila cu @ și să o setez ca o variabilă de intrare? variabila de suport extern trebuie să fie întotdeauna o @ sau una normală?
Iulie 19, 2018 la 6: 36 am #45124Sergio BertanaAdministrator al forumuluiPentru a evita să copiați variabila, singura modalitate este să treceți adresa acesteia la funcția sau blocul funcțional, deoarece utilizați limbajul IL, iată cum să scrieți programul care utilizează ILRetainCtr FB. Am declarat variabila în program Contracara de tip ILRetainCtr.
VAR
Contorizator: ILRetainCtr;
END_VARȘi aici este o listă simplă IL, după cum puteți vedea, intrarea Di00CPU este conectată la ceasul contorului, iar Value este transmisă adresei variabilei Contoare [0], care este de tip RETAIN.
LD Di00CPU
ST Counter.Clk
Contoare ADR [0]
ST Counter.Value
Contor CALAnexez proiectul LogicLab pentru Descarca.
Iulie 20, 2018 la 6: 26 am #45125Alessandro CampodonicoparticipantAm fost păcălit de faptul că scrie comanda ADR (în IL) scrisul nu a fost albastru, ceea ce se întâmplă de exemplu (LD ST ADD SUB GT ETC), așa că am crezut că nu a funcționat. Profit de această ocazie să vă mai întreb un lucru (îmi pare rău dacă mă duc OT)
Cum folosiți „funcțiile” în limbajul IL dacă încerc să mapez o variabilă, nu bifează caseta de funcții, ci doar blocurile funcționale și, dacă încerc să scriu CAL FUNCTIONNAME, evident, compilatorul îmi spune că nu este o variabilă.
Iulie 20, 2018 la 6: 47 am #45135Sergio BertanaAdministrator al forumuluiRăspunsul la întrebarea dvs. este în manualul LogicLab, cu LogicLab există două manuale, unul este cel care explică funcționarea programului (F1 pe orice fereastră a programului) și celălalt este cel cu referințe la toate funcțiile și FB-uri furnizate împreună cu produsele noastre (F1 pe un nume de funcție sau FB).
Dar venind la întrebarea dvs. pentru a executa o funcție din IL, pur și simplu ați pus numele ca primul operand al unei linii de program. Trebuie reamintit că primul parametru al funcției este trecut prin acumulator, în timp ce ceilalți trebuie să fie plasați în conformitate cu definiția. Rezultatul funcției este returnat acumulatorului. Iată-l screenshot cu un exemplu.
Iulie 20, 2018 la 2: 01 pm #45136Alessandro CampodonicoparticipantAm încercat, de exemplu, să folosesc funcția ValueScale, dar compilatorul îmi raportează o eroare:
G0001 Numero di operandi non valido.
Și mi-l pune înapoi, scriind doar
Temperatura LD
ValueScaleCe pot face pentru a rezolva?
Iulie 20, 2018 la 2: 05 pm #45138Sergio BertanaAdministrator al forumuluiRăspunsul este greșit, funcția ValueScale are mai mulți operanzi
Input (REAL) Valoarea de intrare care trebuie scalată.
ILow (REAL) Limita minimă a valorii de intrare care trebuie scalată.
IHigh (REAL) Limita maximă a valorii de intrare care trebuie scalată.
OLow (REAL) Limita minimă a valorii de ieșire la scară.
OHigh (REAL) Limita maximă a valorii de ieșire scalată.Și nu le-ai pus. Trebuie să scrieți, de exemplu, dacă doriți să transformați o intrare 4-20 mA în 10-50 PSI:
Senzor LD (* Intrare, valoare de intrare care urmează să fie scalată *)
ValueScale 4.0, 20.0, 10.0, 50.0
Presiunea STSeptembrie 12, 2018 la 3: 17 pm #45361Alessandro CampodonicoparticipantBună dimineața, m-am întors cu FB-ul care număra ore de funcționare și indicatoare. Încercam să-mi actualizez blocul, pentru a evita să trebuiască să copiez mereu valorile, dar să găsesc un bloc PLC, îmi explic mai bine.
Apoi blocul meu contează timpul de activare al intrării sale, împărțit la secunde, minute și ore, apoi în interiorul acestuia execută toate instrucțiunile despre această variabilă 3 (care iese la bloc)
dacă nu am înțeles greșit să actualizez corect blocul cu pointeri, ar trebui să le „mapez” corect adăugând @ în lista acestor 3 variabile, apoi adăugați întotdeauna @ în lista de instrucțiuni unde se utilizează aceste variabile, atribuiți în cele din urmă cele 3 variabile ca intrare și nu ca rezultat, făcând acest lucru în teorie, ar fi trebuit să mă actualizez corect (din nou dacă nu am înțeles greșit). Dar pentru a încărca programul pe plc am un bloc, fișierul jurnal îmi dă acest text
[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:0x364F53D4Septembrie 12, 2018 la 3: 23 pm #45377Sergio BertanaAdministrator al forumuluiUtilizarea indicatoarelor oferă o putere considerabilă în dezvoltarea programelor, dar este FOARTE PERICULOS, dacă trimiți o adresă incorectă către pointer, puteți accesa toată memoria de sistem care va funcționa chiar și în zonele sistemului de operare.
În cazul dvs., probabil că ați direcționat greșit care blochează sistemul cu o singură excepție. În urma erorii, sistemul repornește, apoi dacă LogicLab a fost conectat, acesta se oprește în stop. Dar dacă LogicLab nu este conectat, sistemul încearcă să repornească de câteva ori până când se oprește în repaus.
Deci, în cazul tău, ai cu siguranță o eroare în valoarea trecută la pointer, uita-te la exemplul de proiect al posturilor anterioare și clona programul pentru utilizarea ta.
-
AutorPost
- Trebuie să fiți autentificat pentru a răspunde la acest subiect.