Documente Academic
Documente Profesional
Documente Cultură
apropiată de limbajul de nivel înalt PASCAL și două limbi grafice, Ladder Diagram (LD), care permite
programarea aplicațiilor într-o manieră asemănătore cu proiectarea unui circuit cu contacte și relee,
operând numai cu variabile booleene și Function Block Diagram (FBD), care este o extensie a limbajului
LD, conținând blocuri complexe și putând opera și cu alte tipuri de variabile decât cele booleene. Ediție
a treia, publicată în 2013, anulează și înlocuiește ediția a doua, publicată în 2003 și constituie o revizie
tehnică. Acesta include următoarele modificări tehnice semnificative: Este o extensie compatibilă celei
de a doua ediție, iar principalele extensii sunt noi tipuri de date și funcții de conversie, referințe, spații de
nume și caracteristicile orientate pe obiecte ale claselor și blocuri de funcții.
Cele mai multe medii de programare permit vizualizarea programelor scrise în LAD sau FBD și în STL
prin selectarea limbajului din opțiunile care apar în mediu la View (uneori mediul introduce câteva
instrucțiuni NOP). Se spune că limbajele sunt reversibile. Invers, adică din STL la LAD sau FBD nu
este permisă dacă se apelează blocuri de tip TIMER sau CONTOR.
Normele IEC 61131-1 definesc SFC (Sequential Function Chart) ca fiind un mijloc destinat pentru
structurarea şi organizarea unui program. Unele medii de programare oferă compilatoare grafice pentru
realizarea programelor pentru AP pe baza SFC. Acesta are la bază reprezentarea sub formă de reţea
GRAFCET a acţiunilor secvenţiale. Chiar dacă nu este disponibil un compilator de SFC este recomandat
să se realizeze diagrama pentru orice program, care cuprinde acţiuni secvenţiale pornind de la regulile
GRAFCET. Această reprezentare poartă numele de graf de specificare. Utilizarea grafului de specificare
este utilă pentru prezentarea structurată a acțiunilor secvențiale cu atât mai mult cu cât se cunosc metode
de transformare a unui graf de specificare, așa cum vom arăta mai jos, în orice limbaj.
Programarea AP se realizează, de obicei, din programe numite medii de programare, cere permit
elaborarea programului într-un limbaj de programare specific, încărcarea acestuia în automat și inițierea
execuției.
Unele medii de programare permit crearea unui tabel (Watch table), care permite monitorizarea
variabilelor unui program sub forma unui tabel. Există posibilitatea de a crea și un alt tabel (Force table),
care permite forțarea unor variabile ale programului în starea TRUE sau FALSE. Trebuie menționat că
forțarea este periculoasă, deoarece mediul suprascrie din punct de vedere logic o stare din automat a unor
intrări sau ieșiri.
Orice POU este alcătuit din două părţi: partea de declaraţii şi partea de cod.
În partea de declaraţii a variabilelor se definesc toate variabilele utilizate într-un POU. Trebuie făcută
distincţia între variabilele vizibile pentru exteriorul POU (variabile de interfaţă) şi variabilele locale
(VAR). Variabilele de interfaţă pot fi variabile de intrare (VAR_INPUT) sau variabile de ieşire (VAR_OUTPUT).
Mai există şi alte variabile VAR_GLOBAL, care sunt comune tuturor POU, la SIEMENS aceste variabile fac
parte dintr-o structură numita Symbol Table sau VAR_EXTERNAL, care sunt din alte POU. Partea de declaraţii
poate avea diferite forme. De obicei ea este realizată în mod text sau tabelar.
Partea de cod conţine instrucţiuni destinate automatului în oricare dintre limbajele de mai sus.
Tipurile de date elementare definite de normele IEC 61131-3 sunt: Booleene, reprezentate pe un bit şi
notate cu BOOL, octeţi (8 biţi), cuvinte (16 biţi) şi cuvinte duble (32 biţi), notate cu BYTE, WORD şi respectiv
DWORD, Întregi, notate cu INT, Reale (32 biţi), notate REAL, Şiruri de caractere, notate cu STRING și
Variabile de tip timp şi dată, notate TIME şi respectiv DATE.
Este permisă utilizarea unor date de tip tablou (ARRAY) şi structură (STRUCT), precum şi date derivate din
acestea.
46
AUTOMATE PROGRAMABILE vol. I
OPERATOR MODIFICATOR
47
AUTOMATE PROGRAMABILE vol. I
Operanzii instrucţiunilor IL sunt variabile, care sunt referinţe la o memorie fizică şi pot fi variabile
interne, intrări sau ieşiri ale automatului. La instrucţiunile cu un singur operand, celălalt operand este
implicit şi reprezintă conţinutul unui registru al procesorului numit, de obicei, acumulator sau în stivă.
Operaţia, care este descrisă de operator, se execută între operand şi conţinutul acumulatorului sau stivei,
iar rezultatul este memorat tot în acumulator.
Documentarea programelor se face utilizând comentarii. Comentariile pot apărea pe aceeaşi linie cu
instrucţiunea sau pe o linie separată. Identificarea comentariilor se face prin caractere: fie sunt precedate
de (* şi succedate de *), fie se utilizează caracterele //, la început de comentariu.
Operatorii IL sunt împărții în mi multe grupe: operatori de transfer pentru variabile booleene (LD, ST,
=), care transferă datele de la memorie la acumulator (LD) și invers (ST, =), operatori de setare/resetare
(S-Set, R-Reset), care setează respectiv resetează operanzi, operatori logici (AND, OR, XOR), care
realizează operații logice între conținutul acumulatorului și operand, operatori pentru date pe octet,
cuvânt sau dublu cuvânt (MOV), care transferă date de la o sursă la destinație. Operatorul are o literă
suplimentară pentru specifica felul datei: B, pentru octet, W pentru cuvânt sau DW, pentru dublu cuvânt.
Instrucțiunea are doi operanzi: sursa și destinația, operatori aritmetici (ADD, SUB, MUL, DIV), care
realizează operații aritmetice între doi operanzi, operatori relaționali (GT, GE, EQ, NE, LE, LT), care
compară doi operanzi și setează acumulatorul în funcție de rezultatul comparației și operatori de salt
(JMP, CALL, RET), care provoacă salturi la etichete, proceduri sau revenirea din proceduri.
Modificatorii sunt caractere folosite pentru negarea booleană a operatorului (N), întârzierea unei operații
(“(„), până la întâlnirea perechii sale („)”) sau realizarea unei operații de salt condiționat (C).
Etichetele sunt folosite pentru specificarea punctelor ţintă ale instrucţiunilor de salt. O instrucţiune poate
avea o etichetă, care este un identificator, urmat sau nu de caracterul :. O etichetă poate fi scrisă şi pe o
linie separată. În cazul unor variante ale limbajului IL eticheta este scrisă pe o linie separată sub forma
unui cuvânt cheie. Acest cuvânt este urmat de un număr, care este al unei instrucţiuni din program. De
exemplu la limbajul STL, pentru automatele SIEMENS, cuvântul cheie este LBL. Pentru anumite medii
de programare etichetele instrucţiunilor sunt generate automat.
Aşa cum am menţionat mai sus, diferiţii producători au adoptat variante ale limbajului IL, care nu
respectă în întregime standardul IEC. Sunt implementate instrucţiuni de cilare de tip FOR, de shiftare,
de manipulare a stringurilor, de lucru cu tabele, de lucru cu contoare şi timere etc. Utilizarea limbajului
în aceste cazuri este documentată în meniurile de ajutor și manualele de utilizare.
Modul de execuţie al programelor bazate pe text este similar cu cel al limbajelor de asamblare. CPU
execută fiecare instrucţiune în ordinea dictată de program de sus în jos. Se utilizează de asemenea stiva
pentru asigurarea controlului. În STL trebuie utilizate instrucţiuni speciale pentru controlul stivei.
Aceste instrucţiuni sunt OLD şi ALD, care execută operaţii de OR şi AND între componentele din capul stivei.
Pentru a ilustra modul cum se lucrează cu stiva vom prezenta un program STL pentru un automat
SIEMENS S7-214 şi vom prezenta şi conţinutul stivei în diferitele momente ale execuţiei programului
(Fig. II.2).
48
AUTOMATE PROGRAMABILE vol. I
LD %I0.0
LD %I0.1
LD %I0.2
A %I0.3
OLD
ALD
=%Q0.0
LD
LD %I0.0
%I0.0 LD %I0.0 LD %I0.1 LD %I0.2 AND %I0.3 OLD ALD
%I0.0
%I0.0 %I0.0 %I0.1 %I0.2 E E1 E2
%I0.0
%I0.0 %I0.0 %I0.1 %I0.1 %I0.0
%I0.0 %I0.0
49
AUTOMATE PROGRAMABILE vol. I
conducere A/M are valoarea 1. Dacă această variabilă este 0 atunci pornirea şi oprirea motorului se
realizează numai prin intermediul unor variabile generate de automatul programabil.
Pornirea în ambele cazuri este permisă numai dacă schema este alimentată în curent continuu, adică dacă
variabila de intrare AV, numită disponibilitate este 1. La pornirea automată comanda de pornire trebuie
retrasă, dacă nu apare în decursul câtorva secunde o reacţie de la contactorul, care comandă pornirea
motorului, caz în care se generează o variabilă de avarie. Variabila de reacţie este B1 şi este un contact
normal deschis al contactorului de pornire KM1.
Automatul programabil comandă prin ieşirea C1, bobina releului intermediar KA1. Acesta, dacă există
alimentată schema de curent continuu, comandă printr-un contact al său şi nu direct bobina principală
KM1 pentru a nu solicita ieşirile automatului. Dacă programul se realizează sub forma unei proceduri
aceasta trebuie să poată fi instanţiată pentru mai multe motoare, care au aceeaşi schemă de comandă.
Programul, în limbaj STL, va fi întocmit pentru un automat S7-300 este prezentat în fig. II.3.
Network 2 Testul inchiderii contactului in 2 s
A "C1" // Q0.0 Bobina de pornire
AN "B1" // I0.2 Contact al contactorului de pornire ND
L S5T#2S
SD T 1 // Pornirea timerului
NOP 0
NOP 0
NOP 0
A T 1
= "T_AVARIE" // Avarie de TIMER
Network 3 Generarea de avarie la apasarea ciupercii
AN "CIUP" // I0.4 Ciuperca de avarie NI
= "C_AVARIE" // M0.7 Avarie prin apasarea ciupercii
Network 4 Generarea semnalului de avarie si resetarea avariei
A(
O "T_AVARIE"
O "C_AVARIE"
)
AN "RESET_A" // M0.5 resetarea avariei
= "AVARIE"
50
L1 400 V F1 L1 N L+ L-
L2 1
L3 50Hz 1 2
3 4 2
3
VLC Q01
4
43 13
KM1 KA1
44 14
2 4
1 3 5 13
Q01 F2
A1 A1
PKNM0-2,5 14 H01 KB KM1 1 3
A2 A2
5
I> I> I>
13 com
2 4 6 KB
14 6 AV
51
13
KM1 C1
7 B1
1 3 5 22 14
DILM25-01
8
KM1
H1 LS
2 4 6
A1
KA1
L1
Automat Programabil
A2
23
AUTOMATE PROGRAMABILE vol. I
HS
01 1 3 5
VCS
1 7 2 LS 3 L1
2 4 6
5
6
Fig. II.4. Motor Control Center pentru acționarea unui
motor cu un singur sens. Cutie locala
M
AUTOMATE PROGRAMABILE vol. I
52
AUTOMATE PROGRAMABILE vol. I
statică) şi parametrii ai blocului (valori de variabile locale care sunt folosite pentru transferul parametrilor
actuali atunci când blocul este apelat).
Variabilele globale sunt acele variabile, care pot fi accesate în orice punct al unui program. Unele
compilatoare permit utilizarea variabilelor globale doar prin crearea unor blocuri speciale numite Data
Block.
Un program în limbajul ST poate fi compus din mai multe blocuri, care sunt subunităţi ale unui program
care se disting prin funcţia pe care o îndeplinesc, structura lor şi prin scopul pentru care sunt create.
Există blocuri de tip program principal ciclic (main), funcţii, funcţii bloc şi blocuri de date. Ca regulă
generală, un bloc apelat trebuie situat înaintea unui bloc apelant.
Structura generală a unui bloc în limbajul ST are patru părți.
Începutul blocului, care este un cuvânt cheie (de exemplu FUNCTION_BLOCK nume pentru o funcţie bloc
din limbajul SCL pentru automatele SIEMENS, PROGRAM nume pentru compilatoarele CoDeSys).
Secţiunea de declaraţii, care depinde de tipul blocului. În această secţiune se declară variabilele locale,
parametrii, constantele şi etichetele, pentru compilatoarele care le acceptă pe acestea din urmă. Unele
medii de programare au secţiunea de cod şi secţiunea de declaraţii sunt în ferestre separate. Se pot
declara:
Variabile statice sub forma:
VAR
<lista de variabile>
END_VAR
Secţiunea de cod, care conţine instrucţiuni, care sunt executate atunci când blocul logic este apelat.
Secţiunea de cod a blocurilor de date conţine instrucţiuni pentru iniţializarea variabilelor. Regulile care
trebuie respectate pentru această secţiune au fost enunţate mai sus. În completare, vom semnala că, unele
medii de programare acceptă etichete, care trebuie declarate şi că la compilatoarele care nu au separată
fereastra de instrucţiuni ce cea de declaraţii începutul secţiunii de cod se face cu un cuvânt cheie BEGIN.
53
AUTOMATE PROGRAMABILE vol. I
Prelucrarea descrisă de această instrucţiune se realizează în două etape: mai întâi se face calculul valorii
expresiei din membrul drept, iar apoi se asociază valoarea astfel obţinută variabilei din membrul stâng.
Evident, se pune problema ca variabila şi expresia să fie de acelaşi tip sau de tipuri compatibile. Dacă
tipurile de date nu sunt compatibile sunt necesare operaţii de conversie a tipurilor de date. O astfel de
incompatibilitate se referă la numărul de biţi/octeţi folosiţi pentru memorare. Există în diferitele
bibliotecile care însoţesc diferitele medii de programare multe funcţii care realizează conversii, de
exemplu BYTE_TO_INT, din Step 7 Manager, care realizează convenţia unei variabile/constante
54
AUTOMATE PROGRAMABILE vol. I
memorate pe un octet într-o variabilă/constantă memorată pe doi octeţi sau INT_TO_BOOL, din CoDeSys.
Trebuie privită cu toată atenţia această problemă deoarece poate conduce la erori greu de controlat. Pentru
fiecare mediu de programare trebuie analizate atât funcţiile de conversie cât și cele de trunchiere
disponibile pentru a le folosi atunci când aceasta se impune.
II.3.3. INSTRUCŢIUNI REPETITIVE
Dacă o anumită secvenţă de instrucţiuni trebuie executată în mod repetat (eventual asupra unor valori
diferite) se spune că se execută o prelucrare ciclică. Limbajul ST conţine mai multe instrucţiuni care
permit descrierea unor prelucrări ciclice.
II.3.3.1. INSTRUCŢIUNEA FOR
Instrucţiunea FOR este utilizată pentru repetarea unei secvenţe de instrucţiuni atât timp cât variabila de
control (contor) se găseşte în anumite limite. Variabila de control este un identificator pentru o variabilă
locală de tip INT sau DINT. Linia de definiţie a unei instrucţiuni FOR mai conţine specificarea valorii
iniţiale şi a valorii finale a variabilei de control. Opţional linia de definiţie mai poate conţine şi pasul
precedat de cuvântul cheie BY. Numărul de execuţii a instrucţiunilor din corpul ciclului este cunoscut.
Forma generală a instrucţiunii FOR este:
FOR <contor> := <valoare_initiala> TO <valoare_finala>
{BY <Pas>}
DO
<Instructiuni>
END_FOR;
55
AUTOMATE PROGRAMABILE vol. I
END_FOR;
Erg:=Var1;
Executarea instrucţiunii se face conform cu următoarele reguli: Se execută secvenţa de instrucţiuni din
corpul ciclului, după prima execuţie se evaluează expresia logică, iar dacă condiţia este FALSE, se reia
secvenţa de instrucţiuni din corpul ciclului, iar în caz contrar se întrerupe execuţia secvenţei de
instrucţiuni.
Exemplu: Presupunând că valoarea iniţială a variabilei Var1 este 1 şi a contorului este 5, valoarea
variabilei Var1 după executarea ciclului este 32.
REPEAT
Var1 := Var1*2;
Counter := Counter-1;
UNTIL
Counter=0
END_REPEAT;
56
AUTOMATE PROGRAMABILE vol. I
Executarea instrucţiunii se face conform cu următoarele reguli: Se evaluează expresia logică, dacă
condiţia este FALSE, se execută secvenţa de instrucţiuni din corpul ciclului, iar în caz contrar ciclul nu
se execută.
Exemplu: Presupunând că valoarea iniţială a variabilei Var1 este 1 şi a contorului este 5, valoarea
variabilei Var1 după executarea ciclului este 32.
counter :=5;
WHILE counter<>0 DO
Var1 := Var1*2;
Counter := Counter-1;
END_WHILE
Buclele WHILE şi REPEAT sunt, într-un anumit sens, mai puternice decât bucla FOR atunci când nu se
cunoaşte numărul de execuţii ale ciclului înainte de execuţia acestuia. Trebuie tratate cu atenţie buclele
WHILE şi REPEAT deoarece se poate ajunge la repetări infinite. În cazul în care, totuşi, numărul de repetări
ale buclei este clar, o buclă FOR este de preferat, deoarece nu permite bucle fără sfârşit.
II.3.3.4. INSTRUCŢIUNEA EXIT
Instrucţiunea EXIT este utilizată pentru ieşirea din bucle (FOR, WHILE, REPEAT) în orice punct fără
îndeplinirea condiţiilor de ieşire din buclă.
Executarea instrucţiunii se face conform cu următoarele reguli: această instrucţiune are ca efect părăsirea
imediată a unei bucle. Execuţia programului va continua cu prima instrucţiune care urmează sfârşitului
ciclului.
Exemplu: În programul următor bucla FOR este părăsită imediat ce valoarea Var1[INDEX] este mai mare
decât 3 şi se va reţine valoarea indicelui din vector, care a îndeplinit această valoare.
VAR
INDEX: INT;
INDEXC: INT;
Val1 ARRAY[1..50] OF INT;
END_VAR
FOR INDEX := 1 TO 50 BY 2 DO
IF Var1[INDEX]>3 THEN
INDEX1 := INDEX;
EXIT;
END_IF;
END_FOR;
57
AUTOMATE PROGRAMABILE vol. I
Executarea instrucţiunii se face conform cu următoarele reguli: această instrucţiune are ca efect
terminarea imediată a execuţiei corpului unei bucle. Execuţia programului va continua, în funcţie de
condiţia de ieşire din buclă cu prima instrucţiune a ciclului, dacă condiţia de ieşire nu este satisfăcută sau
cu instrucţiunea care urmează sfârşitului ciclului, dacă condiţia de ieşire este satisfăcută. Într-o buclă FOR,
variabila de control este incrementată cu valoarea din linia de definiţie, imediat după executarea
instrucţiunii CONTINUE.
Exemplu: În programul următor valoarea ariei Var1 nu este schimbată dacă valoarea ariei este egală cu
INDEX.
VAR
INDEX: INT;
Val1 ARRAY[1..50] OF INT;
END_VAR
while INDEX <= 100 DO
INDEX := INDEX+1;
IF Var1[INDEX]= INDEX THEN
CONTINUE;
END_IF;
Var1[INDEX] :=0;
END_WHILE;
Codul unei funcţii bloc pentru realizarea interpolării liniare, care întoarce valoarea y este următorul:
FUNCTION_BLOCK F1
VAR_INPUT
58
AUTOMATE PROGRAMABILE vol. I
59
AUTOMATE PROGRAMABILE vol. I
B
I1 I3
I2
Obiect al Obiect al
Linie de
limbajului limbajului
conexiune
reprezentând reprezentând
orizontală
un contact o bobină
%I0.0 %I0.2 %Q0.0
Linie de Linie de
%I0.1
alimentare alimentare
stângă dreaptă
Linie de
conexiune
verticală
60