Sunteți pe pagina 1din 15

AUTOMATE PROGRAMABILE vol.

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

Identificarea datelor se face utilizând atât adrese absolute cât şi simbolice.


Adresarea absolută utilizează denumirea zonei de memorie pentru identificarea adresei. Denumirile
zonelor de memorie pot cuprinde două prefixe. Primul prefix poate fi: %I, pentru intrări, %Q, pentru ieşiri
și %M, pentru variabile interne. Există și alte variante prefixată specifice pentru diferiți producători.
Al doilea prefix poate fi: x.y, pentru variabile de tip boolean. Valoarea x reprezintă octetul, iar valoarea
y reprezintă bitul, B, pentru octet (Byte), W, pentru cuvânt (Word) și D, pentru dublu cuvânt (Double
word).
Exemple: %Ix.y, %IBx, %IWx, %IDx, reprezintă o variabilă de intrare booleană reprezentând bitul y
din octetul x, respectiv octetul x, cuvântul x sau dublul cuvânt x.
Adresarea indirectă sau simbolică utilizează identificatorii, care sunt şiruri de caractere alfanumerice,
începând cu o literă, pentru identificarea adresei. În aceste cazuri este nevoie de editarea zone de
declaraţii pentru variabile, care poate fi şi o tabelă de simboluri, pentru a face legătura dintre adresa
absolută şi cea indirectă.
II.2. LIMBAJUL IL (Instruction List) SAU STL (StaTement List)
II.2.1. INTRODUCERE
Instruction List (IL) sau StaTement List (STL) este un limbaj de nivel jos, definit ca parte a normei IEC
61131. El este utilizat pentru realizarea aplicaţiilor mici, pentru optimizarea codului anumitor părţi ale
unor aplicaţii și uneori pentru ascunderea unor algoritmi importanți dintr-un program. De aceea nu vom
insista asupra lui. Este destinat, în special programatorilor care au experiență în utilizarea limbajelor de
asamblare. IL se bazează pe AWL (AnWeisungsListe) elaborat de firma SIEMENS, care utilizează
modelul cu un singur acumulator. Limbajul este nivelul de bază al limbajelor de programare pentru AP
- toate celelalte limbaje de programare putând fi convertite la programe IL. Conversia inversă, adică din
alte limbaje de programare pentru AP în IL, nu este întotdeauna posibilă. Un program scris în limbaj de
IL este o secvenţă de mnemonice (nume simbolice) care va fi convertită în cod executabil prin operaţii
de asamblare şi editare de legături. Programele în limbajul IL utilizează stiva pentru întârzierea
operaţiilor indicate de paranteze. Vom prezenta în continuare caracteristicile generale ale limbajului,
urmând ca scrierea unui program, pentru un anumit tip de automat, să se facă respectând aceste reguli,
împreună cu altele, prezentate de producător în manualele de utilizare a mediilor de programare sau în
meniurile de ajutor ale mediilor și manualele de utilizare, deoarece versiunile diferiţilor producători sunt
similare, dar nu identice cu versiunea IEC 61131 a limbajului IL. În general, un program IL sau STL este
o listă de instrucţiuni de diferite tipuri, care calculează, de obicei, termeni ai unor expresii logice.
Rezultatul unei astfel de instrucţiuni este o valoare logică (TRUE sau FALSE). Fiecare instrucţiune
trebuie să înceapă pe o linie nouă şi trebuie să conţină un operator, completat, eventual, cu un modificator
şi, dacă este nevoie, pentru anumite instrucţiuni, de unul sau mai mulţi operanzi, separaţi prin virgulă
(fig. II.1). Anumite instrucţiuni au mai mulţi operanzi.

ETICHETĂ : OPERATOR OPERAND(ZI) (* COMENTARIU*)

OPERATOR MODIFICATOR

Fig. II.1. Sintaxa generală a unei instrucţiuni în IL

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

E= I0.3 AND %I0.2 E2= E1 AND %I0.0


E1= E AND %I0.1

Fig. II.2. Lucrul cu stiva


La execuţia primei instrucţiuni, se încarcă în capul stivei valoarea intrării I0.0. La a doua încărcare se
realizează din nou o încărcare în capul stivei. De câte ori apare o operaţie cu operand ea se între acesta
şi capul stivei. Dacă instrucţiunea nu are operand (OLD sau ALD) operaţia se execută între două
elemente din capul stivei.
Se pot folosi TIMERE, CONTOARE și alte blocuri scrise în limbajul LD, sau FBD. Nu vom insista
asupra acestora deoarece utilizarea lor este mai greoaie și e bine să fie folosit limbajul LAD pentru
aceasta. În STUIU DECAZ aveți in Network 2 un exemplu de utilizare a unu TIMER.
II.2.2. STUDIU DE CAZ
Să se dezvolte un program care să controleze un motor de curent alternativ trifazat, care este acţionat
într-un singur sens prin intermediul unui contactor a cărei bobină este alimentată la 24 V CC. Programul
trebuie să realizeze pornirea/oprirea locală de la un set de butoane L1, pentru pornire şi LS pentru oprire.
De asemenea programul trebuie să permită pornirea controlată prin program prin setarea timp de 2
secunde a unor variabile interne RUN_P, pentru pornire şi STOP_P pentru oprire. Motorul se consideră
indisponibil, dacă schema nu are asigurată alimentarea în curent continuu. Se va seta o variabilă de avarie
a motorului, dacă s-a dat o comandă de pornire prin program a motorului şi contactorul nu şi-a închis
contactele în 2 secunde. Ieşirea din starea de avarie se va face numai prin apăsarea unui buton de resetare
a avariei.
Soluție:
În mod practic firmele folosesc standarde pentru comanda motoarelor de curent alternativ. O variantă a
unei astfel de schemă fixă controlată complet de automatul programabil numite MCC (Motor Control
Centre) și este prezentată în fig. II.4.
Pentru pornirea/oprirea unui motor de curent alternativ, într-un singur sens, schema conţine o cutie de
comandă locală, care permite pornirea şi oprirea motorului, dacă o variabilă booleană a programului de

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"

Fig. II.3. Programul pentru comanda motorului de curent alternativ

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

II.3. LIMBAJUL ST (Structured Text)


II.3.1. INTRODUCERE
Limbajul ST (Structured Text), care mai poartă şi numele SCL (Structured Control Language), este un
limbaj de nivel înalt, cu o sintaxă asemănătoare limbajului Pascal, destinat automatizării proceselor şi
este utilizat pentru implementarea unor programe sau proceduri complexe, care nu pot fi programate uşor
în limbajele de nivel jos sau grafice de către programatori, care au experiență în utilizarea limbajelor de
programare de nivel înalt Având în vedere aceasta vom face o prezentare scurtă a limbajului, urmând ca
programatorii interesaţi să aprofundeze acest limbaj în legătură cu variantele puse la dispoziţie de
producător.
Un program în limbajul ST este o listă de instrucţiuni ST. Fiecare instrucţiune este terminată prin
caracterul punct şi virgulă. Elaborarea unui program în ST se face în cadrul unei funcții, iar această
funcție trebuie apelată în alt program. La apel i se asociază un bloc de date.
Cuvintele folosite în codul sursă (identificatori de variabile, constante, cuvinte cheie etc.) sunt separate
prin separatori inactivi (caracterul spaţiu, caracterul TAB sau CR) sau prin separatori activi, care au o
semnificaţie bine definită (de exemplu separatorul > înseamnă mai mare). Separatorii inactivi pot fi
introduşi în mod liber între separatori activi. Spre deosebire de limbajul IL, sfârşitul unei linii poate fi
introdus oriunde într-un program.
Identificatorul este un nume asociat unui obiect al limbajului ST (unei constante, variabile sau unui bloc).
Un identificator este un sir de caractere, în general limitat, care începe cu o literă sau caracterul subliniere
(underscore). Numărul de caractere poate fi mare și este recomandabilă folosirea notației maghiare
care este o modalitate de atribuire a prefixelor specifice numelor tipurilor de date, constantelor si
variabilelor. La compilatoarele firmei SIEMENS, de exemplu, numărul de caractere este limitat la 24.
Limbajul ST nu este case sensitive. Literele mari şi mici pot fi folosite în egală măsură dacă este necesar
pentru o exprimare mai clară, în special pentru identificatori. De exemplu ALFA2 şi alfa2 sunt
identificatori identici.
Există identificatori standard, care nu pot fi utilizaţi pentru variabile. Aceştia sunt folosiţi pentru blocuri
(de exemplu DBx, FBx, FCx, unde x este un număr), pentru adrese (de exemplu Qx.y, Mx.y, unde x şi
y sunt numere), timere (de exemplu Tx, unde x este un număr), contoare (de exemplu Cx, unde x este
un număr) şi pentru cuvinte cheie (BEGIN, DO, WHILE etc.). Nici nume pentru date standard (BOOL,
BYTE, INT, REAL), pentru funcţii predefinite (ABS, SIN etc.) sau pentru constantele standard (TRUE,
FALSE), nu pot fi folosite ca identificatori. Folosirea literelor mici pentru cuvintele cheie conduce, la
unele medii de programare la transcrierea lor cu litere mari. Un identificator a cărei valoare se poate
modifica în timpul execuţiei unui program se numeşte variabilă. Fiecare variabilă trebuie declarată
individual înainte de a fi utilizată. Declaraţia unei variabile trebuie să conţină identificatorul şi să
definească tipul variabilei prin asignarea la un tip de dată.
Variabilele pot fi locale, globale (shared) sau predefinite (valori de memorie CPU predefinite).
Variabilele locale sunt declarate în interiorul unui bloc şi au domeniul de valabilitate (scope) interiorul
blocului.
O variabilă locală poate fi de tip: static (variabile care sunt reţinute în atât în timpul execuţiei unui bloc
cât şi după execuţia blocului şi care sunt folosite la funcţii bloc pentru a putea fi utiliza mai multe
instanţe), temporare (valoarea lor este reţinută doar cât timp blocul este în execuţie şi nu ocupă o memorie

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

Variabile temporare sub forma:


VAR_TEMP
<lista de variabile>
END_VAR
Variabile de intrare sub forma:
VAR_INPUT
<lista de variabile>
END_VAR

Variabile de ieșire sub forma:


VAR_OUTPUT
<lista de variabile>
END_VAR

Variabile de intrare/ieșire sub forma:


VAR_IN_OUT
<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

Sfârşitul de bloc, este indicat prin cuvintele cheie: END_ORGANIZATION_BLOCK, END_FUNCTION,


END_FUNCTION_BLOCK. Această secţiune este necesară atunci când ferestrele de editare şi de declaraţii
nu sunt separate.
Expresiile ST constau într-o combinaţie între operatori şi operanzi, ultimii pot fi variabile sau constante.
Operatorii au priorităţi (precedenţă). Parantezele sunt folosite pentru modificarea priorităţii operatorilor.
Pentru o expresie care constă din doi operanzi şi un operator, cei doi operanzi trebuie să fie de acelaşi
tip. La rândul ei, o expresie poate deveni operand, într-o expresie compusă.
Precedența operatorilor, în ordine descrescătoare, este: interiorul parantezelor ( … ), funcția, ridicarea la
putere **, negația, înmulțirea sau împărțirea sau modulo, adunarea sau scăderea, operatorii relaționali
(<, >, <=, >=, =, <>), AND, XOR, iar cea mai mică OR.
Expresiile sunt de mai multe feluri:
Expresii aritmetice, care sunt construite utilizând operatori aritmetici şi procesează date numerice. Este
recomandată folosirea parantezelor pentru numerele negative pentru creşterea clarităţii. Atragem atenţia
asupra faptului că utilizarea operatorului / sau DIV cu două numere întregi produce un rezultat întreg, iar
împărţirea cu un operand egal cu zero este o eroare.
Expresii de relaţionale, care compară două valori memorate la două adrese şi au ca rezultat o valoare
booleană (TRUE sau FALSE), în funcţie de îndeplinirea sau nu a condiţiei indicată de operator.
Expresii logice, care sunt construite utilizând operatori logici şi au ca rezultat o valoare booleană (TRUE
sau FALSE), în funcţie de tabelul de adevăr al operatorului logic.
O expresie este evaluată într-o anumită ordine: ţinând seama de precedenţa operatorilor, de la stânga la
dreapta şi ţinând seama de paranteze, care pot modifica precedenţa operatorilor. Rezultatul unei expresii
poate fi: atribuit unei variabile, utilizat pentru a realiza o condiţie în instrucţiunile de control sau utilizat
ca parametru actual la un apel de funcţie.
Există mai multe tipuri de instrucţiuni ST:
Instrucţiuni de atribuire.
Instrucţiuni de selecţie (IF, THEN, ELSE).
Instrucţiuni de iteraţii (FOR, WHILE…).
De control (apeluri de proceduri, reveniri).
II.3.2. INSTRUCȚIUNEA DE ATRIBUIRE
Instrucţiunea de atribuire are forma generală:
<variabilă>:=<expresie>

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;

Executarea instrucţiunii se face conform cu următoarele reguli:


La începutul buclei, variabila de control este setată cu valoarea iniţială şi la fiecare execuţie a buclei
valoarea contorului este incrementată sau decrementată până se atinge valoarea finală.
Dacă valoarea iniţială este peste valoarea finală, instrucţiunile corpului buclei nu se execută. Variabila
de control trebuie să fie de tip INT sau DINT.
Se poate omite cuvântul cheie BY (incrementul). Dacă incrementul nu este specificat atunci el este luat
automat egal cu +1.
Ieşirea dintr-o buclă FOR se poate face, înainte de îndeplinirea condiţiilor de ieşire de mai sus, utilizând
instrucţiunea EXIT.
Valoarea iniţială, valoarea finală şi expresia pentru increment se evaluează odată la începutul execuţiei
buclei FOR;
Alterarea valorii finale şi a incrementului nu este permisă în timpul execuţiei buclei.
Se poate realiza o ieşire din buclă folosind instrucţiunea EXIT.
Exemplu: Presupunând că valoarea iniţială a variabilei Var1 este 1, la sfârşitul execuţiei buclei FOR din
programul de mai jos, valoarea variabilei Erg va fi 32.
FOR Counter:=1 TO 5 BY 1 DO
Var1:=Var1*2;

55
AUTOMATE PROGRAMABILE vol. I

END_FOR;
Erg:=Var1;

La utilizarea buclei FOR trebuie avut în vedere următoarele limitări:


În cazul în care <Pas> este pozitiv <valoare_initiala> trebuie să fie mai mică decât
<valoare_finala> şi mai mare, în cazul în care pasul este negativ, <valoare_finala>+<Pas> trebuie
să fie mai mică decât valoarea maximă a unui întreg sau a unui întreg în dublă precizie în mediul în care
se face programarea.
II.3.3.2. INSTRUCŢIUNEA DE REPEAT
Instrucţiunea REPEAT are ca efect prelucrarea repetată a unei secvenţe de instrucţiuni până la îndeplinirea
unei condiţii. Condiţia de terminare a execuţiei este exprimată sub forma unei expresii logice şi este
evaluată la sfârşitul ciclului. În consecinţă instrucţiunile din corpul ciclului se execută cel puţin o dată.
Forma generală a instrucţiunii este:
REPEAT
<Instructiuni>
UNTIL <Expresie booleană>
END_REPEAT;

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;

II.3.3.3. INSTRUCŢIUNEA WHILE


Instrucţiunea WHILE are ca efect prelucrarea repetată a unei secvenţe de instrucţiuni controlată de o
condiţie. Condiţia de terminare a execuţiei este exprimată sub forma unei expresii logice şi este evaluată
la începutul ciclului. În consecinţă este posibil ca instrucţiunile din corpul ciclului să nu se execute
niciodată. Forma generală a instrucţiunii este:
WHILE <Expresie booleana > DO
<Instructiuni>
END_WHILE

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;

II.3.3.5. INSTRUCŢIUNEA CONTINUE


Instrucţiunea CONTINUE este utilizată pentru terminarea execuţiei curente a corpului unei bucle (FOR,
WHILE, REPEAT).

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;

II.3.4. STUDIU DE CAZ


Problemă: Să se realizeze o procedură de interpolare liniară, care să întoarcă valoarea cantităţii de lichid
dintr-un rezervor. Experimental s-au determinat pentru rezervor 10 perechi de puncte care reprezintă
cantitatea de lichid în funcţie de informaţia, în unităţi convertor sau în mA, provenită de la traductorul
de presiune montat pe fundul rezervorului. Aceste perechi de puncte sunt introduse în memoria unui
automat prin intermediul unui panou operator.
Soluţie: Datele experimentale, pentru un rezervor, sunt introduse într-o matrice cu două rânduri şi 10
coloane, având pe primul rând valorile obţinute experimental de la traductoare în unităţi convertor , iar
pe rândul al doilea valorile corespunzătoare, în litri, ale conţinutului rezervorului. Elementele acestei
matrice sunt transferate în procedură (Matricea C). De asemenea se transferă în procedură valoarea unei
informaţii momentane obţinută de la traductorul de presiune (Trad), pe baza căreia se va calcula, prin
interpolare liniară, valoarea momentană a cantităţii de lichid din rezervor. Pentru aceasta se va stabili
mai întâi intervalul în care se găseşte mărimea Trad. Presupunând că această mărime este x şi se situează
în intervalul ( xi , xi +1 ] , cărora le corespund valorile ( yi , yi +1 ] , formula pentru determinarea valorii y prin
interpolare liniară este:
yi +1 − yi
y( x) = yi + m( x − xi ), unde: m = .
xi +1 − xi

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

C: ARRAY [1..2,1..10] OF REAL;


Trad: INT;
END_VAR
VAR_OUTPUT
Cant: REAL;
Error: BOOL;
END_VAR
VAR
ValT: REAL;
I: INT;
m: REAL;
END_VAR
ValT := Trad/1.0; (* Transformarea in REAL a valorii*)
Error := TRUE; (* Setarea variabilei de eroare *)
IF ValT > C[1, 1] AND ValT <C[1, 10]
THEN
Error := FALSE; (* Testul daca valoarea este falsa *)
END_IF;
FOR I := 1 TO 10 DO (* Testul incadarii intr-o zona *)
IF (ValT < C[1, I+1] AND ValT >= C[1, I])
THEN
EXIT;
END_IF;
END_FOR; (* Calculul pantei deptei de aprox.*)
m := (C[2, I+1] - C[2, I])/(C[1, I+1] -C[1, I]);
(* Determinarea cantitatii de lichid *)
Cant := C[2, I]+ m*(ValT-C[1, I]);

Fig. II.5. Programul pentru rutina de interpolare liniară

59
AUTOMATE PROGRAMABILE vol. I

II.4. LIMBAJUL LAD (LAdder Diagram)


II.4.1. INTRODUCERE
Limbajul Ladder Diagram (LAD) este un limbaj grafic. El este utilizat pentru realizarea aplicaţiilor de
către programatorii, care au experienţe anterioare în proiectarea aplicaţiilor cu contacte şi relee. El este,
de fapt, o reprezentare grafică a ecuaţiilor booleene, realizând o combinaţie între contacte (variabile de
intrare) şi bobine (variabile de ieşire).
Simbolurile grafice ale limbajului sunt plasate în suprafața de lucru (diagramă) în mod asemănător cu
plasarea contactelor şi releelor într-o schemă electrică.
La elaborarea unui program în LAD nu este nevoie ca el să fie scris sub forma unei funcții, el putând să
apară direct în programul ciclic. Dacă programatorul elaborează o funcție în limbaj LAD aceasta trebuie
apelată, iar la apel i se asociază un bloc de date.
În fig.II.6 este prezentată o schemă cu contacte și relee, iar în fig. II.7 programul în limbajul LAD care
implementează pe un automat, schema cu contacte și relee. Unele implementări ale limbajului LAD chiar
păstrează obiecte asemănătoare cu cele din schemele cu contacte şi relee. Unul din avantajele utilizării
automatelor programabile şi a limbajului LAD este că, odată ce semnalul de intrare a fost preluat în
automat pentru a fi utilizat în program, acesta se poate utiliza ca mai multe contacte şi fiecare din ele
poate fi normal închis sau normal deschis.

B
I1 I3
I2

Fig. II.6. Schemă electrică cu contacte și relee

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ă

Fig. II.7. Schemă electrică și reprezentarea ei în LAD


Un program în limbajul LAD este alcătuit din reţele, care utilizează simboluri grafice (obiecte ale
limbajului). Fiecare reţea constă din mai multe obiecte ale limbajului conectate între ele având mai multe
ramuri. O rețea trebuie să aibă la început cel puțin o instrucțiune de intrare și la sfârșit cel puțin o
instrucțiune de ieșire.

60

S-ar putea să vă placă și