Programarea Unei Masini Automate de Sortat Caractere

INTRODUCERE

Încă din cele mai vechi timpuri omul a fost nevoit să utilizeze în viața lui o multitudine de operații de transport, sortare și procesare a diferitelor mărfuri, alimente, materiale de construcție și multe altele.

Sistemele de tip conveior au o origine foarte îndepărtată, fiind folosite încă din cele mai vechi timpuri, de la vechii egipteni care pentru construirea impunătoarelor piramide, se presupune că utilizau pentru transportul blocurilor imense de piatră bușteni de lemn așezați unul lângă celălalt precum rolele unui conveior. Mai târziu, odată cu evoluția tehnologiei putem nota și o evoluție a acestor sisteme. Atât forma cât si modalitatea de transport s-a diversificat foarte mult apărând conveioare melcate, conveioare cu bandă, conveioare cu bandă modulară, conveioare verticale, dar conveioarele nu s-au diversificat doar din punct de vedere al suprafeței de transport ci și din punct de vedere al modului de acționare, existând conveioare acționate de motoare electrice, de motoare pneumatice sau chiar motoare diesel.

La fel ca și necesitatea de transport, necesitatea de sortare, a reprezentat o preocupare constantă a oamenilor. Dacă până la evoluția sistemelor automate de sortare, majoritatea operațiilor de sortare se făceau manual de către operatori, dezvoltarea sistemelor automate cât și a sistemelor foto și video urma să schimbe total fața acestor procese.

Apariția și perfecționarea sistemelor de tip „machine vison” și implementarea acestor sisteme în cadrul sistemelor de tip conveior a fost un pas important în încercarea de automatizare a proceselor.

Aceste sisteme, fie că sunt implementate în celule de producție, fie că funcționează de sine stătătoare, sunt regăsite la scară globală, în fiecare unitate de producție, fără ele procesele desfășurându-se la o viteză mult mai mică.

CAPITOLUL 1

AUTOMATE PROGRAMABILE

1.2 Descrierea automatelor programabile

Apărute la începutul anilor 1960 ca o alternativă pentru sistemele automate cablate pe bază de relee electromagnetice, automatele programabile sunt echipamente electronice destinate realizării instalațiilor de comandă secvențiale în logică programată.

Bradford Associates au realizat in anul 1968 primul automat programabil în varianta industrială, Modicom 084, pentru compania GM, urmând ca în anul 1971 Allen-Bradley să realizeze modelul 1774 PLC tot pentru aceeași companie.

Primele automate programabile apărute utilizau tehnologia microprocesoarelor cu prelucrare pe un bit urmând ca în anii 80 să apară primele automate programabile cu microprocesoare cu prelucrare pe cuvânt, tot în această perioadă s-a început standardizarea protocoalelor de comunicație. [2]

Automatele programabile sunt alcătuite dintr-o parte hardware și o parte de software. Partea de hardware este alcătuită din sursă de alimentare, module de intrări/ieșiri și unitatea centrală, care conține la rândul ei procesorul, memoria de program, memoria de date și interfața de comunicare cu sistemul de programe. Partea software fiind reprezentată de programele utilizate, acestea fiind executate ciclic.

Fig 1.1 Execuția ciclică a programelor

Până în prezent capabilitățile automatelor programabile au evoluat foarte mult, având capabilități de conectare în rețea sau capabilități de comunicare serială. Modulele de recunoaștere a formelor, modulele de reglare PID si fuzzy, module de poziționare și control al mișcării sau module de ieșiri analogice sunt încă câteva dintre abilitățile automatelor programabile utilizate în prezent.

În funcție de flexibilitatea lor, automatele programabile se pot clasifica în trei categorii: compact, compact și extensibil sau modular.[2]

Tipul compact are o structură fixă ne putând fi modificată sau extinsă de către utilizator.

Automatul programabil de tip compact și extensibil le permite utilizatorilor să adauge un număr limitat de intrări și/sau ieșiri în funcție de necesitatea aplicației.

Automatul programabil de tip modular oferă cea mai mare flexibilitate, o largă varietate de module de fiecare tip, atât de intrare cât și de ieșire, cu care utilizatorul poate modela un sistem cât mai aproape posibil de cerințele pe care le are aplicația.

1.2 Limbaje de programare

IEC (International Electrotechnical Commission) este o organizație non-guvernamenală și non-profit care concepe și publică standarde internaționale pentru domeniul electric, electronic și tehnologic.

IEC 61131, cunoscut înainte de schimbarea sistemului de numerotare ca 1131, este un standard pentru automatele programabile. Acest standard este divizat in 9 subdiviziuni:

Informații generale

Echipamente necesare și teste

Limbaje de programare

Informații pentru utilizator

Comunicații

Funcționare în condiții de siguranță

Program pentru control Fuzzy

Informații pentru implementarea limbajelor de programare

Interfață de comunicare cu micro-senzori si actuatoare

Standardul IEC 61131-3 este un standard care definește sintaxa unui limbaj de programare și structura logică a acestuia. Acest standard definește cinci limbaje de programare pentru automatele programabile[1]:

Diagrama Scară (Ladder Diagram)

Lista de Instrucțiuni (Instruction List)

Textul Structurat (Structured Text)

Diagrame cu Blocuri Funcționale (Function Blocks Diagrams)

Diagrame de Stare Secvențiale (Sequential Function Charts)

Diagrama scară (LD) este unul dintre cele mai folosite limbaje de programare a automatelor programabile. Este un limbaj de programare are a înlocuit schemele de comandă cu relee. Diagramele scară presupun transpunerea imediată, folosind simbolurile grafice pentru contacte, bobine, noduri, a schemelor de automatizare echivalente realizate cu contacte si relee, acest lucru permițând introducerea iterativă și rapidă a schemelor de comandă în formă clasică. În acest limbaj de programare liniile verticale reprezintă tensiunea de alimentare, între cele două linii existând linii orizontale care reprezintă liniile de program. Pe aceste linii putând-se regăsii simboluri pentru contacte normal închise sau normal deschise, numărătoare, temporizatoare, ieșiri ale procesului sau funcții de apelare speciale.

Fig 1.2 Diagramă scară

Lista de instrucțiuni (IL) este unul din cele 5 limbaje de programare din standardul IEC 61131-3. Această metodă utilizează instrucțiuni foarte simple, aproape similare cu cele scrise cu mnemonice, unii dintre cititori găsind similarități cu instrucțiunile in limbaj de asamblare. Este un limbaj de programare de nivel inferior așadar oferă o foarte mare flexibilitate. Cel mai mare dezavantaj al acestui limbaj este că este foarte greu de urmărit în cadrul programelor mai complexe.

Fig 1.3 Listă de instrucțiuni

Textul structurat (ST) este un limbaj de programare pentru automatele programabile de nivel mediu. Este un limbaj structurat pe blocuri, este foarte asemănător cu limbajul Pascal, pe baza căruia este și construit. Nu este un limbaj de programare foarte utilizat, utilizându-se în general pentru declararea blocurilor funcționale.

Fig 1.4 Text structurat

Diagrama cu blocuri funcționale (FBD) este un limbaj grafic de programare al automatelor programabile care poate descrie funcția dintre variabilele de intrare și variabilele de ieșire, aceasta funcție fiind reprezentată de către un set de blocuri elementare precum AND, OR, MOVE. Semnalele de intrare sau de ieșire se conectează la aceste blocuri, însă există și posibilitatea înserierii lor.

Fig 1.5 Diagramă cu blocuri funcționale

Diagrama de Stare Secvențiale (FSC) este un limbaj de programare grafic care face posibilă descrierea comportamentului secvențial al procesului. Este dezvoltat pe baza limbajului de programare grafica Grafcet. Unul dintre marile avantaje ale acestui limbaj de programare este că face posibilă vizualizarea permanentă a stărilor sistemului. În esență programul constă într-un număr de pași interconectați prin tranziții.

Fig 1.5 Diagramă de stare secvențială

1.3 Elaborarea programului

Programele de automatizare trebuie să fie in așa fel concepute încât să fie foarte bine structurate, foarte bine documentate, sistematice, să conțină cât mai puține erori iar costurile privind mentenanța să fie cât mai mici posibil.

Procesul de dezvoltare al unui program software este prezentat în figura de mai jos:

Fig 1.7 Procesul de dezvoltare al unui program software

Acest model poate fi utilizat pentru orice tip de aplicatie, în cazul aplicațiilor complexe fiind chiar indicată utilizarea acestei metode[5].

Pasul 1: Formularea problemei. În acest pas sunt precizate și descrise amănunțit nevoile de control pe care le necesită procesul. Descrierea specifică a funcțiilor de control ale sistemului evidențiază anumite conflicte între cerințe sau înțelegerea greșită sau incompletă a unor specificații.

Pasul 2: Design-ul. Este un concept dezvoltat pe baza informațiilor de la pasul 1.

Pasul 3: Realizarea. Reprezintă transpunerea conceptului creat la pasul anterior într-un program de control concret realizat prin intermediul unuia dintre limbajele de programare specificate in standardul ICE 61131-3.

Pasul 4: Testarea. În această etapă este testată interacțiunea dintre sistemul de automatizare și echipamentul pe care îl conduce. În cazul aplicațiilor complexe este indicată verificarea sistemului pas cu pas, utilizând această metodă pot fi identificate foarte ușor erorile prezente fie în sistem fie în programul de comandă.

1.4 Modul de funcționare al programului

Funcționarea unui automat programabil se bazează pe scanarea programată a intrărilor și ieșirilor sale. Procesul de scanare prezintă 3 etape care formează ciclul program[1]:

Testarea intrărilor. Automatul programabil scanează fiecare intrare pentru a stabilii starea acestora. Altfel spus se verifică dacă senzorii și întrerupătoarele conectate la intrări sunt active sau nu, această informație urmând să fie stocată în memoria automatului programabil

Execuția programului. La acest pas instrucțiunile programului rulat de către automatul programabil sunt executate într-un mod secvențial, adică instrucțiune după instrucțiune. Ca urmare a acestui pas se pot activa ieșiri, biți de memorie, se pot activa numărătoare sau temporizatoare.

Testarea ieșirilor. La final automatul programabil verifică starea ieșirilorși modifică starea acestora dacă este necesar. Aceste modificări se bazează pe starea intrărilor citite la primul pas și pe rezultatele execuției programului de la pasul doi.

După finalizarea acestor trei pași automatul reia de la început succesiunea acestor pași.

Timpul în care cei trei pași sunt executați de către automat reprezintă timpul de scanare sau durata ciclului, aceasta fiind o caracteristică importantă a sistemului. Durata ciclului program variază de obicei între 10-50 ms, această variație fiind dată de către dimensiunea programului și viteza procesorului.

Datorită structurării ciclului program în acești trei pași pot apărea anumite decalaje între intrări și ieșiri. Având o ieșire care trebuie să fie activată imediat de către o intrare poate exista situația în care intrarea să fie activă după ce s-a făcut scanarea intrărilor, așadar ieșirea corespunzătoare nu v-a fi activată in ciclul program curent ci numai în următorul. Această situație poate deveni problematică in cazul unor module comandate la distanță.

Fig 1.8 Efectul programului asupra timpului de răspuns

O altă componentă importantă în execuția programului o reprezintă subrutinele aceste sunt secvențe de instrucțiuni destinate rezolvării unor probleme specifice. Ele sunt apelate recursiv, execuția lor fiind determinată de o instrucțiune de apel al subrutinei. În momentul apelării subrutinele din programul principal, instrucțiunea următoare instrucțiunii de apel nu se execută decât după revenirea din subrutină, revenirea în programul principal realizându-se printr-o instrucțiune de revenire in programul principal.

Fig 1.9 Utilizarea subrutinelor

Ramificațiile sunt structuri de program ce permit salturi (condiționate sau necondiționate) în program peste un grup de instrucțiuni. Pot fi distinse următoarele tipuri de salturi: absolute (înainte, înapoi, la o adresă dată) sau relative (peste un număr dat de instrucțiuni).

Repetițiile permit execuția în mod repetat a unui grup de instrucțiuni de un număr predeterminat de ori. Cea mai utilizată structură repetitivă este cea de tip DO. Ea are forma generală DO n… END și determină execuția de n ori a instrucțiunilor cuprinse între DO și END.

Fig 1.10 Utilizarea salturilor și a structurii repetitive DO

Există aplicații în care este necesar din partea automatului programabil un timp de reacție mai rapid decât cel dat de către durata ciclului program. Este cazul așa numitelor evenimente urgente. Una din cele mai eficiente soluții de tratare a lor o reprezintă transferul prin întreruperi. Sursele posibile de întreruperi sunt conectate (individual sau prin intermediul unor porți SAU) la liniile de întreruperi ale automatului programabil. Procesorul unității centrale analizează automat starea acestor linii după execuția fiecărei instrucțiuni, dacă detectează o cerere de întrerupere, el suspendă execuția programului în curs și salvează(într-o zonă de memorie prevăzută special pentru asemenea situații) toate informațiile necesare reluării ulterioare a execuției programului întrerupt în același context. După aceasta, procesorul trece la execuția unei subrutine aparte, corespunzătoare evenimentului care a generat întreruperea. Odată executată această subrutină, execuția programului principal este reluată din punctul în care a fost întrerupt.

CAPITOLUL 2

Limbajul de programare Python

2.1 Informații generale

Python este un limbaj de programare dinamic multi-paradigmă, creat în 1989 de programatorul olandez Guido van Rossum. Van Rossum este și în ziua de astăzi un lider al comunității de dezvoltatori de programe care lucrează la perfecționarea limbajul Python și implementarea de bază a acestuia, CPython, scrisă în C. Python este un limbaj multifuncțional folosit de exemplu de către companii precum Google sau Yahoo pentru programarea aplicațiilor web, însă există și o serie de aplicații științifice sau de divertisment programate parțial sau în întregime în Python. Popularitatea în creștere, dar și puterea limbajului de programare Python au dus la adoptarea sa ca limbaj principal de dezvoltare de către programatori specializați și chiar și la predarea limbajului în unele medii universitare. Din aceleași motive, multe sisteme bazate pe Unix, inclusiv Linux, BSD și Mac OS X includ din start interpretatorul CPython.[7]

2.2 Programarea in Python

Python pune accentul pe curățenia și simplitatea codului, iar sintaxa sa le permite dezvoltatorilor să exprime unele idei programatice într-o manieră mai clară și mai concisă decât în alte limbaje de programare. În ceea ce privește paradigma de programare, Python poate servi ca limbaj pentru software de tipul orientat pe obiecte, dar permite și programarea imperativă, funcțională sau procedurală. Sistemul de tipizare este dinamic iar administrarea memoriei decurge automat prin intermediul unui serviciu de management de memorie automatizat (garbagecollector). Alt avantaj al limbajului este existența unei ample biblioteci standard de metode.

Din punctul de vedere al sintaxei, Python are un număr de construcții și cuvinte cheie cunoscute oricărui programator, dar prezintă și un concept unic: nivelul de indentare are semnificație sintactică. Blocurile de cod sunt delimitate prin simplă indentare. Dacă în C blocurile de cod sunt delimitate cu „Begin” și „End” sau cu ajutorul acoladelor, {<cod>}, în python aceste construcții nu mai sunt necesare, rolul lor fiind îndeplinit de indentare. Acest mod de structurare al programului este surprinzător pentru utilizatorii noi de python, chiar dacă aceștia sunt programatori cu experiența. Folosirea indentării, însă, pentru delimitarea blocurilor de program este foarte bună ea ajutând la structurarea codului sursă și la evidențierea funcționalității acestuia.

În python, spre deosebire de C, declararea variabilelor nu este necesară, tipul acestora ne fiind specificat la momentul declarării acestora urmând să fie determinat de către interpretor în funcție de conținutul lor și de operațiile ce sunt executate.

Pe lângă tipurile tradiționale de date python aduce și câteva concepte noi, printre acestea putem enumera listele, care nu sunt statice. Acestea pot conține mai multe tipuri de date, aceste date putând fi modificate fără a fi necesară utilizarea funcțiilor de manipulare a memoriei.

Python are o largă gamă de librării, acest lucru fiind cunoscut și ca unul dintre cele mai importante atuuri ale limbajului. Aceste librării sunt prezente datorită conceptului „batteriesincluded”, concept explicat prin faptul că dezvoltatorii programului consideră că un limbaj de programare nu prezintă utilitate practică dacă nu are un set de biblioteci importante pentru majoritatea dezvoltatorilor.

În ianuarie 2015, a treia generație a limbajului python cuprindea mai mult de 54000 de librării cu o largă gamă de funcționalitate. Printre acestea putem enumera librarii utilizate pentru: interfața grafică cu utilizatorul, multimedia, baze de date, rețele și comunicați, calcul științific, procesare de text, procesare de imagini.

CAPITOLUL 3

Programarea automatului programabil

Siemens Simatic S7-300

Realizarea programului

Automatul programabil Siemens Simatic S7-300 este un controler sepcial creat pentru implementarea soluțiilor inovatoare de producție, în special pentru industria automotivelor și cea a ambalării produselor.

Acest automat programabil modular este ideal atât pentru sistemele centralizate cât și cele necentralizate.

Fig 3.1 Siemens Simatic S7-300

În Step 7 un program pentru o anumită aplicație poate fi realizat în mai multe moduri:

Fig 3.2 Moduri de realizare ale aplicațiilor

În cazul aplicațiilor mai complexe este indicată configurarea componentelor hardware înainte de crearea programului. Un avantaj în acest caz îl reprezintă faptul că Step 7 permite la „Hardware configuration editor” afișarea adreselor disponibile, lucru ce nu este posibil în cazul alegerii celei de a doua metode[6]. Dacă se preferă utilizarea celei de a doua metode utilizatorul este nevoit să aleagă fiecare adresă în funcție de componentele selectate.

În urma analizei făcute asupra sistemului și a modului de funcționare a procesului automat s-au realizat schema de programare regăsită în Anexa2 și tabelele care cuprind semnalele de intrare, respectiv semnalele de ieșire. Aceste tabele conțin informații despre semnalele de intrare/ieșire, cum ar fi:

Numele prescurtat

Tipul semnalului

Tipul contactului, pentru semnalele de intrare

Parametrii electrici

Numele complet al semnalului

Descrierea semnalului

Tabelul 3.1 Lista semnalelor de intrare

În continuare se va întocmii tabelul care cuprinde semnalele de ieșire și descrierea acestora.

Tabelul 3.2 Lista semnalelor de ieșire

În continuare se va realiza programul în limbaj diagramă scară utilizând portalul „Totally integrated automation PORTAL”. TIA Portal este un portal de programare care înglobează numeroase componente Simatic într-o aplicație program care are ca scop creșterea productivității și a eficienței.

Produsele TIA lucrează împreună cu portalul TIA pentru crearea și dezvoltarea produselor de automatizare. O soluție de automatizare modernă include:

Un automat programabil pentru controlul procesului

O interfața om-mașină pentru operarea și vizualizarea procesului

TIA oferă o vizualizare orientată pe sarcini. Rolul acesteia este oferirea unei navigări simple între sarcini si datele proiectului. Astfel pe pagina de pornire putem regăsi o zonă cu funcții de bază, o zonă cu acțiuni disponibile în cadrul funcției selectate sau o zonă care conține un tabel cu proiectele existente.

Fig 3.3 Pagina de start a portalului TIA

După cum se poate observa și în Fig 3.2 din pagina de start a portalului se poate alege crearea unui nou proiect, modificarea unuia existent, mutarea acestuia sau închidera unui proiect deschis anterior.

Dacă se alege crearea unui nou proiect trebuie parcurși o serie de pași cum ar fi denumirea proiectului, locația acestuia, eventuale comentarii și autorul proiectului.

Fig 3.4 Crearea unui proiect nou

La următorul pas avem posibilitatea de a crea un program sau de a realiza configurația hardware.

Fig 3.5 Posibilități oferite la crearea sau deschiderea unui proiect

Următoarea etapă în dezvoltarea proiectului este configurarea în interiorul portalului TIA a configurației hardware existente.

Componentele hardware necesare pentru acest proiect sunt urmatoarele:

Tabelul 3.1 Componente hardware

În tabelul de mai sus se poate observa că s-au folosit doua module de intrare/ieșire. Pentru minimizarea costurilor modului cu 16 intrări digitale a fost înlocuit cu un modul de teste cu întrerupătoare existent în laborator, modul folosit și pentru simularea subprogramelor. Deoarece acest modul nu este cuprins în catalogul de produse existente în TIA acesta poate fi utilizat doar dacă este declarat în configurația hardware ca un modul normal de intrate/ieșire.

Pentru a adăuga o componentă hardware în sistemul dorit se caută modulul dorit in lista catalog și se dă dublu click.

Fig 3.6 Adăugarea componentelor pentru configurarea hardware

Unele module precum sursele de tensiune sau unitățile centrale au poziția stabilită aceasta ne putând fi aleasă de către programator. În schimb pentru modulele de intrare/ieșire programatorul poate stabilii poziția pe șină.

În urma selectării unui modul plasat deja pe șina se pot obține informatții referitoare la modulul selectat, diagnosticarea problemelor apărute, sau proprietăți ale acestui modul în fereastra din partea de jos a ecranului.

În cazul modulelor de intrare/ieșire prin selectarea modulului dorit programatorul are posibilitatea de a modifica adresa de octet a modului selectat. În funcție de tipul modului selectat calculul octetului de final al modulului este realizat automat în funcție de adresa de început introdusă de către programator.

Fig 3.7 Adresarea modulelor de intrare/ieșire

Aceste valori sunt utilizate pentru identificarea intrărilor și ieșirilor. La automatele programabile Simatic S7 ale companiei Siemens, identificarea unei intrări sau ieșiri se realizează utilizând numarul de octet respectiv numarul de bit al intrării sau ieșirii respective. Intrările sunt notate cu I iar ieșirile cu Q. Astfel o intrare în S7 are forma %I a.b, iar o ieșire este de forma %Q a.b, unde a reprezintă numărul de octet iar b reprezintă numărul bitului. Spre exemplu %I 2.7 este intrarea conectată la ultimul bit al octetului 2.[4]

Dacă programatorul nu dorește atribuirea adreselor pentru fiecare modul, în momentul plasării lui pe șină programul îi atribuie automat o adresă

După adăugarea tuturor modulelor necesare și după ce s-au stabilit adresele lor este posibilă conectarea automatului programabil într-o rețea cu mai multe automate programabile sau se poate vizualiza poziția acestuia în cadrul unei rețele în cazul în care acesta face parte deja dintr-una, acest lucru poate fi realizat in cadrul secțiunii „Network view”

Configurarea finală a componentei hardware este prezentată în următoarea figură:

Fig 3.8 Configurarea finală a automatului programabil

În continuare se vor crea si completa tabelele cu variabile și constante. Aceste tabele conțin date referitoare la variabilele și constantele ce urmează să fie utilizate în program. Acestea conțin informații precum: numele variabilei sau constantei, tipul ei, adresa acesteia și anumite comentarii. În plus mai este posibilă stabilirea vizualizării sau modificării lor prin intermediul interfeței om-mașină. Dacă o variabilă este folosită în program și nu este memorată în unul dintre tabelel de variabile programul o va adăuga în tabelul de variabile prestabilit.

Fig 3.9 Tabele de variabile

După realizarea configurației hardware și a tabelelor de variabile respectiv constante se poate trece la scrierea în limbaj diagramă scară a programului de automatizare. În cazul automatelor Simatic S7 programul poate fi structurat cu ajutorul blocurilor de program. Odată cu crearea proiectului se crează și un bloc de program cu numele „Main[OB1]”. Acesta este un bloc organizațional, din interiorul acestui bloc se vor apela toate blocurile de program, excepție făcând doar blocurile organizaționale.

Fig 3.10 Blocul de program MAIN

„Complet restart[OB100]” este un alt bloc organizțional utilizat. Acest bloc se rulează o singură dată la prima rulare a programului. Acesta este utilizat in cadrul proiectului pentru resetarea memoriilor interne ale automatului.

Există și alte blocuri organizaționale acestea se pot crea din subramura „Program blocks” accesând „Add new block”

Fig 3.11 Blocuri organizaționale

Pentru structurarea cât mai eficientă a programului pe lângă blocurile organizaționale mai există încă 3 tipuri de blocuri de program:

Blocuri de funcții (FB)- Acestea sunt blocuri de cod care își stochează permanent valorile în blocuri de date, astfel că acestea rămânând disponibile și după execuția blocului.

Fig 3.12 Blocuri de funcții

Funcții (FC)- Acestea sunt blocuri de cod sau subrutine fără memorie dedicată. Ca și în cazul FB la crearea blocului se poate selecta limbajul în care acesta urmează să fie scris. De asemenea aceste blocuri au un număr de ordine care poate fi setat automat sau manual.

Fig 3.13 Funcții

Blocuri de date (DB)- Acestea sunt zone de date din program care conțin date ale utilizatorului. Acestea pot fi globale sau pot fi instanțe de bloc de date.

Fig 3.14 Blocuri de date

În programul ce urmază să fie realizat se vor folosi următoarele blocuri de program:

Un bloc pentru resetarea completă a memoriilor interne ce urmează să fie utilizate (Complete restart[OB100]). Acesta fiind necesar pentru a ne asigura că în momentul rulării programului, memoriile utilizate nu sunt setate pe valoarea logică 1.

Dupa cum se poate observa și în Fig 3.15 în cadrul blocului „Complete Restart” are loc resetarea fiecărei memorii în parte. Liniile de program sunt linii simple cu o singură condiție și anume: dacă memoria internă este setată pe valoarea 1 logic ea va fi resetată la valoarea 0 logic.

Fig 3.15 Blocul Complete Restart

De asemenea se va utiliza si blocul „Main” care este blocul principal de program. El este rulat ciclic, instrucțiunile scrise în el fiind executate în ordinea în care au fost scrise.

Cel mai folosit bloc de program este blocul de tip funcție (FC). S-a ales folosirea acestui bloc deoarece nu este necesară memorarea datelor obținute după executarea blocului.

Pentru o bună structurare a programumul și pentru a avea posibilitatea de a vizualiza cât mai bine și mai complet o operație atât în modul conctat cât și în modul deconectat se vor utiliza 10 blocuri de tip funcție (FC), structura programului fiind cea din figura 3.16

Fig 3.16 Structura programului

Toate elementele necesare scrierii programului în limbaj diagramă scară se gasesc grupate în fereastra cu instrucțiuni. Așadar în zona de instrucțiuni putem regăsii instrucțiunii pentru operații logice pe bit, numărătoare, temporizatoare, instrucțiuni de apelare, instrucțiuni pentru calcul matematic sau chiar instrucțiuni pentru algoritmi PID.

Fig 3.17 Fereasta cu instrucțiuni

Unele dintre aceste instrucțiuni putând fi adăugate într-o listă de „Favorites” pentru a avea acces cât mai rapid la ele. În această listă fiind adugate automat la instalarea programului butoane pentru contactele normal închise sau normal deschise sau instrucțiuni de resetare a memoriilor interne.

Modul de funcționare al automatizării este urmatorul: Blocurile inscripționate aflate inițial în tubul acumulator sunt desfășurate pe rând, cu ajutorul cremalierei. Aceasta împinge blocul inscripționat pe liftul numărul 1. Banda liftului 1 pornește în momentul pornirii motorului care acționează cremaliera și se oprește în momentul detectării piesei de către senzorul de prezență piesă aflat pe liftul 1. Banda liftului repornește, transportând piesa pe conveiorul de jos în momentul în care senzorul de prezență piesă de la începutul conveiorului de jos nu detectează vre-o piesă. Dacă senzorul de prezență piesă al tubului acumulator detectează piesă în tub și pe liftul 1 nu se găseste nici o piesă atunci piesa este scoasă pe liftul 1. La fiecare acționare a motorului M5 în față un numărator, setat inițial la valoarea 0, este incrementat, aceasta deoarece este necesar să se cunoască numarul de piese scoase din tubul acumulator. Alte doua contoare sunt incrementate de aceeași acțiune. Acestea sunt necesare pentru a ști dacă pe conveior se găsesc piese și câte din acestea au ajuns pe conveiorul de sus. Asadar unul este decrementat la trecerea pieselor prin raza de acțiune a senzorului de prezență piesă de la sfârșitul conveiorului de jos respectiv la începutul conveiorului de sus.

Piesa ajunsă pe conveiorul de jos este transportată până la sfârșitul acestuia, banda conveiorului oprindu-se în momentul ajungerii piesei la senzorul de prezență piesă de la capătul conveiorului. Aceasta reporneste dacă liftul 2 este în poziția de jos și nu are piesă pe el. Piesa este transportată de liftul 2 pe conveiorul de sus care o transportă până când piesa este detectată de către senzorul de prezență piesă de la capătul conveiorului de sus. În momentul întreruperii fasciculului acestui senzor piesa este poziționată pentru capturarea imaginii. După ce imaginea capturată de Raspberry Pi este procesată si analizată de către Tessaract se primește un semnal de piesă bună sau piesă rea. Dacă piesa este bună ea este transportată de către liftul 1 înapoi in tubul acumulator, iar dacă este rea este transportă de același lift înapoi pe conveiorul de jos.

Fig 3.18 Schema de execuție a programumului

De asemenea, în momentul în care o piesă este detectată de senzorul de prezență piesă din capătul conveiorului de sus, pe lângă comanda de preluare a imaginii se mai dă o comandă pentru liftul 1, care primește comanda de a urca la poziția din mijloc pentu a fi pregătit să preia piesa care este analizată.

La finalizarea procesului de sortare sistemul revine la starea inițială, și anume, liftul 1, respectiv liftul 2 la pozițiile de jos, iar cremaliera în poziția retrasă, toate benzile transportoare, atât de pe lift cât si de pe conveioare vor fi oprite.

Fiecare bloc FC conține instrucțiunile și condițiile necesare executării unei anumite acțiuni. De exemplu blocul [FC2] Rack cuprinde liniile de cod necesare pornirii și opririi mototului M5 în funcție de cerințele procesului la un moment dat, dar și alte condiții necesare pentru rularea în continuare al programului principal.

Fig 3.19 Rack [FC2]

În prima linie de cod avem următoarea condiție: în momentul ajungerii primei piese la senzorul de la sfârșitul conveiorului de sus se activează o memorie internă care este folosită pentru oprirea cremalierei. Astfel cuvântul sortat poate fi construit în tubul acumulator, fără ca o piesă reintrodusă sa fie scoasă din nou.

În ce a de a doua linie avem condițiile de acționare ale mototului care acționează cremaliera, Mot5, în direcția în față. Condițiile în care motorul funcționează în această direcție sunt următoarele: senzorul de prezență piesă din tubul acumulator să detecteze o piesă, să nu fie activă memoria interna %M10.1, care ne arată dacă piesa a fost reintrodusă in tub, liftul 1 să se găsească în poziția de jos, cremaliera să fie în poziția retrasă, pe liftul 1 să nu se găsească piesă si memoria de stop, %M10.0, sa nu fie pe 1 logic. Funcționarea motorului este automenținută de ea însăși. Condițiile de întrerupere ale acțiunii pot fi: ajungerea piesei scoase în raza de acțiune a senzorului de prezență piesă sau activarea memoriei M10.0

În următoarea linie sunt prezentate condițiile în care motorul M5 merge în spate. Dacă motorul M5 nu merge în față iar fasciculul senzorului de poziție al cremarielei nu este întrerupt, atunci motorul merge înapoi până la întretuperea acestui fascicul.

În ultima linie de program a blocului se poate observa că la fiecare deplasare în față a motorului M5, numătătoarele %C0, %C1, %C2 sunt incrementate. Aceste numărătoare fiind folosite pentru a știi numărul de piese existente într-o anumită zonă a sistemului la un moment dat. Ele au fost setate cu valoarea 0 în cadrul blocului „Main”. Programul complet al automatului programabil poate fi găsit în Anexa3.

Fig 3.20 Setarea valorii numărătoarelor

Aceste blocuri de tip funcție odată create trebuie apelate din cadrul blocului „Main”

Fig 3.21 Apelarea blocurilor de tip Funcție

FC sunt apelate în cadrul blocului „Main” cu ajutorul instrucțiunii „call blcok”. Cu ajutorul acestei instrucțiuni putând fi apelate doar funcțiile fără parametri.

În cadrul blocului „Main” acestea sunt apelate la activarea memoriei %M10.2. Aceasta este o memorie de start, ea fiind folosită și cu scopul de a prevenii accidentele prin apăsarea în timpul funcționării procesului a butobului de start.

3.2 Simularea și testarea programului

După realizarea programului este necesară simularea acestuia pentru a se depista eventualele erori. Acest lucru este posibil cu ajutorul programului PLCSIM, acesta fiind conținut în cadrul portalului TIA.

Pentru a putea utiliza programul PLCSIM din cadrul TIA este necesară trecerea în modul conectat. După ce se deschide PLCSIM din tabul „Online”, secțiunea „Simulation”, se trece în modul conectat aceasta facându-se prin accesarea butonului „Go Online” si realizarea configurației necesare.

În cadrul ferestrei „Go Online” putem observa informații referitoare la sistemul nostru, starea conexiunii si putem de asemenea să facem setările dorite. În partea de sus a ferestrei putem vizualiza un tabel care conține numele automatului programabil, tipul unității centrale, tipurile de conexiune posibile respectiv adresele acestora. Urmează apoi zona în care se poate face configurarea, se poate selecta tipul interfeței PG/PC (Profibus sau MPI), interfața PG/PC (în cazul simulării PLCSIM, iar în cazul testării automatul programabil) și conexiuni de rețea iar în partea de jos a ferestrei avem posibilitatea de a vizualiza starea sistemului.

Fig 3.18 Trecerea în modul Online și setarile necesare simulării

După realizarea acestor setări este necesară încărcarea programului. Acest lucru se realizează din cadrul tabului „Online” la secțiunea „Download to device”.

Fig 3.19 Încărcarea programului

Programul este compilat, iar în fereastra deschisă sunt afișate eventualele erori sau avertizări și blocurile de program dintre care programatorul poate alege pe care dorește să le încarce. În cazul simulării încărcarea programului este posibilă doar dacă simularea este oprită.

În cazul în care încărcarea progamului se face în automatul programabil în lista blocurilor de program, langă fiecare bloc apare dacă acesta este încarcat în automatul programabil sau dacă nu este încărcat.

Fig 3.20 Situația blocurilor de program

După ce s-a realizat încărcarea programului se trece în programul PLCSIM. Aici inițial este afișată doar fereastra pentru unitatea centrală. Urmează afișarea ferestrelor pentru semnale, numărătoare si temporizatoare, aceasta fiind posibilă din cadrul tabului „Insert”.

Fig 3.21 Programul PLCSIM

După cum se poate observa și în Fig 3.21 este posibilă schimbarea modului de rulare al automatului programabil sau vizualizarea ledurilor de semnalizare. Pentru a activa sau dezactiva un semnal sau o ieșire este necesară doar selectarea sau deselctarea acestuia din cadrul ferestrei corespunzătoare.

De asemenea în cadrul acestui program se pot vizualiza valorile numărătoarelor și a temporizatoarelor. Este posibilă si schimbarea modului de afișare ale acestor informații, de exemplu datele oferite de numărătoare pot fi afișate în format binar, zecimal, hexazecimal sau sub format S7.

Atât în cadrul simulării cât și la testarea programului este utilă vizualizarea în timp real. Portalul TIA are implementată o asemnea funcție de vizualizare, care permite observarea în timp real a evoluției programului rulat.

Fig 3.22 Vizualizarea în timp real

CAPITOLUL 4

Programarea microcalculatorului Raspberry-Pi

Proiectul a inclus și un sistem de recunoaștere video, utilizat pentru recunoașterea caracterelor. Acest sistem a fost reprezentat de un ansamblu format dintr-un microcalculator Raspberry Pi model B+ și un modul dotat cu cameră foto, Raspbery Camera.

Fig 4.1 Raspberry Pi și Raspberry Pi Camera

Pentru programarea acestui sistem s-a utilizat limbajul de programare Python.

Programul pentru recunoașterea caracterelor utilizat este Tesseract OCR, acesta fiind un program dezvoltat de Google. Programul de recunoaștere al caracterelor urmând să fie apelat cu ajutorul Python.

În prima parte a programului se realizează importarea librăriilor necesare, ca de exemplu librăria pentru pinii GPIO („general purpose input/output”).

Pentru Raspbrry Pi este necesară setarea pinilor GPIO, ca pin de intrare sau ieșire.

GPIO.setmode(GPIO.BOARD)

GPIO.setwarnings(False)

GPIO.setup(11,GPIO.IN)

GPIO.setup(13,GPIO.OUT)

GPIO.output(13,True)

GPIO.setup(15,GPIO.OUT)

GPIO.output(15,True)

Utilizându-se un modul Raspberry Camera, este necesar să se realizeze și setările acestui modul în cadrul programului.[8]

camera=picamera.PiCamera() camera.resolution=(1280,1024) camera.color_effects=(128,128) camera.annotate_background = 'black'

Ce a dea treia comandă realizează setează preluarea de imagini în alb și negru, aceasta fiind necesară pentru obținerea unui timp cât mai scurt la prelucrarea imaginii.

După realizarea tuturor setărilor necesare se trece la formarea cuvântului cerut de către operator într-un tablou unidimensional.

Sistemul achiziționează o imagine în momentul în care primeste un semal de la senzorul de prezență piesă de la capătul conveiorului de sus. Acest semnal este transmis prin intermediul pinului GPIO 11. Pentru a prevenii eventuala achiziție de imagini atunci când nu este necesar și declanșarea camerei, din cauza unor interferențe exterioare, s-a utilizat metoda verificării duble a semnalului de intrare.

if (not GPIO.input(11)) and bNext: sleep(0.1)

if (not GPIO.input(11)) and bNext: camera.annotate_text = ''

sleep(1)

camera.capture('i.jpg')

Imaginea inițială nu are un contrast foarte mare, în acest caz recunoașterea caracterului ar dura foarte mult, pentru o recunoaștere mai rapidă de către Tesseract a caracterului s-a realizat mărirea contrastului imaginii inițiale.

getoutput('convert i.jpg -contrast-stretch 5%1% img.jpg')

După ce s-a realizat porcesarea imaginii, aceasta este analizată de către Tesseract, acesta urmând să furnizeze caracterul obținut într-un fișier text. Se verifică dacă acest caracter se potriveste în cadrul cuvântului ales de către operator, iar în cazul în care caracterul furnizat de către Tesseract coincide cu cel de pe poziția din vector verificată atunci se trimite un semnal de piesă bună prin pinul GPIO 13 urmând ca la următoarea citire caracterul furnizat să fie comparat cu următorul element al tabloului unidimensional, în caz contrar se trimite un semnal de piesă rea prin intermediul pinului GPIO 15 urmând ca următoarea citire să fie comparată cu aceași poziție din tabloul unidimensional.

Sfârșitul procesului de sortare este semnalizat prin emiterea aceluiași semnal pe ambii pini de ieșire, urmând apoi afișarea unui mesaj de final și oprirea camerei. În cadrul anexei 1 se poate găsi codul complet de program și se poate observa folosirea indenării cu rol de delimitare a blocurilor de program.

CONCLUZII

În cadrul acestei lucrări am încercat să prezint programarea unei mașini automate de sortat caractere. Programarea acestui ansamblu am separat-o în două părți importante:

Programarea automatului programabil Siemens Simatic S7-300 pentru controlul cinematicii sistemului

Programarea microcalculatorului Raspberry Pi B+ pentru recunoașterea caracterelor.

În cadrul programării acestor două componente am încercat să evidențiez atât complexitatea din punct de vedere software cât și modul intuitiv de programare al acestora prin intermedil mediilor de programare TIA, PLCSIM, PYTHON.

Această mașină automată de sortat caractere este un prototip, asadar modurile și locurile în care s-ar putea intervenii pentru perfecționarea ei pot fi numeroase. De exemplu se poate intervenii asupra sistemului de recunoaștere al caracterelor prin înlocuirea microcalculatorului RaspberryPy cu un calculator dotat cu un sistem de tip „Machine vision” pentru a procesa imaginile cu o viteză mai mare.

Această mașină de sortat caractere ar putea avea un domeniu de activitare destul de variat. Acest tip de mașini într-o formă sau alta nu pot lipsi din industria din ziua de azi, ele fiind prezente în aproape fiecare fabrică de pe mapamond. Această mașină de sortat caractere ar putea sta la baza unei mașini automate din dotarea unei parcări supraetajate, având capabilitatea de a sorta si a aranja autoturismele.

În final nu trebuie să uităm nici scopul didactic în care această mașina poate fi folosită.

Bibliografie

[1] Gergely,Eugen. Curs Automate programabile

[2] http://web.ulbsibiu.ro/laurean.bogdan/html/PLC1.pdf

[3] http://users.utcluj.ro/~cteodor/Lucrari/Automatizari_L7.pdf

[4] Simatic S7-300 Module Data Manual

[5] http://www.slideshare.net/arvindsinghrathore14/basic-plcprogramming

[6] http://ro.scribd.com/doc/54592875/Simatic-Step-7-v5#scribd

[7] https://ro.wikipedia.org/wiki/Python

[8] https://picamera.readthedocs.org/en/release-0.4/api.html

[9] https://www.raspberrypi.org/forums/

[10] https://www.python.org/

ANEXE

Anexa 1: Programul pentru recunoașterea video a caracterelor

# Automatic Letter Sorting Machine

# HAMK project 2015

importRPi.GPIO as GPIO

imoprtpicamera

import sys

import os

from comands import getoutput

from time import sleep

os.system(‘clear’)

print ‘Welcome to Automatic Letter Sorting Machine’

print ‘Hamk project 2015’

print

GPIO.setmode(GPIO.BOARD)

GPIO.setwarnings(False)

GPIO.setup(11,GPIO.IN)

GPIO.setup(13,GPIO.OUT)

GPIO.output(13,True)

GPIO.setup(15,GPIO.OUT)

GPIO.output(15,True)

camera = picamera.PiCamera()

camera.resolution = (1280,1024)

camera.color_effects = (128,128)

camera.annotate_background = ’black’

while True:

aStr = raw_input(‘Enter the text to sort (Q-exit): ‘)

if (aStr == ‘Q’) or (aStr == ‘q’):

sys.exit(‘End of sorting process’)

else aStr == ‘ ‘:

aStr = ‘HAMK’

aSort = list(aStr.upper())

wPos = 0

bNext = True

camera.start_preview()

camera.annotate_text = ‘ start sorting… ‘

while wPos != len(aSort):

if GPIO.input(11)

sleep(0.1)

if GPIO.input(11)

bNext = True

if (not GPIO.input(11)) and bNext:

sleep(0.1)

if (not GPIO.input(11)) and bNext:

camera.annotate_text = ‘ ‘

sleep(1)

camera.capture (‘i.jpg’)

camera.annotate_text = ‘ processing… ‘

getoutput(‘convert i.jpg –contrast –stretch 5% 1% img.jpg’)

getoutput(‘ tesseract img.jpg out –psm 10 ltters’)

aChr = getoutput(‘cat out.txt’)

iflen(aChr) > 1:

aStr = aChr

aChr = aStr[0]

iflen(aChr) == 0:

aChr = ‘?‘

if ord(aChr) == ord(aSort[wPos]):

GPIO.output(13,False)

camera.annotat_text = ‘ ‘+ aChr +’ is good, will send it to feeder ‘

wPos += 1

sleep(0.2)

GPIO.output(13,True)

else

GPIO.output(15,False)

camera.annotate_text = ‘ ‘+ aChar +’, maybe later…’

sleep(0.5)

GPIO.output(15.True)

bNext = False

sleep(5)

GPIO.output(13,False)

GPIO.output(15,False)

sleep(0.2)

GPIO.output(13,True)

GPIO.output(15,True)

camera.annotate_text = ‘ Well done! ‘

sleep(5)

camera.stop_preview()

Anexa 2: Schema de programare

Anexa 3: Programul pentru automatul programabil

Similar Posts