SISTEM DE SIMULARE HARDSOFT A UNEI DRONE FOLOSIND TEHNOLOGII JAVA SI AUTOMATE SIEMENS [307670]

UNIVERSITATEA “TITU MAIORESCU” DIN BUCUREȘTI

FACULTATEA DE INFORMATICĂ

LUCRARE DE LICENȚĂ

SISTEM DE SIMULARE HARD/SOFT A UNEI DRONE FOLOSIND TEHNOLOGII JAVA SI AUTOMATE SIEMENS

COORDONATOR ȘTIINȚIFIC:

Lect.univ.dr.ing. Dan-Laurențiu GRECU

ABSOLVENT: [anonimizat]-Marian Mihai

SESIUNEA IUNIE

2016

UNIVERSITATEA TITU MAIORESCU

FACULTATEA DE INFORMATICĂ

DEPARTAMENTUL DE INFORMATICĂ

REFERAT

DE APRECIERE A LUCRĂRII DE LICENȚĂ

TITLU:

ABSOLVENT: [anonimizat]-Marian Mihai

PROFESOR COORDONATOR: Lect.univ.dr.ing. Dan-[anonimizat]:

[anonimizat]/disertație întrunește/ nu întrunește condițiile pentru a fi susținută în fața comisiei pentru examenul de licență/disertație din sesiunea

__________________________ și o apreciez cu nota ___________________

CONDUCĂTOR ȘTIINȚIFIC,

______________________________

Introducere

Datorită dezvoltarii tehnologiilor bazate pe automate programabile și a [anonimizat].

Un control bazat pe feedback a [anonimizat], [anonimizat] ( Water clock) folosit cu 1500 de ani i.Hr, ce constituie unul din cele mai vechi dispozitive de determinare a timpului . Acesta funcționa astfel: [anonimizat], într-un rezervor se determină o creștere a noțiunii de timp și astfel se pune în evidență pe cale mecanică trecerea timpului.

[anonimizat], [anonimizat] o masurare a senzorilor, comparând valoarea dorită și este reglata o ieșire de control pe baza diferențelor.

[anonimizat], fiind proiectat să avertizeze șoferul atunci cand viteza trece de o valoare determinată. [anonimizat] a motorului.

Un regulator PID(cu acțiune proporțional integral derivativă) compară o intrare cu o valoare de referință și distribuie o valoare pentru a [anonimizat]. Există si tehnici de aplicare al algoritmilor PID la sisteme care nu indeplinesc aceste sarcini.

Aceasta lucrare are ca obiectiv realizarea unei aplicații ce permite simularea a [anonimizat] S7 1200 și programul software TIA Portal V13, implementând două componente de tip PID pentru controlul acestor motoare cu scopul menținerii la o viteză constantă și încă o aplicatie ce simulează o [anonimizat]. În realizarea acestei teme am lucrat cu urmatoarele tehnologii:

modulul programabil PLC SIMATIC S7 1200 , utilizând softul Tia Portal de la Siemens.

folosirea unui sistem PID (Proporțional-Integral-Derivative)

modulul de programare al unui microcontroler PIC18F4550 scris cu un limbaj C++, in softul

MPLAB-X.

programarea în limbaj JAVA a [anonimizat]2D si acppcompat_v7.

[anonimizat], folosind softul Unity pentru a întelege mai bine noțiunea de motor si de control al acestuia.

Lucrarea prezintă modul în care poate fi testat comportamentul a doua componente de tip PID (Proporțional-Integral-Derivative), implementate in softul Tia Portal, ce folosesc un automat de tip Siemens S7-1200 si un simulator software implementat într-un limbaj JAVA sub forma unei aplicații Android.

In continuare vor fi prezentate noțiuni teoretice ce țin de tema proiectului, o prezentare generală, o descriere a componentelor Hardware și a modului in care echipamentele sunt conectate între ele dar și o descriere a parții Software în care vor fi detaliate aplicațiile ce țin de acest proiect si modul lor de rulare.

Scopul lucrării este de a implementa două componente PID în cadrul automatului programabil SIEMENS , prin care va fi rulată o simulare software implementată in Android , a doua motoare electrice ce vor pune în mișcare doua elice, având ca sursă de control automatul programabil Siemens. Din aplicația Android se va putea acționa o frână asupra elicelor pentru a vedea cum reacționează acestea în timp real.

Vom discuta despre fiecare echipament hardware folosit în cadrul lucrării de licență, scheme electronice care arată modul de configurare a Microcontrolerului, o descriere generală a componentelor și modul de configurare a PLC-ului SIMATIC S7-1200 ce folosește softul TIA Portal V13.

Vom aborda tema implementării software, unde se regăsesc informații referitoare la codul sursă al aplicațiilor si informații referitoare la modul lor de funcționare . Acesta conține si informații despre conexiunea dintre aplicațiile: PLC , Android și Microcontroler dar și despre modul de simulare in Unity a unei drone .

În final vom descrie cele două moduri de funcționare a simulării, punând accent pe modul de simulare al celor două elice, aceasta fiind una din obiectivele lucrări de licență. Vom descrie de asemenea exemple reproduse în cadrul laboratorului SIEMENS ,UTM in două moduri total diferite. De asemenea vom prezenta și modul de control al dronei în mediul Unity, acesta fiind al doilea obiectiv al lucrării .

2. Noțiuni teoretice

2.1. Noțiuni generale. Rolul regulatorului automat într-un sistem de reglare automată.

SRA(sistemele de reglare automată) sunt sisteme care au o conexiune inversă(cu circuit inchis sau buclă de reacție) și care se manifestă față de mărimile externe in funcție de mărimea erorii generate in mod automat, pentru a putea anula această eroare. În urma acestei reactii, este posibilă si o îmbunătațire a performanțelor sistemului.

Un Regulator automat(RA) are rolulul de a prelucra semnalul de eroare ”ε” și de a afișa ca rezultat un semnal de comandă ”xc” pentru elementul executat. Acesta se situează între elementul de execuție și cel de comparație.

Schema bloc a sistemului de reglare automată

Informațiile ce țin de procesul de automatizare se obțin cu ajutorul traductorului de reacție(TR) si sunt preluate de regulatorul automatizat în conformitate cu o anumita lege ce definește algoritmul de reglare automată.

Modul de implementare a unei legi de reglare se poate realiza în funcție de modul de construcție a regulatorului: ca regulator pneumatic, electronic, hidraulic sau mixt.

Un regulator este format din urmatoarele elemente:

amplificator(A)

elementul de reacție secundară(ERS)

elementul de comparare secundară(ECS)

Amplificatorul(A) este elementul de bază al regulatorului și are rolul de a aplifica mărimea ”ε1” cu un factor KR. Astfel are loc urmatoarea relație:

unde, Kr este factorul de amplificare al regulatorului

Elementul de reacție secundară(ERS-ul) primește la începutul procesului rezultatul calculat in urma procesului de amplificare și are ca rezultat un semnal xrs numit mărime de reacție secundară. Acesta determină o dependență proporțională între mărimea reacției secundară si mărimea de comandă.

Elementul de comparare secundară(ECS) are rolul de a compara in mod continu valorile abaterii ɛ si a mărimii de reacție secundară conform urmatoarei relații:

Regulatorul automat poate include și un element de comparație (EC) , de obicei pentru sistemul de reglare automată si un dispozitiv de prescriere a referinței în cazul sistemelor de reglare electronice, pneumatice sau unificate.

2.2. Regulatoare automate și semnalul de treaptă unitară.

Regulatoare cu acțiune proporțională( de tip P).

În componența acestui regulator, între mărimea de intare ɛ(t) si cea de comandă u(t) are loc următoarea relație de proporționalitate:

KR –este factorul de amplificare al regulatorului.

Mărimea de comandă a regulatorului nu poate urmări tot timpul variația erorii datorită inerției componentelor sale , astfel curba reală este trasată punctat.

În unele cazuri in locul factorului de amplificare KR este folosită o constantă numită bandă de proporționalitate a regulatorului(BP). Atunci când există domeniul de variație al mărimii de comandă ”u” (regulatoare unificate) și domeniul de variație al erorii ɛ , domeniul de proporționalitate poate fi determinat de urmatoarea relație:

În cazul în care domenile de variație diferă, domeniul de proporționalitate poate fi determinat cu urmatoarea relație:

Banda de proporționalitate(BP) reprezintă procentul din domeniul de variație al erorii (ɛ) pentru care regulatorul P produce o comandă egală cu 100% din domeniul de variație al mărimii de comandă (u).

Regulatoare cu acțiune Integrală ( de tip I).

In componența acestui regulator, între mărimea de comandă u(t) și variația erorii (ɛ) are loc următoarea relație de dependență :

u(t)

Valoarea mărimii de comandă u(t) depinde de intreaga variație a erorilor iar constanta Ti se numește constantă de integrare .

In urma derivării acestei relații se obține:

Regulatorul obținut de tip I are viteza de variație a erorii proporțională cu variația mărimii de comandă iar factorul de proporționalitate este inversul timpului de integrare.

Raspunsul regulatorului cu acțiune integrată la intrarea treaptă este reprezentat de un semnal cu coeficientul unghiular:

Regulatoarele cu acțiune integrată sunt rar utilizate datorită întarzierilor produse. Acestea sunt folosite atunci cand se dorește o eroare staționara nula , neexistând alte elemente ale sistemului de reglare automată ce permit acest lucru.

Regulatoare cu acțiune Proporțional – Integrală (PI).

Aceste regulatoare reprezintă o combinație dintr-un regulator proporțional(P) si unul integral(I), astfel se stabilește o relație de dependența între mărimea de iesire xc(t) și mărimea de intrare ɛ(t).

Ti – reprezintă constanta timpului de integrare a regulatorului.

Unde:

Variația treaptă a intrării.

Raspunsul la treapta al ieșirii regulatotului de tip PI

Regulatoarele PI permit obținerea de caracteristici superioare în realizarea legilor de reglare , datorită posibilitații de combinare a celor doua acțiuni, proporționala si integrală , prin modificarea simultană a celor două constante.

Regulatoare cu acțiune Proporțional – Derivată (PD).

Un regulator de tip PD introduce o componenată proporțională, asemanatoare cu cea a regulatorului PI și o componenată derivată D ce introduce o proporționalitate între mărimea de iesire ’x’ si derivata în timp a mărimii de variație a erorii ɛ. Aceasta poate fi exprimată folosind urmatoarea relație :

x(t)

TD – reprezinta constanta de timp a funcției de derivare a regulatorului

Unde:

Variația treaptă a intrării.

Raspunsul de treapta al ieșirii regulatorului PD.

Este preferată dependență determinată de regulatoarele PD in a doua relație, deoarece , asemanator cu regulatoarele PI din punct de vedere constructiv, prin modificarea factorului KR este permisă moficarea constantelor de timp derivativă.

După o analiza a raspunsului la intrarea de treaptă al unui regulator PD putem observa că acțiunea componentei derivative se manifestă numai in momentul inițierii, atunci când are loc cresterea mărimii de la intrare. Componenta derivativă este prezentă pentru o scrută durată și are ca efect o accelerare a regimului tranzitoriu , reducând durata de executie.Spre deosebire de regulatoarele P și de cele de tip I, regulatoarele de tip PD au o șansa mai mare de realizare a legilor de reglare.

Regulatoare cu acțiune Proporțional – Integral – Derivata(PID).

Aceste regulatoare sunt unele din cele mai complexe regulatoare industriale si asigură performante de reglare superioare. Ele cuprind efectele: proporțional P, integral I si dereivativ D, conform legii de reglare:

x(t)

Unde:

Variația de treaptă a intrării.

Raspunsul de treaptă al iesirii regulatorului PID.

Cei trei parametrii KR,TI si TD au un rol important in asigurarea legilor de reglare astfel există posibilitați mai multe decât la oricare alt tip de regulator. Regulatoarele PID sunt mai complexe si necesită ca valorile celor trei parametrii sa fie alese corespunzator.

Pentru a evidenția influența tipului de regulator asupra SRA , avem urmatoarea figură, unde au fost afișate raspunsurile in timp ale mărimii de ieșire dintr-un SRM, xc(t) pentru o variație de treapta a mărimii de intrarii xb pentru regulatoarele P, PI, PD si PID.

În urma acestui desen ,se pot face urmatoarele afirmații:

regulatorul P reduce suprareglajul, ducând la un timp scurt si la o eroare ɛ mai mare.

în urma introducerii componentei I, regulatorul PI anulează eroarea la intrare de treaptă, dar rezultă un suprareglaj mai mare decât la regulatorul P și un timp mai mare.

în urma introducerii componentei D, regulatorul PD , duce la un suprareglaj și la o valoare mai mica a timpului.

regulatorul PID, prin combinarea efectelor P, I si D , oferă performanțe superioare spre deosebire de celelalte regulatoare.

2.3 Clasificarea regulatoarelor automate

In funcție de tipul acțiunii, regulatoarele , pot fi:

Regulatoare autonome cu acțiune continuă – sunt regulatoarele în care mărimea variației

erorii ɛ(t) si mărimea de comandă xc(t) variază continuu in timp. Acestea pot fi și ele:

Regulatoare automate liniare – dacă dependența dintre mărimea variației erorii și mărimea de

comanda este liniară.

Regulatoare automate neliniare – dacă dependența dintre mărimea variației erorii și mărimea de

comandă este neliniară.

Regulatoare autonome cu acțiune discontinuă – din care cel puțin una din mărimile ɛ(t) sau

xc(t) variază discontinuu in timp .

In funcție de sursa de energie exterioară folosită, se pot clasifica in:

Regulatoare automate directe – nu conțin o sursă de energie exterioară, iar transmiterea

semnalului se realizează în funcție de energia internă preluată în mod direct din proces prin intermediul traductorului de reacție;

Regulatoare automate indirect – conțin o sursă de energie exterioară pentru acționarea

elementului de execuție. Acestea sunt cele mai folosite regulatoare , ele conținând caracteristici de funcționare mai complexe și performanțe superioare regulatoarelor directe.

In functie de viteza de răspuns :

Regulatoare automate pentru procese rapide – sunt folosite pentru reglarea automată a

parametrilor proceselor cu răspuns rapid si conțin constante cu timpi mici(< 10 s).

Regulatoare automate pentru procese lente – sunt folosite atunci când constantele sunt

mari( > 10 s) și sunt întâlnite la procesele cu parametrii urmatori: temperatură, debit, presiune etc.

In funcție de numărul mărimilor de ieșire a instalației tehnologiei folosite ele pot fi:

Regulatoare automate monovariabile – folosite pentru o singură mărime reglată.

Regulatoare automate multivariabile – folosite pentru mai multe mărimi reglate.

In functie de agentul purtator de semnal :

Regulatoare automate pneumatice – folosesc aer comprimat.

Regulatoare automate electronice – unde mărimea de intrare si cea de ieșire sunt de natură

electrică si conțin blocuri electronice.

Regulatoare automate hidraulice – folosesc ulei sub presiune.

Regulatoare mixte – pot fi electropneumatice sau electrohidraulice.

In funcție de caracteristicile constructive se pot clasifica în :

Regulatoare automate unificate – folosite pentru reglarea parametrilor( temperatură ,debit

etc).

Regulatoare automate specializate – folosite numai pentru un parametru tehnologic, ce

conține o structură constructivă si semnale de lucru special concepute.

Procesele industriale conțin multe intrări ce generează efecte asupra ieșirilor. Pentru a exemplifica un astfel de proces considerăm o aplicație industrială scrisă în programul LOGO SOFT CONFORT. Sistemul de comandă prin pedale conține 2 contacte conectate la LOGO. Pedala semi-apăsată este conectată la prima intrare I1 iar pedala este conectată la intrarea I2.Pentru operațiuni curente, viteza 1 a motorului este suficientă si poate fi selectată acționând I1. Viteza 1 a motorului este comandată prin iesirea Q1,având un timp de așteptare de 2 secunde . Daca este dorită o viteza mai mare se poate acționa viteza 2 a motorului.Aceasta poate fi activată acționând din nou I1 si este comandată prin Q2 având o întârziere de 2 secunde. Daca I1 este acționata din nou , viteza scade. De fiecare dată cand I1 este acționată , viteza obținută va fi viteza 1 ori viteza 2, in ambele cazuri dupa un timp de 2 secunde . Un indicator luminos conectat la Q2 se aprinde daca motorul este poziționat in viteza mai mare. Pentru a opri procesul, pedala trebuie să nu fie apăsată și astfel se acționează I2,care are rolul de a opri funcționarea sa.

3.Sistemul ce folosește o componentă PID

Peste 90% din aplicațiile actuale de control și automatizare folosesc reglarea cu acțiune proporționala – integral – diferentială (PID), deoarece este o soluție usor de implementat și eficientă.

În continuare voi prezenta modul de funcționare a doua componente PID legate între ele printr-un proces numit ”cascada”. Se poate observa ca , iesirea de la prima funcție PID este transmisă la intrarea celei de-a doua funcție PID, astfel are loc o încetinire a timpului de raspuns , facilitând ieșirea dispozitivului folosit. Un mod standard de folosire a unei unei funcții PID in cascadă este prin intermediul a două intrari de la sistem, ce pot oferi de exemplu, informații în legatura cu poziția și viteza unui obiect. În continuare un codificator de pozitie este comparat cu valoarea de referință dorita, iar apoi, ieșirea rezultată devine punctul de referință pentru controlul vitezei.

În actualul proiect de licență am realizat un PID pentru controlul unui motor electric, acesta punând în mișcare o elice printr-o forță de frecare,iar , în funcție de viteza de rotire a elicei vom trimite un feedback înapoi pentru ca PID-ul să compenseze și să anuleze perturbațiile.

Proiectul constă din trei părți de baza enunțate în schema de mai sus:

Sistemul de automatizare ce conține:

Controlerul programabil PLC Siemens S7-1200.

Modulele SM1223 si SM1234 conectate la PLC și care sunt folosite pentru conectarea analogică și digitală.

Softul scris in mediul Tia Portal este programat cu ajutorul unui PLC.

Microcontrolerul conține urmatoarele componnente:

Placa de bază ce conține microcontrolerul PIC18F4450.

Soft-ul de control al microcontrolerului.

Placa de testare.

Placa de conectare la PLC.

Simularea software ce conține aplicația de pe Tabletă:

Partea de testare pentru verificarea funcționării intrarilor si ieșirilor digitale, respectiv analogice.

Simularea elicelor motoarelor electrice ce folosesc forta de frecare.

Sistemul de automatizare are în componentă PLC-ul Siemens SIMATIC S7-1200 care va folosi aplicația Tia Portal V13 pentru implementarea a două PID-uri . Acestea va simula motoarele unei drone iar tensiunea de ieșire de la un conector va fi controlată de PLC prin intermediul a două componente Setpoint și a două Feedback-uri.

In momentul în care sistemul de automatizare este pornit si dorim să simulam cele două motoare , în cele doua PID-uri vor fi setate două Setpoint-uri cu un anumit nivel. Acest lucru este realizat prin rotirea potentiometrelor de pe pozitia AI1 si AI3 ..

În cele două blocuri DIV implementate in PLC se va face conversia dintre valorile de la 0 la 2960 la o valoare cuprinsa între 0 si 100. Acesta este transmisă mai departe la blocurile PID , care va afisa pe pinul Output o valoare mai mare a tensiunii.

Microcontrolerul este un intermediar între aplicația de Android si PLC și are rolul de a primi sau transmite informații , apoi o convertește pentru a putea fi interpretată de către aplicația Android, respectiv de catre PLC.

Microcontrolerul va primi tensiunea transmisă de catre sistemul PLC și o va transforma în informație , pe care o va trimite mai departe prin USB către aplicația Android, care poate fi citită de pe un dispozitiv smartphone/tableta sau de pe un dispozitiv virtual.

Simularea software preia datele primite si aplică un impuls asupra unei componente „Gear” a unui motor care va începe sa se învarte , punând în mișcare o elice prin intermediul unei forțe de frecare. Pentru a pune în mișcare elicea s-a luat in considerare ca componenta ”gear” șa aibă o greutate stabilită.

Tensiunea masurată la bornele unui generator electric este reprezentată de viteza de rotație a elicei. Valoarea obținuta va fi trimisă prin intermediul unei conexiuni USB la Microcontroler, care o va trimite mai departe către PLC(o tensiune între 0v și 5v). În funcție de tensiunea primită, echipamentul PLC va ajusta valoarea primită cu scopul menținerii tensiunii de intrare la o stare de 40% , tensiunea furnizată de PLC variază între 0 și 10v.

În momentul transmiterii din PLC către Tabletă va fi acționat potențiometrul de pe panoul didactic, care va furniza pe unul din conectorii analogici o tensiune, ce va fi citită de PLC și care va fi transformată intr-o valoare, fiind stocată în memoria PLC-ului. Această valoare va fi transformată de către PLC dintr-un numar cuprins între 0 și 29600 într-o mărime cu valoarea între 0 și 100, printr-o operație de dividere a numarului la 296, unde rezultatul cuprins între 0 si 100 reprezintă valoarea procentuală.

În urma acestui proces se va obține căte o componentă „Setpoint” pentru fiecare bloc PID implementat in softul Tia Portal , componentă ce va ridica tensiunea pe conectorul de tip Output conenctat la Microcontroler. Microcontrolarul va prelua această tensiune și va trimite o valoare către Tableta prin intermediul unei conexiuni de tip USB.

Acessta valoare va fi interpretata de catre aplicatia de pe tableta si astfel se va pune in miscare componenta Gear a motorului care va pune in miscare o elice printr-un transfer de miscare folosind o fortă de frecare.

In momentul în care elicea se învarte , aplicația soft de pe tableta va interpreta acest lucru și va fi

afișată valoarea vitezei cu care se învarte elicea, valoarea fiind transmisa mai departe catre Microcontroler.

Aceasta valoare va ajunge in Microcontroler astfel transformand-o in tensiune si trimitand-o catre PLC. Tensiunea este citita de PLC si calcula cu cat trebuie sa suplimenteze tensiunea afisata in Output pentru a ramane viteza motorului constanta.

Pentru a menține si controla viteza de rotație a elicei folosim potentiometrul Analog I1(proiectul consta din simularea a doua motoare astfel vom avea si Analog I2).In aplicatia de pe Tableta se pot selecta valorile de referinta precum:

4. Descriere componentelor Hardware

4.1.Sistemul de automatizare SIMATIC S7-1200

4.1.1 Notiuni generale

Controlerele Programabile Logice(PLC) sunt automate de comanda si reglare programabile ce folosesc masini si procese de tip industrial (de exemplu: un sistem de semaforizare , un dispozitiv pentru taiat sticla etc ). Pentru a obtine un astfel de proces este necesara o aplicatie software, un dispozitiv PLC si un dispozitiv programabil.

+

SOFT-pentru controul unui motor PLC

+

Dispozitiv – motor electric

Procesul de automatizare se bazeaza pe tehnica si are ca scop lucrarea automata a masinilor si a instalatiolor pentru a inlocui sau usura efortul depus de forta de munca umana. Cu cat este necesara o functie mai complexa pentru un automat, cu atat este mai ridicat gradul de automatizare. Pentru instalatiile automatizate forta de munca umana are rolul de a supraveghea buna functionare a aparatului, de a aprovizionacu materiale, de intretinere a dispozitivului etc. Noile microprocesoare accelereaza procesele de automatizare . Acest proces are ca efect ridicarea calitatii produselor si a productivitatii acestora cu o reducere a efeortului fortei de munca umane, a costurilor dar si a eventualelor accidente umane ce pot avea loc .

Sistemul de automatizare SIMATIC S7-1200 este un controler foarte flexibil,scalabil si cuprinde o gama larga de module pentru a fi adaptat la necesitatile sistemului de automatizare. Controlerul S7 cuprinde un CPU (unitate centrala de procesare) ce foloseste intrari si iesiri pentru semnale analogice si digitale.

Pot fi instalate mai multe module de intrare si iesire in cazul in care nu sunt necesare cele integrate in CPU si deasemenea se mai pot adauga procesoare de comunicare RS232 sau RS485.Este necesara pentru CPU si o interfata de tip TCP/IP.

RS232 si RS485

Putem programa un sistem de automatizare SIMATIC S7-1200 folosind softul TIA Portal V13.

4.1.2 Automatul programbil SIMATIC S7-1200- Metode de configurare si utilizare.

Un sistem de automatizare SIMATIC S7-1200 este un sistem modular care poate sa contina urmatoarele module:

Modulul CPU ce contine Interfata PROFINET si mai multe intrari/iesiri.

CPU215

Sursa de alimenntare PM(power supply module) ce contine intrari de 120-230V.

PM1207

Un modul de extensie de semnal (SM) pentru intrari si iesiri digitale si analogice suplimentare. Pot fi adaugate maxim doua astfel de module.

SM 1232

CM (comunication module) conecteaza sistemul de automatizare SUEMENS cu sisteme de de

nivel inalt.

CM 1243

Acest proiect a fost realizat folosind tehnologii de automatizre puse la dispozitie de catre Facultatea Titu Maiorescu din Bucuresti in cadrul laboratorului SIEMENS.

Panou PLC S7-1200 ce contine: CPU215,un PM1207,un CM124 si doua SM 1232

Panoul de comanda contine mai multe porturi de intrare/iesire conectate prin cabluri la panou.

Aplicatia necesita ca Microcontrolerul sa fie conectat la panou, prin intermediul unor cabluri, astfel se va vor fi trimise semnale electrice la Microcontroler ce vor fi transformate in semnale diginale si trimise la tableta prin intermediul unei conexiuni USB. Deasemenea si din Tableta vor fi trimise semnale digitale la Microcontroler, apoi sunt convertite in semnale electrice si trimise mai departe la PLC pentru a fi prelucrate.

Panoul PLC contine pini de tip „Analog Inputs” ce pot fi activati prin intrerupatoare de tip

EXT , astfel potentiometrul dorit este activat. Acesta controleaza viteza de referinta de care motorul va tine cont.

4.1.3. Unitatea centrala(CPU).

Modulul CPU S7-1200 poate functiona individual fara alte componente suplimentare , el

detinand toate mijloacele necesare: o tensiune de alimentare integrata si intrari/iesiri integrate. Acesta contine si un port TCP/IP pentru a putea comunica cu dispozitivele de pe care este implementata aplicatia. Acesta poate comunaca cu dispozitive de tip HMI (human machine interface), sisteme PC sau alte module CPU.

Se poate face o conexiune TCP/IP si este locul unde in cardul de memorie SIMATIC sunt

stocate datele . Deasemenea se pot face urmatoarele operatii: transfer de date intre mai multe module CPU si se poate actualiza firmware-ul modulelor CPU, al modulelor de semnale SM si al modulelor de comunicatie CM.

Led-urile arata ce intrari/iesiri sunt conectate si regimurile de operare a modulului CPU.

Sunt blocuri terminale pentru a se face conexiunea cu procesul prin cabluri.

Conexiunea de 24V folosita pentru alimentare.

4.2. Microcontrolerul PIC18F4550

Toate dispozitivele de testare precum: placa de baza cu microcontrolerul PIC18F4550, placa de

testare si placa de conectare la PLC au fost puse la dispozitie de profesorul coordonator din cadrul laboratorului SIEMENS UTM.

PIC18F4550 este un microcontroler pe 8 biti dintr-o familie cu un numar total de 18 modele

aparute . Microcontrolerul contine 40 de pini, dintre care 5 de input/output(PORTA, PORTB, PORTC, PORTD si PORTE). PORTB si PORTD detin pini pentru primirea/ transmiterea a biti de informatie I/O. Restul porturilor au un numar diferit de pini pentru comunicatia informatiei de intrare/iesire. Acesta contine un convertor A/D pe 10 biti cu 13 canale, doua comparatoare, 4 componente de monitorizare, unul pe 8 biti si 3 pe 16 biti.

Cipul PIC18F4550 are rolul de a viti tensiunea intrata in micrcontroler si de a genera o noua

tensiune in momentul iesirii.

In componenta acestui proiect modulul contine:

2 porturi analog ( PWM ) de iesire, prin care se poate trimite o tensiune intre 0 si 5 V.

5 porturi analog de intrare , prin care se poate citi o tensiune de 0 – 5V.

8 porturi digitale de intrare.

8 porturi digitale de iesire.

Am folosit softul Eagle PCB 8.1 pentru a realiza schemele care arata configurarea pinilor

microcontrolerului.

Microcontrolerul a fost programat folosind o aplicatie in limbaj C++ implementata in

programul MPLAB-X , folosind o versiune gratuita.

4.2.1 Placa de baza a Microcontrolerului PIC1F4550

Placa de baza este destul de simpla. Aceasta contine un led care se aprinde in momentul in care exista o conexiune de tip USB, un buton de reset prin care microcontrolerul poate fi adus la starea sa initial , un rezonator( un dispozitiv capabil sa amplifice oscilatile mecanice, electrice etc) de 20 MHz care permite functionarea procesorului din microcontrolerla o frecventa de 20 MHz.

4.2.2 Placa de testare

Aceasta placa este folosita pentru a verifica buna functionare a sistemului si a porturilor de intrare / iesire.

Placa contine urmatoarele porturi de intrare iesire:

2 leduri care isi schimba intensitatea cu care lumineaza in functie de tensiunea primita de la cele

doua porturi analogice de iesire ale Microcontrolerului, se merge pe princiul Power With Modulation (PWM).

5 potentiometre prin care trece tensiunea catre cele 5 porturi de intrare ale Microcontrolerului.

8 butoane conectate la intrari digitale ale Microcontrolerului.

8 leduri conectate la iesirile digitale ale Microcontrolerului.

In schema electronica alaturata se pot vedea cele opt butoane si modul in care vor actiona cele opt intrari digitale al Microcontrolerului .

Iesirile Microcontrolului sunt reprezentate de ledurile

din partea de sus, cele din dreapta sunt digitale

iar cele doua din stanga sunt analogice.

Aceasta placa este folosita pentru a testa aplicatia

android si pentru a vedea modul de functionare a acesteia.

4.2.3 Placa de conectare la sistemul de automatizare PLC

Aceasta placa este folosita pentru a realiza

conexiunile necesare intre automatul SIMATIC

S7-1200 la placa de baza a Microcontrolerului.

Pentru a evita o tensiune mare in cadrul

iesirilor a fost realizat cu regulatorul de

tensiune L78S05CV care accepta +32V dar nu

scoate o tensiune mai mare de +5V.

Pe placa este montat un conector, la care se pot atasa cabluri pentru fiecare pin al Micro-

controlerului.Un regulator este adaugat pentru a proteja sistemul de automatizare PLC,microcon-trolerulsi dispozitivele de o deteriorare in urma unei tensiuni mai mare decat limita permisa.

5.Descrierea aplicatiilor Software

5.1 Software pentru progrmarea microcontrolerului PIC18F4550

5.1.1 Schema bloc functionala

Schema logica de implementare al aplcatiei este urmatoarea:

Functia Main() are rolul de a initializa sistemul,astfel sunt initializati pinii folositi si convertiti in fisiere de tip header si are urmatoarele componente :

InitializeSystem() initializeaza sistemul ;

USBDeviceInit() initializeaza setarile portului USB;

USBDeviceAttach() initializeaza procedurile de conectare la portul USB, in modul host sau modul client.

Functia Main() mai are rolul de a atasa si deconecta portul USB si de a apela metoda DeviceTask().

Metoda DeviceTask() citeste si scrie in microcontroler valorile dorite.

Functia Main() este componenta principala a programului si arata astfel:

void main(void){

InitializeSystem(SYSTEM_STATE_USB_START);

USBDeviceInit();

USBDeviceAttach();

while(1){

/* Daca dispozitivul USB nu este configurat, nu se va face nimic

* Daca nu exista un host. Se va reveni in pozitia dinaintea while . */

if( USBGetDeviceState() < CONFIGURED_STATE ){

/* Se sare inapoi la while. */

continue;

}

/* Paca procesul este suspendat, trebuie sa vedem daca trebuie sa

* initiem manual procesul. In ambele cazuri, nu ar trebui sa apasam nici o tasta.

* Deoarece nu are loc o comunicare cu hostul ne vom intoarce inapoi la while. */

if( USBIsDeviceSuspended() == true ){

/* Se sare inapoi la while . */

continue;

}

DeviceTasks();

}//end while

}//end main

Metoda InitializeSystem() are rolul de a apela componentele software de pe microcontroler in functie de starea conexiunii la USB.

void InitializeSystem( SYSTEM_STATE state ){

switch(state){

case SYSTEM_STATE_USB_START:

InitializeStatusLED();

InitializeDataINPins();

InitializeDataOUTPins();

InitializeAnalogINPins();

InitializeAnalogOUTPins();

break;

}

}

Pentru initializarea pinilor microcontrolerului am folosit metoda Initialize DataINPins() astfel:

//pini sunt setati pe imputurile urmatoaare

void InitializeDataINPins(void){

IN_D1_TRIS = 1;

IN_D2_TRIS = 1;

IN_D3_TRIS = 1;

IN_D4_TRIS = 1;

IN_D5_TRIS = 1;

IN_D6_TRIS = 1;

IN_D7_TRIS = 1;

IN_D8_TRIS = 1;

}

5.1.2. Modul de funcționare

In momentul conectarii prin USB a modulului de simulare, se va executa codul din bucla principala si vor fi trimise de pe Tableta la un interval de 50 ms o serie de comenzi de citire/scriere prin USB.

Citirea pinilor de intrare digitali, este definita de comanda COMMAND_DIN si va citi starea

pinului digital (butonul) atunci cand comanda este primita de modul. Valoarea va fi trimisa catre Tableta.

Citirea pinilor de iesire digitala, este definita de comanda COMMAND_DOUT si va scrie starea

primita catre pinul digital cu o valoarea intre 0- 5V in functie de valoarea primita atunci cand comanda este primita de modul.

Citirea pinilor de intrare analog, este definita de comanda COMMAND_AIN si valoarea aleasa

pentru a reprezenta pinul analog este valoarea bitului urmator. Microcontrolerul va trimite 2 biti la Tableta in functie de valoarea pinului.

Scrierea pinilor de iesire analog, este definita de comanda COMMAND_AOUT si atunci cand

este initiata comanda , Microcontrolerul va interpreta urmatorii 3 biti primiti pe Tableta.Primul pin este cel scris iar ceilalti doi vor fi timisi ca o tensiune catre PLC.

Modulul de decizie a comenzii curente se formeaza printr-un buffer care va fi trimis la USB.

In continuare se poate vedea in codul sursa cum este luata aceasta decizie:

void DeviceTasks(){

//Verificam daca avem date de iesire de la host

if(HIDRxHandleBusy(USBOutHandle) == false){

//Am obtinut un pachet de date de la hostul USB.

//Verifica primul uint8_t din pachet pentru a vedea ce comanda doreste aplicatia software

//sa rulam.

switch(ReceivedDataBuffer[0]){

case COMMAND_DOUT:

{

DATA_OUT data_out;

switch(ReceivedDataBuffer[1]){

case 1: data_out = OUT_D1; break;

case 2: data_out = OUT_D2; break;

case 3: data_out = OUT_D3; break;

case 4: data_out = OUT_D4; break;

case 5: data_out = OUT_D5; break;

case 6: data_out = OUT_D6; break;

case 7: data_out = OUT_D7; break;

case 8: data_out = OUT_D8; break;

}

switch(ReceivedDataBuffer[2]){

case COMMAND_DOUT_ON: OUT_On(data_out); break;

case COMMAND_DOUT_OFF: OUT_Off(data_out); break;

case COMMAND_DOUT_TOGGLE: OUT_Toggle(data_out); break;

}

}

break;

case COMMAND_DIN:

//Se asigura ca endpoint/buffer este liber pentru a se putea modifica continutul.

if(!HIDTxHandleBusy(USBInHandle)){

DATA_IN data_in;

switch(ReceivedDataBuffer[1]){

case 1: data_in = IN_D1; break;

case 2: data_in = IN_D2; break;

case 3: data_in = IN_D3; break;

case 4: data_in = IN_D4; break;

case 5: data_in = IN_D5; break;

case 6: data_in = IN_D6; break;

case 7: data_in = IN_D7; break;

case 8: data_in = IN_D8; break;

}

ToSendDataBuffer[0] = COMMAND_DIN;

if(GetIN(data_in) == false){

ToSendDataBuffer[1] = 0x01; //In data is not pressent

}else{

ToSendDataBuffer[1] = 0x00; //In data is pressent

}

//Modulul USB este stabilit pentru a trimite informatii la host. USBInHandle = HIDTxPacket(CUSTOM_DEVICE_HID_EP, (uint8_t*)&ToSendDataBuffer[0],64);

}

break;

case COMMAND_AIN:

//Se asigura ca endpoint/buffer este liber pentru a se putea modifica continutul.

if(!HIDTxHandleBusy(USBInHandle)){

uint16_t value;

AIN_CHANNEL analog_in;

switch(ReceivedDataBuffer[1]){

case 1: analog_in = AIN_CHANNEL1; break;

case 2: analog_in = AIN_CHANNEL2; break;

case 3: analog_in = AIN_CHANNEL3; break;

case 4: analog_in = AIN_CHANNEL4; break;

case 5: analog_in = AIN_CHANNEL5; break;

}

value = AIN_Read10bit(analog_in);

ToSendDataBuffer[0] = COMMAND_AIN;

ToSendDataBuffer[1] = (uint8_t)value; //LSB

ToSendDataBuffer[2] = value >> 8; //MSB

//Modulul USB este stabilit pentru a trimite informatii la host. USBInHandle = HIDTxPacket(CUSTOM_DEVICE_HID_EP, (uint8_t*)&ToSendDataBuffer[0],64);

}

break;

case COMMAND_AOUT:

{

uint16_t value;

AOUT_CHANNEL analog_out;

switch(ReceivedDataBuffer[1]){

case 1: analog_out = AOUT_CHANNEL1; break;

case 2: analog_out = AOUT_CHANNEL2; break;

}

value = ReceivedDataBuffer[2] | ReceivedDataBuffer[3] << 8;

setAOut(analog_out, value);

}

break;

USBOutHandle=HIDRxPacket(CUSTOM_DEVICE_HID_EP,(uint8_t*)&Received

DataBuffer64);

}

}

5.1.3 Rolul fisierelor sursa ce tin de programarea Microcontrolerului

Aplicatia pentru configurarea si pentru scrierea codului sursa Microcontrolerului a fost scrisa in limbaj C++ folosind softul MPLAB X. Pentru aceasta aplicatie a fost creat un now proiect caruia i-am dat denumirea Simulator si am adaugat urmatoarele componente:

Fisiere de tip Header(cu extensia .h) adaugate intr-un folder logic cu denumirea aplicatie pentru configurarea Microcontrolerului.

Fisiere de tip Header(cu extensia .h) adaugate intr-un folder logic cu denumirea USB pentru configurarea librariei de comunicare USB .

Fisiere de tip Sursa(cu extensia .c) adaugate intr-un folder logic cu denumirea aplicatie ce contine coduri sursa pentru Microcontroler.

Fisiere de tip Sursa(cu extensia .c) adaugate intr-un folder logic cu denumirea USB ce contine fisiere sursa ale librariilor de comunicare USB.

Fisierele de tip Header sunt urmatoarele:

status.h – are loc configurrea ledurilor de pe placa principala.

analog_in.h – are loc configurarea pinilor de intrare de tip analog.

analog_out.h – are loc configurarea pinilor de iesire PWM.

digital_in.h – are loc configurarea pinilor de intrare de tip digital.

digital.out.h – are loc configurarea pinilor de iesire digitala.

Fisierele de tip Sursa sunt urmatoarele:

device.c – contine codul sursa in care are loc procesul de conversie intre starile hardware si starile software.

status.c – contine codul de control al ledului placii principale, care se aprinde cand are loc o conexiune USB.

main.c –initiaza si controleaza conexiunea de tip USB .

anlog_in.c – initiaza si defineste starea pinilor de intrare analog.

analog_out.c – initiaza si defineste starea pinilor de iesire analog.

digital_in.c – initiaza si defineste starea pinilor de intrare digitali.

digital_out.c – initiaza si defineste starea pinilor de iesire digitali.

system.c – sunt definite metodele de initializare a sistemului.

usb_descriptors.c – contine metode de initializare si setare a conexiunii la USB.

5.2 Sistemul de automatizare SIMATIC S7-1200 :

Sistemul de automatizare SIMATIC S7-1200 este un sistem mini-controler modular din gama de performnte scazute. In familia S7-1200 se regasesc mai multe module care au ca rol adaptarea la necesitatile de automatizare.

Automatul S7 consta dintr-o unitate centrala CPU ce contine intrari si iesiri pentru semnale analogice si digitale. La acesta se mai poate instala alete module de intrare si iesire suplimentare in cazul in care aceste nu sunt suficiente(RS232 sau RS485).

5.2.1 Softul Tia Portal V13.

Totally integrated Automation(TIA) este actualul cadru de inginerie Siemens pentru automatizare. Pentru a programa automatul SIMATIC S7-1200 a fost folosit mediul Tia Portal V13 ce poate poate permite utilizarea urmatoarelor functii de automatizare:

de configurare a componentelor hardware.

de definire a comunicatiei intre dispozitive.

de programare a dispozitivelor.

de generare a rezultatelor dorite prin intermediul unor ecrane incluse in panourile de operare SIMATIC ( HMI) .

Pentru a conecta unitatea centrala de procesare la mediul Tia Portal este necesara o conexiune de tip TCP/IP dar si ca adresele celor doua parti sa corespunda .

O adresa Ip(Ex: 192.168.1.4) este format din patru numere zecimale cu valori cuprinse in intervalul 0-255, separate intre ele printr-un punct. Asemanator este si masca de subretea(Ex:255.255.255.0).

Masca de subretea este folosita pentru a recunoaste daca un post sau o adresa IP apartine subretelei locale sau poate fi accesata folosind un ruter.

Pentru a seta adresa IP a calculatorului sunt necesari urmatorii pasi:

pentru Windows 7 intram in Control Panel Network and Internet Network and Sharing

Center Change adapter settings se selecteaza conexiunea dorita , se da click dreapta si se intra in Properties.

Se alege Internet Protocol Ipv4 si se apasa butonul de Properties.

In tabul General se alege optiunea Use the following Ip address dupa care se introduce adresa dar

si maska si DNS-urile.

Pentru a seta Adresa IP a sistemului de automatizre SIMATIC S7-1200 sunt necesari urmatorii pasi:

Se deschide Programul TIA Portal.

Se acceseaza ”Project View”.

Accesam in panoul „Devicess” „Online access” si vom observa placa de retea instalata. Prin

click dreapta se poate observa optiunea „Update accesible station”unde va fi loclizata adresa MAC a sistemului de automatizare S7-1200.(ProjectViewOnline accessOnline&diagnostics Update accesible station MAC ).

Pentru a seta adresa automatului accesam meniul „Functions” unde vom putea introduce in

campurile „IP address” si „Subnet” adresa IP dorita si masca de subretea.Astfel se vaa obtine o noua adresa IP pentru automatul SIMATIC S7-1200 daca urmam exact pasii mentionati(Functions Assign IP address( Ex: 192.168.1.2) Subnet (Exemplu : 255.255.224.0) Assign IP address) .

Pentru a reseta adresa in modul initial se acceseaza meniul „Functions” si submeniul „Reset to

factory settings” unde vor exista doua optiuni: „KeepIP address” si „ResetIP address”, a doua fiind necesara pentru a avea loc resetarea, dupa care se va apasa butonul ”Reset”.

In continuare va aparea un mesaj pe ecran care va solicita sa confirmam procesul de resetare.

5.2.2 Aplicatia in TIA Portal V13 pentru controlul celor doua PID-uri.

Sistemele de reglare pot functiona pe baza principiului actiunii dupa efect(sisteme cu actiune inversa) sau pe baza principiului actiunii dupa cauza(sisteme cu actiune directa). Pentru acest proiect am ales doua regulatoare cu actiune dupa efect cate unul pentru fiecare componenta PID. Un regulator primeste doua semnale la intrare: unul de masura, generat de traductorul marimii reglate si unul de referinta (Setpoint) care afiseaza valoarea procentuala a marimii reglate dorite.

Principiul reglarii dupa efect presupune interventia asupra procesului reglat, in functie de informatia obtinuta prin masurarea marimii de iesire a marimii reglate, cu scopul mentinerii acestei marimi la o valoare apropiata de valoarea referintei, in conditiile in care timupul referintei variaza. La aceste tipuri de sisteme aparitia erorii nu poate fi prevenita , ci doar se doreste o reducere a acesteia.

In figura urmatoare este prezentata schema practica a unui sistem monovariabil de reglare automata dupa efect(eroare).

Unde:

P este procesul de reglare a dispozitivului.

T este traductorul.

R este regulatorul.

E elementul de executie care indeplineste functiile de masurare, de comanda si de executie.

In functie da natura semnalelor de intrare/iesire ,regulatorul poate fi electronic,mecanic, hidraulic sau pneumatic, dintre care cele mai utilizate sunt , regulatoarele electronice numerice.

Pentru scrierea aplicatiei am ales mediul de lucru TIA Portal v13 acesta fiind legat la aplicatia de android si care va controla viteza cu care se rotesc cele doua roti mici in simulatorul de pe Tableta.

Pentru a crea un mediu de lucru ce foloseste sistemul de automatizare SIMATIC S7-1200 putem reproduce urmatorii pasi

Intrat in programul TIA Portl V13

Setatm adresa IP a automatului, exact cum a fost prezentat in subcapitolul de mai sus.

Dam click pe Create New Project pentru a crea un nou proiect.Selectam o denumire si un

director unde dorim sa salvam proiectul respectiv.

In continuare va trebui sa configuram un nou dispozitiv( in cazul nostru S7-1200). In meniul

„First steps” urmam urmatorii pasi: Configure a device Add new device selectam Controllers SIMATIC S7-1200 CPU Unspecified CPU 1200 6ES7 2XX-XXXXX-XXXX. Aditional se poate alege si versiunea.

Vom obtine un dispozitiv PLC-1200 pe care va trebui sa-l configuram. In continuare putem sa

Procedam in doua moduri: unul in care vom adauga manual modulele pe care le vom folosi din catalogul din dreapta si altul mai usor in care putem lasa programul sa detecteze singur dispozitivul PLC si modulele conectate la acesta.

Daca alegem ca dispozitivul sa fie detectat va trebui sa selectam tipul interfetei PG/PC , tipul

de conexiune dintre PLC si calculator. Dupa ce facem click pe butonul ”Detect” putem observa in tabelul de mai sus o lista de conexiuni intre dispozitive si va trebui sa alegem conexiunea dorita dupa care va trebui apasat butonul OK. Putem bifa „Flash LED” pentru a observa daca este recunonscuta aplicatia de catre PLC. In cazul in care este recunoscuta se vor aprinde doua leduri pe componenta CPU.

Vom obtine un dispozitiv configurat ce va contine componenta CPU si modulele SM1223

(modul de transmitere radio) si SM1234(modul pentru semnal ce contine intrari/iesiri suplimentare).

Pentru a crea o aplicatir ce simuleaza controlul PID putem reproduce urmatorii pasi:

Pentru a crea o aplicatie de tip PID control trebuie mai intai adugata o componenta de tip bloc (

sau doua in aplicatia cu dupa PID-uri). Acest lucru se face din meniu accesand Proiectul PLC-ul Folderul ”Program blocks” Add new block . Se selecteaza Cyclic interrupt din tabul Organization block dupa care se alege modul: manual sau automatic , limbajul LAD si un timp care semnifica durata unui ciclu. Un bloc de organizare de tip „Cyclic interrupt” permite utilizatorului sa porneasca programe la anumite intevale de timp .

Dupa ce a fost creat blocul sau blocurile se selecteaza din meniul ”Technology ” o componenta

de tip ”PID Controller” sau mai multe in functie de cate PID-uri avem nevoie si le adaugam in reteaua

”Network1” . Deasemenea trebuie adaugat un bloc DIV sau mai multe in functie de cate componente

PID avem din meniul Basic instructionsMath functions si le situam intr-o alta retea”Network2”.

Blocurile PID vor fi confugurate astfel :

Pentru a accesa tabela pentru scrierea tagurilor apasam click dreapta pe blocul PID si alegem

„Rewrite tags”.Astfel putem introduce denumirile tagurilor( Input, Output , Setpoint) dupa care trebuie stabilit tipul lor(Global Memory, Global Input, Global Output),tipul de data(Int, Word, Word), pinii de intrare pentru fiecare bloc( ”%IW112” respectiv ”%IW116”) si pinii de iesire pentru fiecare bloc (”%QW112” respectiv ”%QW116”).

Pentru a vizualiza tagurile introduse putem accesa tabela din meniul PLC tagsDefault tag table.

Pentru configurarea uui bloc DIV vom folosi aceeasi metoda ca la la Blocul PID.

„Setpoint POT” reprezinta potentiometrul si poate lua o valoare de la 0 la 30000 unde la

30000 avem +10V.

Deasemenea pentru blocurile DIV trebuie setat numarul 300 pe IN2 respectiv IN4 pentru a se

transforma cu ajutorul potentiometrului dintr-o valoare 0-30000 intr-o valoare 0-100. Aceasta valoare este Setpointul si este trimisa catre blocul PID , ea reprezentand viteza motorului.

Setarile pentru fiecare bloc PID se face din meniul Technology objects PID_Compact1 sau

PID_Compact2 Configuration . In subdomeniul basic trebuie setat tipul controlerului ca fiind unul pentru controlul vitezei(Speed). In sudomeniul Advanced settings putem stabili mai multi parametri precum: limita grafului, timpul de desfasurare etc.

Dupa configurare, blocurile trebuie sa arate astfel:

Dupa configurarea acestor blocuri putem considera ca aplicatia ce foloseste automatul

SIMATIC S7-1200 este finalizata. Pentru a rula aceasta aplicatie trebuie sa intram in meniul Technology objects PID_Compact1 sau PID_Compact2 Commisioning. Urmatorul pas este sa incarcam aplicatia la automatul SIMATIC S7-1200 si in sa apasam butonul Start pentru a rula aplicatia.

5.3 Aplicatia Android

5.3.1 Notiuni generale

Android este cel mai popular sistem de operare pentru dispozitive de tip smartphone sau pentru tablete, dovada fiind faptul ca in ultimii ani calitatea aplicatiilor sa dezvoltat tot mai mult.

Pentru acest proiect am ales o aplicatie de tip Android ce testeaza sistemul format(PLC, Microcontroler si Android) si simuleaza doua motoare electrice ale unei drone, cu componente precum: forte de frecare, vectori etc. Folosirea acestor componente a fost posibila datorita librariilor AndEngine si AndEnginePhysicsBox2D.

AndEngine este o librarie OpenGL(Open Graphycs Library) ce face mai usoara crearea de aplicatii 2D pentru dispozitivele Android. Aceasta poate suporta extensii precum: AndEnginePhysicsBox2 Extension, AndEngineMultiplayerExtension etc.

In acest proiect sunt posibile doua simulari incluse in aplicatia de Android si o simulare creata in mediul Unity ce poate fi rulata din Windows sau prin intermediul unei alte aplicatii de tip Android. Primele doua simulari au rolul de a testa sistemul PLC-Microcontroler-Android si de a simula doua motoare electrice ale unei drone in momentul in care asupra lor se actoneaza o frana.

Motorul de simulare AndEnginePhysicsBox2:

Motorul Box2D este o componenta a librariei AndEngine ce face posibila efectuarea de operatiuni cu origini legte de fizica. Box2D a fost scris initial de Erin Catto in limbaj C++, el fiind adaptat ulterior pentru mai multe limbaje de programare precum Java.

Mediul pus la dispozitie de libraria Box2D ne permite sa construim obiecte care sa se comporte asemanator ca si in viata reala . Acest mediu este format din corpuri, puncte fixe, articulatii si constrangeri ce formeaza o simulare fizica a acestei lumi.

Corpurile sunt componentele de baza a simularii Box2D, ele putand lua atriute fizice mai complexe daca sunt asociate cu forme, constrangeri sau puncte fixe. Aceste corpuri sunt toate rigide, iar formele lor nu devin distorsionate.

Corpurile pot fi:

Dinamice: acestea sunt simulate integral intr-un mediu virtual si nu au intoadeauna o masa finita,ele putand sa interactioneze cu alte corpuri statice sau cinematice.

Statice: acestea sunt fixate in loc iar in momentul simularii actioneaza ca si cum ar avea masa infinita , ele putand sa interactioneze cu alte corpuri dinamice.

Cinematice: acestea nu reactioneaza la alte forte si nu fac parte din simularea fizica, comportandu-se ca si cum ar avea o masa infinita.Ele pot sa interactioneze cu corpurile dinamice.

Pentru dezvoltarea de jocuri Box2D adauga claselor existente in AndEngine 16 noi clase ce fac posibila simularea elementelor de natura fizica. Pentru crearea unui joc , sunt necesare trei clase: PhysicsWorld (reprezinta lumea Box2D), PhysicsConnector ( conecteaza entitatile din libraria AndEngine cu corpurile Box2D) si PhysicsFactory (genereaza corpuri si puncte fixe).

Crearea unei lumi PhysicsWorld se poate face folosind o clasa cu aceeasi denumire la care se adauga o scena AndEngine cu doi constructori. Aceasta arata astfel:

PhysicsWorld(final Vector2 pGravity, final boolean pAllowSleep)

PhysicsWorld(final Vector2 pGravity, final boolean pAllowSleep, final int

pVelocityIterations, final int pPositionIterations)

Crearea punctelor de fixare se poate face folosind o clasa cu denumirea PhysicsFactory si poate arata astfel:

FixtureDef createFixtureDef(final float pDensity, final float pElasticity,

final float pFriction, final boolean pSensor)

FixtureDef createFixtureDef(final float pDensity, final float pElasticity,

final float pFriction, final boolean pSensor, final short pCategoryBits,

final short pMaskBits, final short pGroupIndex)

Crearea de corpuri se poate face folosind o clasa cu denumirea PhysicsFactory si poate arata astfel:

Body createCircleBody(final PhysicsWorld pPhysicsWorld, final IShape pIShape, final

BodyType pBodyType, final FixtureDef pFixtureDef)

Body createPolygonBody(final PhysicsWorld pPhysicsWorld, final IShape pIShape, final Vector2[]

pVertices, final BodyType pBodyType, final FixtureDef pFixtureDef)

Clasa PhysicsConnector face posibila reducerea decalajului dintre entitatile librariei AndEngine si componentele extensiei AndEnginePhysicsBox2.

5.3.2. Programul principal Android

Aplicatia Android a fost conceputa pentru a simula functionalitatea sistemului PLC-Microcontrolar-Android dar si pentru a simula doua motoare electrice ale unei drone ce primeste informatii de la PLC prin intermediul unui Microcontroler PIC18F4550.

Pentru scrierea aplicatiei am folosit un limbaj de programare Java implementat in aplicatia Eclipse IDE( soft ce contine modulul de implementare al aplicatiilor Android).

Schema bloc a aplicatiei Android:

In aceasta schema se pot observa obiectele principale ale aplicatiei scrisa in limbaj Java ce poate fi rulata de pe un dispozitiv Smartphone sau Tableta .

Modul de functionare al aplicatiei este urmatoarul: atunci cand este conectat Microcontrolerul la un port USB se initiaza o conexiune iar aplicatia este pornita. In interiorul aplicatiei pot avea loc doua tipuri de simulari: una folosind placuta de testare pentru verificarea functionalitatii sistemului si alta pentru a simula doua motoare ale unei drone folosind parametrii primiti de la PLC prin intermediul Microcontrolerului.

Metoda apelata la initierea aplicatiei Android este urmatoarea:

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

MainActivity.thisObject = this;

this.showNoDeviceView();

}

In cazul in care nu este conecta niciun dispozitiv aplicatia ne va afisa un mesaj si va fi initiata urmatoarea metoda:

public void showNoDeviceView() {

setContentView(R.layout.activity_main);

SetupObject = null;

}

Pentru a verifica conexiunea oricarui dispozitiv la portul USB, exista un ”listener” iar atunci cand este conectat Microcontrolerul va fi posibila efectuarea primei simulari in meniul Debug.

Initierea acestui ”listner ” se face folosind urmatoarea metoda:

filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);

filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);

registerReceiver(receiver, filter);

PendingIntent.getBroadcast(this,0,new Intent(getPackageName()+".USB_PERMISSION"),0);

In cazul in care exista o conexiune la Microcontroler este apelata metoda showMainView() si va fi initiat dispozitivul Device care va primi informatia legata de starea pinilor de intrare/iesire.

public Device loadDevice(UsbDevice device) {

// Check the USB device to see if it is our device

if ((device.getVendorId()==(int)0x04D8)&&(device.getProductId()==(int)0x003F)) {

showMainView();

return new Device(this.getApplicationContext(), device, handler);

}

return null;

}

Pentru recunoasterea Microcontrolerului sunt necesare VendorID: 04D8 si ProductID: 003F.

Dupa ce este conectat Microcontrolerul putem efectua o simulare pentru testarea pinilor de intrare/iesire. Aceasta se face cu ajutorul unui obiect ”obiectDevice() ” astfel:

private final static byte DIN_Request = (byte) 0x81;

private final static byte DOUT_Request = (byte) 0x80;

private final static byte AIN_Request = (byte) 0x37;

private final static byte AOUT_Request = (byte) 0x38;

private final byte DIN[] = {0, 0, 0, 0, 0, 0, 0, 0};

private final byte DOUT[] = {0, 0, 0, 0, 0, 0, 0, 0};

private final int AIN[] = {0, 0, 0, 0, 0};

private final int AOUT[] = {0, 0};

private UsbDevice device = null;

private UsbManager manager = null;

private Handler handler = null;

private Boolean closeRequested = Boolean.valueOf(false);

private UsbDeviceConnection connection;

private UsbInterface intf;

private boolean connected = false;

Comunicarea intre dispozitive se face prin setarea pinilor de iesire analog AOUT cu valori din alpicatie. Aceste valori sunt transmise prin Microcontroler de la Aplicatia Android catre PLC.

synchronized (this.AOUT) {

for (int index = 1; index <= this.AOUT.length; index++) {

byte[] Packet = new byte[] {

(byte) AOUT_Request,

(byte) index,

(byte) this.AOUT[index – 1],

(byte) (this.AOUT[index – 1] >> 8)

};

do {

result = connection.bulkTransfer(endpointOUT, Packet, Packet.length, 1000);

} while ((result < 0) && (wasCloseRequested() == false));

}

}

In momentul in care de la PLC prin intermediul Microcontrolerului in interiorul aplicatiei Android sunt primite informatii este folosita urmatoarea metoda a obiectului Device():

synchronized (this.AIN) {

for (int index = 1; index <= this.AIN.length; index++) {

/* Send the request to read the Potentiometer */

byte[] Packet = new byte[] {

(byte) AIN_Request,

(byte) index

};

do {

result = connection.bulkTransfer(endpointOUT, Packet, Packet.length, 1000);

} while ((result < 0) && (wasCloseRequested() == false));

/* Read the results of that request */

byte[] PacketResults = new byte[64];

do {

result = connection.bulkTransfer(endpointIN, PacketResults, PacketResults.length, 1000);

} while ((result < 0) && (wasCloseRequested() == false));

/* Convert the resulting data to an int */

byte[] AINBuffer = new byte[] { 0, 0, 0, 0 };

AINBuffer[0] = PacketResults[1];

AINBuffer[1] = PacketResults[2];

ByteBuffer buf = ByteBuffer.wrap(AINBuffer);

buf.order(ByteOrder.LITTLE_ENDIAN);

int AINResults = buf.getInt();

/*

* If the new results are different from the previous

* results, then send a message to the specified handler

* containing the new data.

*/

if (AINResults != this.AIN[index – 1]) {

this.AIN[index – 1] = AINResults;

handler.obtainMessage(0, new DeviceMessageAIN(index, AINResults)).sendToTarget();

}

}

}

5.3.3. Parametrii de intrare/ieșire

Pentru a testa starile pinilor de intrare/iesire folosim placa de testare ce contine butoane si potentiometre .

Prin apasarea butoanelor cu valoarea initiala OFF din interiorul aplicatiei Android se poat observa pe placa de testare aprinderea unor leduri.

Metoda prin care informatiile sunt stocate in obiectul Device() cu valorile lor actualizate este updateAIN () si arata astfel:

protected void updateAIN(int index, int value) {

SeekBar AIN = getAIN(index);

AIN.setProgress(value);

}

Pentru a trimite valoarea dorita la Microcontroler si pentru a seta intensitatea cu care doua leduri lumineaza se apeleaza urmatoarea metoda:

protected void sendAOUT(int index, int value){

MainActivity.deviceObject.Send_AOUT(index, value);

}

5.3.4. Simularea motoarelor dronei.

Aplicatia Android pune la dispozitie o simulare a doua motoare electrice ale unei drone prin accesarea meniului Motor. In acest meniu pot fi setati parametrii de intrare a simularii , iar prin accesarea butonului Simulare se porneste simularea celor doua motoare.

Dupa pornirea simularii valorile nu mai pot fi modificate, numai daca este repornita aplicatia, ele fiind reintroduse manual. Acest lucru se poate observa in urmtoarea secventa de cod::

public SetupMotor(int templateResource, int titleResource) {

super(templateResource, titleResource);

final Button startButton = (Button) context.findViewById

(R.id.startButton);

startButton.setOnClickListener(new View.OnClickListener() {

public void onClick(View view) {

Spinner spinner,spinner2;

String valToSet,valToSet2;

spinner2 = (Spinner)context.findViewById(R.id.initAngularDamping2);

valToSet2 = spinner2.getSelectedItem().toString();

SimulatorMotorActivity.setInitValue("initAngularDamping2",

Float.parseFloat(valToSet2));

spinner2 = (Spinner)context.findViewById(R.id.stepAngularDamping2);

valToSet2 = spinner2.getSelectedItem().toString();

SimulatorMotorActivity.setInitValue("stepAngularDamping2",

Float.parseFloat(valToSet2));

spinner2 = (Spinner)context.findViewById(R.id.maxAngularDamping2);

valToSet2 = spinner2.getSelectedItem().toString();

SimulatorMotorActivity.setInitValue("maxAngularDamping2",

Float.parseFloat(valToSet2));

spinner2 = (Spinner)context.findViewById(R.id.stepTorque2);

valToSet2 = spinner2.getSelectedItem().toString();

SimulatorMotorActivity.setInitValue("stepTorque2",

Float.parseFloat(valToSet2));

spinner2 = (Spinner)context.findViewById(R.id.maxTorque2);

valToSet2 = spinner2.getSelectedItem().toString();

SimulatorMotorActivity.setInitValue("maxTorque2",

Float.parseFloat(valToSet2));

spinner2 = (Spinner)context.findViewById(R.id.motorSpeed2);

valToSet2 = spinner2.getSelectedItem().toString();

SimulatorMotorActivity.setInitValue("motorSpeed2",

Float.parseFloat(valToSet2) / 100);

spinner = (Spinner)context.findViewById(R.id.initAngularDamping);

valToSet = spinner.getSelectedItem().toString();

SimulatorMotorActivity.setInitValue("initAngularDamping",

Float.parseFloat(valToSet));

spinner = (Spinner)context.findViewById(R.id.stepAngularDamping);

valToSet = spinner.getSelectedItem().toString(); SimulatorMotorActivity.setInitValue("stepAngularDamping",

Float.parseFloat(valToSet))

spinner = (Spinner)context.findViewById(R.id.maxAngularDamping);

valToSet = spinner.getSelectedItem().toString(); SimulatorMotorActivity.setInitValue("maxAngularDamping",

Float.parseFloat(valToSet));

spinner = (Spinner)context.findViewById(R.id.stepTorque);

valToSet = spinner.getSelectedItem().toString();

SimulatorMotorActivity.setInitValue("stepTorque",

Float.parseFloat(valToSet));

spinner = (Spinner)context.findViewById(R.id.maxTorque);

valToSet = spinner.getSelectedItem().toString();

SimulatorMotorActivity.setInitValue("maxTorque",

Float.parseFloat(valToSet));

spinner = (Spinner)context.findViewById(R.id.motorSpeed);

valToSet = spinner.getSelectedItem().toString();

SimulatorMotorActivity.setInitValue("motorSpeed",

Float.parseFloat(valToSet) / 100);

Intent simulatorView = new Intent(context, SimulatorMotorActivity.class);

context.startActivity(simulatorView);} }); }

Valorile din obiectul Device() sunt citite sau setate de catre simulator prin intermediul comenzii context.startActivity(simulatorView) astfel:

protected void sendAOUT(int index, int value){

Device deviceObject = SimulatorMotorActivity.getDeviceInstance();

if(deviceObject != null){

deviceObject.Send_AOUT(index, value);

}

}

Simularea contine mai multe elemente precum: doua elice si doua componente de tip ” Gear ” care sunt puse in miscare cu ajutorul celor doua motoare ale dronei. Elicele intampinand mai multe operatiuni de natura fizica precum: masa si forta de frecare vor fi puse in miscare de catre tensiunea furnizata de automatul SIEMENS S7-1200.

Elicele care deasemenea contin doua componente de tip ”Gear” ating comonentele ”Gear ” puse in miscare de catre cele doua motoare si astfel se obtine un transfer de miscare datorita unei forte de frecare. Informatia afisata reprezinta detalii referitoare la miscarea celor doua elice, aceassta fiind calculata cu ajutorul librariei AndEnginePhysicsBox2 ce efectueaza operatiuni ce tin de fizica.

Pentru a observa modul de creare a unui element grafic , se poate consulta urmatoarea secventa de cod ce permite crearea unei elice .

// Gear

this.textureObjects.put("motorGear", new BitmapTexture(this.getTextureManager(), new IInputStreamOpener() {

@Override

public InputStream open() throws IOException {

return getAssets().open("gfx/Gear.png");

}

})

);

Se poate folosi acelasi cod pentru a crea alte obiecte cu exceptia numelui si al fisierului ce are extensia png sau jpg care trebuie sa fie diferit.

Putem seta puterea microcontrolarului cu ajutorul celor cinci potentiometre. Astfel cu ajutorul unei surubelnite putem mari sau micsora puterea manual prin rotirea celor cinci suruburi de pe potentiometre. Daca am facut acest lucru putem observa in aplicatia Android cum valoarea Analog IN a fiecarui potentiometru se modifica.

Daca avem toate potentiometrele in pozitia 0 cele doua elice nu se vor roti.

Daca potentiometrele au valori mai mari decat zero cele doua motoare sunt puse in miscare iar elicele se invart cu o viteza constanta. Putem observa pozitia celor trei cercuri care difera fata de starea lor initiala.

Dupa crearea sprite-urilor(obiectelor) care aplica doar texturi pe obiectele propiu zise, aceste trebuiesc initiate aceste obiecte pentru a indeplini diverse operatiuni. Aceasta se face astfel:

Metoda de initializare a motorului si a componentei Gear:

private void initGear(){

/* Calculate the coordinates for the sprite, so its centered on the camera. */

final float centerX = (CAMERA_WIDTH – this.textureObjects.get("gear").getWidth()) / 2;

final float centerY = (CAMERA_HEIGHT- this.textureObjects.get("gear").getHeight())/ 2;

final FixtureDef objectFixtureDef = PhysicsFactory.createFixtureDef(1, 0, 10000);

final Sprite sprite = new Sprite(centerX – 1325, centerY, this.textureRegionObjects.get

("gear"), this.getVertexBufferObjectManager()) {

@Override

protected void onManagedUpdate(float pSecondsElapsed) {

super.onManagedUpdate(pSecondsElapsed);

updateMotorText(bodyObjects.get("gear").getAngularVelocity());

}

};

final Body spriteBody = PhysicsFactory.createCircleBody(this.mPhysicsWorld, sprite,

BodyType.DynamicBody, objectFixtureDef);

this.mScene.attachChild(sprite);

this.mScene.registerTouchArea(sprite);

this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(sprite, spriteBody, true,

true));

final RevoluteJointDef revoluteJointDef1 = new RevoluteJointDef();

revoluteJointDef1.initialize(spriteBody, this.bodyObjects.get("ground"), spriteBody.

getWorldCenter());

revoluteJointDef1.enableMotor = true;

revoluteJointDef1.motorSpeed = -1 * getInitValue("motorSpeed");

revoluteJointDef1.maxMotorTorque = 0;

this.motorJoint = this.mPhysicsWorld.createJoint(revoluteJointDef1);

this.bodyObjects.put("gear", spriteBody);

this.revoluteJointDef1 = revoluteJointDef1;

}

Metoda de initializare a unei elice:

private void initPropeller (){

/* Calculate the coordinates for the sprite, so its centered on the camera. */

final float centerX = (CAMERA_WIDTH – this.textureObjects.get("propeller").getWidth()) / 2;

final float centerY = (CAMERA_HEIGHT – this.textureObjects.get("propeller ").getHeight()) / 2;

final FixtureDef objectFixtureDef = PhysicsFactory.createFixtureDef(0.2f, 0, 10000);

final Sprite sprite = new Sprite(centerX + 200, centerY, this.textureRegionObjects.get("propeller "),

this.getVertexBufferObjectManager()){

@Override

protected void onManagedUpdate(float pSecondsElapsed) {

super.onManagedUpdate(pSecondsElapsed);

updateSpinedText(bodyObjects.get("propeller ").getAngularVelocity());

sendSpinedData(bodyObjects.get("propeller ").getAngularVelocity());

}

};

final Body spriteBody = PhysicsFactory.createCircleBody(this.mPhysicsWorld, sprite,

BodyType.DynamicBody, objectFixtureDef);

spriteBody.setAngularDamping(getInitValue("initAngularDamping"));

this.mScene.attachChild(sprite);

this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(sprite,spriteBody true, true));

final RevoluteJointDef revoluteJointDef1 = new RevoluteJointDef();

revoluteJointDef1.initialize(spriteBody,this.bodyObjects.get("ground"),spriteBody.getWorldCenter());

revoluteJointDef1.enableMotor = false;

this.mPhysicsWorld.createJoint(revoluteJointDef1);

this.bodyObjects.put("propeller", spriteBody) ;

}

Textele sunt initiate folosind urmatoarea metoda :

this.textObjects.put("spined", new Text(2800, 60, this.mFont, "Rotatii roata: 0123456789.

rpm/", new TextOptions(HorizontalAlign.LEFT), this.getVertexBufferObjectManager()));

this.updateSpinedText2(0);

this.mScene.attachChild(this.textObjects.get("spined"));

Pentru sincronizarea textelor vom folosi urmatoarea metoda:

public void updateMaxTorqueText(float value){

this.textObjects.get("maxTorque").setText("Putere primita: " + String.format("%.0f", value) + " Nm / " + String.format("%.0f", getInitValue("maxTorque")) + " Nm");

}

Secventa de cod care se ocupa de miscare unei elice este urmatoarea:

public void setMaxTorque(final float torque) {

float maxTorque = getInitValue("maxTorque");

float stepTorque = getInitValue("stepTorque");

float steps = maxTorque / stepTorque;

float stepTorqueCalculated = 0;

float torqueCalculated = torque;

if (torqueCalculated > stepTorque / 5) {

for (float i = 1; i <= steps; i++) {

stepTorqueCalculated = i * stepTorque;

if (torqueCalculated <= stepTorqueCalculated) {

torqueCalculated = stepTorqueCalculated; break;

}

}

} else {

torqueCalculated = 0;

}

if (maxMotorTorque != torqueCalculated) { maxMotorTorque = torqueCalculated; }

}

Pentru a transmite la microcontroler viteza cu care se va invarti elicea vom folosi urmatoarea secventa de cod:

private void sendSpinedData(float value){

value = -1 * value;

float maxMotorSpeed = getInitValue("motorSpeed");

float maxSpinedSpeed = maxMotorSpeed / 3.1f;

float calculatedSpinedSpeed = (value * 1023) / maxSpinedSpeed;

if(calculatedSpinedSpeed > 1023){ calculatedSpinedSpeed = 1023; }

deviceObject.Send_AOUT(1, (int)calculatedSpinedSpeed);

}

5.4 . Simularea unei drone in Unity

5.4.1. Notiuni generale:

Unity este o platforma folosita pentru crearea jocurilor video cu un IDE integrat, fondat in anul 2005 de catre firma Unity Technologies.

Acesta foloseste limbajul C++ , iar Ide-ul foloseste limbajul C#.

Jocurile create pot rula pe platforme precum: Windows, console, Android, IOS si Web.

Versiunea folosita pentru crearea aplicatiei este una Free: Unity 3D V5.3.5f1 cu obiecte (assets-uri) puse la dispozitie de aceasta aplicatie. Componentele de tip assets pot fi achizitionate de pe Assets Store direct din aplicatia Unity editor dar si de pe site-ul: https://assetstore.unity3d.com/ (Exemplu de joc creat in Unity este ”Temple Run”).

5.4.2. Fisierele sursa, componente si rolul lor:

Aplicatia contine urmatoarele fisiere sursa:

DroneBase.cs – contine scriptul pentru configurare obiectului de suport al dronei.

Propeller.cs – contine scriptul de configurare al elicelor.

HoverFollowCam.cs – contine scriptul pentru configurarea ecranului si al unghiului din care este vazuta drona in momentul rularii aplicatiei

Reset.cs – contine scriptul pentru butonul de reset.

WaterFlowFREEDemo.cs – un script pus la dispozitie de Unity pentru simularea apei.

Componentele aplicatiei:

Componente Drona

Doua componente 3D de tip ”Cube” redimensionate pentru a arata in foma X .

Patru componente 3D de tip ”Cylinder” care sunt folosite pe post de suport al elicelor.

Patru componente de tip ”Cube” redimensionare si cu denumirea ”Propeller” care reprezinta elicele dronei.

Componente Canvas(ecranul principal )

Un panou ”ThrottlePanel ” pentru afisarea puterii primite de cele patru motoare ale dronei.

O componenta ”TextPanel ” pentru a denumi cele patru motoare.

Patru componente ”Slider” care au rolul de a afisa puterea primita de fiecare motor individual.

Mai multe componente de tip ”Terain”pentru a simula pamantul.

Mai multe componente de tip ”Tree” pentru ambient.

O componenta de tip ”Water” pentru simularea apei.

5.4.3. Configurarea dronei.

Aplicatia fost creata cu ajutorul softului Unity V5.3.5f si poate fi rulata din Windows , avand un fisier executabil sau de pe un dispozitiv Android daca este instalata aplicatia apk.

Daca dorim aplicatia poate fi importata in programul Unity astfel: deschideti Unity Open selectati folderul in care este aplicatia si apasati butonul Select.

Dupa ce s-a incarcat aplicatia se va observa cum in meniul Project vor fi incarcate Obiectele (assetsurile).

Pasul urmator este sa accesati File OpenSene selectati din folderul proiectului, folderul Assets unde poate fi gasit fisierul TestScene pe care trebuie sa-l deschidem.

Drona a fost creata prin redimensionarea a doua cuburi pentru a forma baza. La aceasta s-au mai adaugat patru componente cilindrice pe post de suport al elicelor si patru elice care reprezinte patru motoare ale dronei. Drona a fost programata folosind un fisier scris in C# cu denumirea ”DroneController.cs” sa actioneze elicele in functie de anumite comenzi iar elicele care folosesc un fisier scris in C# cu denumirea ”Propeller.cs” sa se invarta dupa un anumit tipar

Model simplu de drona cu patru motoare

Putem observa in secventa de cod DroneController.cs obiectele declarate care sunt incluse in aceasta simulare si valorile atribuite acestora.

public class DroneController : MonoBehaviour {

[SerializeField] Transform[] m_propellers;

[SerializeField] Slider[] m_throttleSliders; // Slider

[SerializeField] Text[] m_throttleTexts; // Denumire slider

[SerializeField] Propeller[] m_propellerBlades; //elice

float[] m_throttles = {0f,0f,0f,0f};

const float c_maxThrottle = 100f;

const float c_throttleIncreaseRate = 100f;

const float c_torqueScalar = 500f;

Drona se poate deplasa prin cresterea puterii unui motor in mod individual si scaderea puterii motorului diametral opus lui(Exemplu: Daca crestem puterea motorului din fata scade motorul din spate). Pentru a arata acest proces avem urmatoarea secventa de cod:

void TiltForward () {

//propellers 1 UP

m_throttles[0] = ShiftThrottle (m_throttles[0], 0f);

m_throttles[1] = ShiftThrottle (m_throttles[1], 1f);

m_throttles[2] = ShiftThrottle (m_throttles[2], -1f);

m_throttles[3] = ShiftThrottle (m_throttles[3], 0f);

}

void TiltBack () {

//propellers 2 and 3 DOWN

m_throttles[0] = ShiftThrottle (m_throttles[0], 0f);

m_throttles[1] = ShiftThrottle (m_throttles[1], -1f);

m_throttles[2] = ShiftThrottle (m_throttles[2], 1f);

m_throttles[3] = ShiftThrottle (m_throttles[3], 0f);

}

void TiltRight () {

//propellers 1 and 3 RIGHT

m_throttles[0] = ShiftThrottle (m_throttles[0], 1f);

m_throttles[1] = ShiftThrottle (m_throttles[1], 0f);

m_throttles[2] = ShiftThrottle (m_throttles[2], 0f);

m_throttles[3] = ShiftThrottle (m_throttles[3], -1f);

}

void TiltLeft () {

//propellers 0 and 2 LEFT

m_throttles[0] = ShiftThrottle (m_throttles[0], -1f);

m_throttles[1] = ShiftThrottle (m_throttles[1], 0f);

m_throttles[2] = ShiftThrottle (m_throttles[2], 0f);

m_throttles[3] = ShiftThrottle (m_throttles[3], 1f);

}

Secventa de mai sus permite si gruparea mai multor motoare numai prin schimbarea valorii 0f sau -1f cu 1f.

Metoda care returneaza valoarea calculata a puterii unui motorului este urmatoarea:

float ShiftThrottle (float referenceThrottle, float direction) {

float returnVal = (Time.deltaTime * direction * c_throttleIncreaseRate + referenceThrottle);

if (returnVal > c_maxThrottle) {

returnVal = c_maxThrottle;

} else if (returnVal < 0) {

returnVal = 0;

}

return returnVal;

}

Elicele au fost configurate sa se invarta in sensul invers al acelor ceasornicului dupa cum putem observa in continuare:

public class Propeller : MonoBehaviour {

public float m_propellerThrottle = 0;

const float c_propellerMultiplier = 100f;

[SerializeField] float counterclockwise;

// Use this for initialization

void Start () {

}

// Update is called once per frame

void Update () {

transform.RotateAround (transform.position, transform.up, Time.deltaTime * m_propellerThrottle * c_propellerMultiplier * counterclockwise);

}

}

6 . Modul de functionare al aplicatiilor

Sistemul de simulare PLC-Microcontroler-Android

6.1.1 Testarea aplicatiei folosind placa de testare și controlul de pe tableta al acesteia

Simularea folosind placuta de testare.

Pentru a conecta placa principala ce contine microcontrolerul PIC18F4550 la placa de testare se

foloseste o componenta de tip panglica. Dupa ce am facut acest lucru trebuie conectata Tableta la microcontroler, folosind un cablu USB si un HUB pentru a face legatura la tableta in cazul in care nu exista un port USB in tableta.

Daca conexiunea exista, atunci aplicatia intra in programul principal si vom putea folosi meniul ”Placuta testare” pentru a efectua diferite operatiuni pe placa de testare. Prin folosirea unei surubelnite asupra potentiometrelor putem schimba valorile transmise in mod manual si vom observa cum in dreptul Analog IN se vor schimba valorile primite de aplicatia Android. Butoanele din dreptul Info OUT vor aprinte fiecare cate un led de pe microcontroler iar doua dintre leduri vor fi aprinse folosind cursorul din dreptul Analog OUT.

Simularea celor doua motoare ale dronei.

O alta simulare pe care o putem efectua este a doua motoare electrice, a unei drone. Aceasta se face accesand meniul ”Simulare drona” si prin apasasarea butonului ”Simulare”. In momentul in care am ales valorile initiale si am apasat butonul ”Simulare” vom observa doua obiecte de tip ”elice” care se invart in functie de valoarea primita din potentiometre.

Simularea motoarelor electrice ce folosesc automate SIEMENS

Pentru aceasta simulare vom folosi un sistem format din aplicatia Android, microcontroler si sistemul de automatizare PLC. Scopul este de a simula doua motoare ale unei drone folosind doua aplicatii software( aplicatia Android si cea in Tia Portal) si doua componente hardware(sistemul de automatizare PLC SIMATIC S7-1200 si microcontrolerul) pentru a obtine un rezultat comun.

In mediul Tia Portal sunt create doua componente de tip ” PID_Control” care au ca scop simularea vitezei a doua motoare electrice.

Aplicatia de tip Android exercita o frana asupra celor doua componente de tip PID din mediul Tia Portal pentru a scadea viteza ,lucru care se poate oserva pe un grafic in mediul TIA(printr-un Setpoint) dar si din modul in care se invarte elicea in simularea de pe tableta.

Acest lucru este posibil datorita microcontrolerului care transforma informatia primita de la tableta in tensiune trimisa catre PLC si invers.

Pasi de urmat:

Se introduce cablul de tip panglica atasat placii de baza in care se regaseste microcontrolerul la

placa de conectare cu PLC-ul si se conecteaza Tableta la microcontroler printr-o conexiune USB. Placa de conectare se conecteaza prin masa GND la masa GND a PLC-ului , pinul AOUT2 la Analog I0 si pinul AIN1 la AnalogQ0. Acelasi proces se repeta si pentru al doile model, insa difera pinii care sunt AOUT4 la AnalogI2 si AIN2 la AnalogQ2.

Se ruleaza aplicatia in TIA Portal V13 si se conecteaza printr-un cablul de retea la calculator si la

PLC. Dupa ce s-a incarcat dispozitivul urmatorul pas este sa apasam butonul ”Go online” pentru a comunica cu sistemul PLC si se apasa butonul din cadrul PLCTechnology objects Commisioning.

Pe tabloul PLC se pozitioneaza switc-ul AnlogI1 pe pozitia sus si AnalogI0 pe pozitia jos, astfel

AnalogI0 va primi curent printr-un cablu conectat la microcontroler prin placa de conectare si AnalogI1 va primi curent de la un generator controlat printr-un potentiometru de pe PLC. Acelasi lucru il facem si pentru a simula al doilea motor numai ca in loc de AnalogI1 va fi AnalogI2 iar AnalogI0 va fi AnalogI3. Pentu a incepe simularea din starea de repaus, potentiometrul trebuie sa fie pe pozitia 0.

Urmatorul pas este sa rulam aplicatia de pe tableta si sa pornim simularea celor doua

motoare ale dronei din meniul ”Simulare drona”. Daca potentiometrul are valoarea 0 vom observa ca motorul pentru care rulam simularea este intr-o stare de repaus.

In momentul in care rotim din potentiometru se genereaza o tensiune, iar motorul din simulator va

exercita un impuls catre aplicatia Andoid iar elicea va avea o viteza corespunzatoare cu valoarea potentiometrului.Acest lucru se poate face si pentru cealalta elice.

Daca PLC-ul este Online iar graficul este pornit atunci va avea loc simularea.

Exemplu 1 de simulare si pasi de urmat:

Initial setam potentiometrul pe pozitia 0, astfel una din elice va fi in stare de repaus.

Setam frana exercitata din aplicatia Android meniul Simulare Drona sa fie de 0.4

Din pozitia 0 rotim potentiometrul in proportie de 60% pana depaseste jumatatea si astfel putem observa cum Output-ul urca la urca la 65% si cum Setpoint-ul este egal cu Input-ul atunci cand scade la 15.7% si ramane constant datorita Setpoint-ului care este egal cu Input-ul. Putem observa acest lucru in imaginile urmatoare.

In continuare vom mari frana de folosind butoanele ”+” din aplicatia Android la 1.5 pentru a schimba valoarea Setpoint-ului din graficul afisat in Tia Portal. Astfel vom observa ca Outputul va creste de la 15.7% la 53.3% si viteza ramane la1565 rpm .Astfel avem dovada ca aplicatia de PID_Control functioneaza.

Exemplu 2 de simulare si pasi de urmat:

Pornim cu potentiometrul la jumatate iar frana simulatorului o setam sa fie 1.5 . Daca scadem frana la 0.6 se poate observa cum in grafic scade Output-ul, deoarece este nevoie de o tensiune mai mica pentru a mentine viteza la valoarea dorita.Daca scadem valoarea potentiometrului la 25% vom observa cum scade brusc si Setpoint-ul, iar Output-ul va scadea la 8.5%.

In continuare vom mari frana prin actionarea butonului ” + ” din aplicatia Android ,astfel va creste valoarea Output-ului si tensiunea aplicata motorului pentru a mentine viteza constanta(val 660).

Atunci cand actionam o frana asupra motorului PLC-ul va ridica tensiunea pentru a mentine o viteza constanta a elicelor.

6.2 Simularea unei drone in Unity.

Simularea este formata dintr-o aplicatie scrisa in Unity si care foloseste elemente de tip C# si JAVA .Ea poate fi salvata si in mediul Eclipse sub forma unei aplicatii Android cu ajutorul unui plugin adaugat Unity numit unity2eclipse ce poate fi achizitionat din Assets store. Aceasta aplicatie simuleaza o drona cu patru motoare ce poate fi controlata prin intermediul unor sageti si a doua butoane: unul pentru ascensiune si altul pentru decadere. Drona a fost creata prin combinarea a mai multor obiecte 3D (assetsuri) : doua cuburi(remodelate) folosite pe post de baza a dronei , patru componente cilindrice pe post de suport a elicelor, si alte patru cuburi care au fost redimensionate pentru a arata asemanator cu o elice.

In acest moment putem incarca aplicatia folosind pasii mentionati anterior si putem apasa butonul Play pentru a rula aplicatia.

Initial drona se afla intr-o pozitie de repaus, dupa cum putem observa motoarele au valoarea 0 ceea ce inseamna ca puterea primita de acestea este nula.

Pentru a porni drona si pentru a o ridica de la sol putem apasa tasta ”A”. Astfel daca puterea motoarelor depaseste valoarea stabilita de 24.00, drona se va ridica usor.Daca dorim sa coboram puterea motoarelor putem apasa tasta ”X”.

Motoarele dronei pot fi actionate in mod individual astfel: prin tasta ”I” motorul din fata va primi putere iar puterea celui din spate va scadea, prin tasta ”L” motorul din dreapta va primi putere iar puterea celui din stanga va scadea, prin tasta ”K” puterea motorului din spate va creste iar cel din spate va scadea, prin tasta ”J” puterea motorului in stanga va creste iar cel din dreapta va scadea.

Deasemenea exista si tasta ”S” care intoarce drona spre partea stanga si tasta ”D” care intoarce drona spre partea dreapta.

7. Concluzii

Sistemele de reglare automata sunt folositoare deoarece mentin unele procese la o valoare stabilita initial si nu necesita interventia omului pentru efectuarea fiecarei sarcini in parte.

Folosind simulatorul bazat pe PLC-Microcontroler-Android putem verifica modul in care echipamentele se comporta in situatii critice, precum , situatia in care motorul necesita o putere mai mare pentru a rula deoarece asupra lui este exercitata o frana. Datorita extensiei AndroidAndEngineBox2D putem simula si alte lucruri precum: un ascensor cu toate componentele sale, un sistem de semaforizare sau un sistem control al temperaturii.

Simularea creata Unity ne ofera posibilitatea de a simula o drona intr-un mediu virtual si de a vedea modul in care se comporta aceasta atunci cand asupra motoarelor sale este exercitata o putere. Astfel motoarele primesc puterea necesara facand posibila deplasarea acesteia. Asemanator putem simula si alte lucruri in Unity precum: un sistem de recunoastere a sunetelor intr-un mediu, simularea unei schimbari climatice etc.

Putem preciza ca am abordat urmatoarele subiecte:

In capitolul 1 am discutat notiuni generale pentru a intelege mai bine un astfel de sistem

In capitolul 2 am urmat toti pasii pentru a vedea cum se ajunge la unul de tip PID.

In capitolul 3 am prezentat sistemul PID format din PLC-Microcontroler-Android.

In capitolul 4 am specificat rolul si componentele hardware folosite pentru simularea PLC-Microcontroler-Android.

In capitolul 5 am prezentat aplicatiile software utilizare pentru cele doua simulari: PLC-Microcontroler- Android si aplicatia in Unity.

In capitolul 6 am prezentat cele doua simulari.

Aceste simulari sunt importante deoarece putem evalua dispozitivele cu care dorim sa lucram si astfel se pot evita situatii in care acestea se deterioreaza si nu mai pot fi folosite.Astfel am simulat cu succes o drona intr-un mediu virtual si am realizat simularea a doua elice puse in miscare de doua motoare electrice, controlate de pe un Automat programabil.

In locul aplicatiei Unity putem folosi orice soft ce poate implementa in limbaj C# sau Java , exceptia fiind ca in Unity obiectele sunt create mai usor prin incarcarea lor in dispozitiv si pozitionarea lor pe ecranul principal . Daca folosim alt mijloc de implementare este posibil sa fim nevoiti sa declaram aceste obiecte.

Sistemul de automatizare PLC poate fi inlocui si el la randul lui cu un alt automat programabil iar componentele folosite pot fi utilizate si ele pentru a indeplini acelasi rol.

Bibliografie

Similar Posts