SISTEM DE SIMULARE HARDSOFT A UNEI DRONE FOLOSIND TEHNOLOGII JAVA ȘI AUTOMATE SIEMENS [307669]

UNIVERSITATEA “TITU MAIORESCU” DIN BUCUREȘTI

FACULTATEA DE INFORMATICĂ

LUCRARE DE LICENȚĂ

SISTEM DE SIMULARE HARD/SOFT A UNEI DRONE FOLOSIND TEHNOLOGII JAVA ȘI 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ă dezvoltării 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, 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 măsurare a senzorilor, comparând valoarea dorită și este reglată o ieșire de control pe baza diferențelor găsite.

[anonimizat], acesta este proiectată să avertizeze șoferul atunci când 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ă și tehnici de aplicare al algoritmilor PID la sisteme care nu indeplinesc aceste sarcini.

Această lucrare are ca obiectiv realizarea unei aplicații ce permite simularea a [anonimizat] S7 1200 și un soft TIA Portal V13 pentru implementarea a [anonimizat]. Se mai adaugă și o aplicatie ce simulează o [anonimizat]. În realizarea acestei teme am lucrat cu urmatoarele tehnologii:

modulul programabil PLC SIMATIC S7 1200 , implicit cu 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++, în softul

MPLAB-X.

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

[anonimizat], folosind softul Unity.

Lucrarea prezintă modul în care poate fi testat comportamentul a două componente de tip PID (Proporțional-Integral-Derivative), implementate în Tia Portal, ce folosesc un automat de tip Siemens S7-1200 și un simulator software implementat într-un limbaj JAVA sub forma unei aplicații Android. De asemenea simularea în Unity are același rol însă într-un mod mai atractiv.

În continuare vor fi prezentate noțiuni teoretice ce țin de tema proiectului, o prezentare generală, o descriere a componentelor Hardware și a modului în care echipamentele sunt conectate între ele dar și o descriere a părții Software în care vor fi detaliate aplicațiile ce țin de acest proiect și 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ă în Android . Aplicația Android conține două motoare electrice(reprezentate de două componente Gear) ce vor pune în mișcare două 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 sau al celorlaltor dispozitive, o descriere generală a componentelor și a modului de configurare a PLC-ului SIMATIC S7-1200 + TIA Portal V13.

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

Î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 reprezintă unul din obiectivele lucrării de licență. Vom prezenta două exemple reproduse în cadrul laboratorului SIEMENS ,UTM . 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 închis sau o buclă de reacție) și care se manifestă față de mărimile externe în funcție de mărimea erorii generate în mod automat, pentru a putea anula această eroare. În urma acestei reacții, este posibilă și 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) și sunt preluate de regulatorul automatizat în conformitate cu o anumită 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 a regulatorului

Elementul de reacție secundară(ERS-ul) primește la începutul procesului , rezultatul calculat în urma amplificării și reprezintă un semnal xrs numit mărime de reacție secundară. Acesta determină o dependență proporțională între mărimea reacției secundare și mărimea de comandă.

Elementul de comparare secundară(ECS) are rolul de a compara în mod continu valorile abaterii ɛ și 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ă și 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 în 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ă, atunci 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).

În 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 întreaga variație a erorilor iar constanta Ti se numește constantă de integrare .

În 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.

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

Regulatoarele cu acțiune integrată sunt rar utilizate datorită întarzierilor produse. Acestea sunt folosite atunci când se dorește o eroare staționara nulă , neexistând alte elemente ale sistemului de reglare automată ce permite 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 de treaptă a intrării.

Răspunsul de treaptă a ieșirii regulatotului de tip PI

Regulatoarele PI permit obținerea de caracteristici superioare în realizarea legilor de reglare , datorită posibilității de combinare a celor două acțiuni, proporțională și 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’ și derivata în timp a mărimii de variație a erorii ɛ. Aceasta poate fi exprimată folosind urmatoarea relație :

x(t)

TD – reprezintă constanta de timp a funcției de derivare a regulatorului

Unde:

Variația de treaptă a intrării.

Răspunsul de treaptă al ieșirilor regulatorului PD.

Este de preferat o dependență determinată de regulatoarele PD în a doua relație, deoarece , asemanator cu regulatoarele PI din punct de vedere constructiv, dacă modificarea factorului KR este permisă atunci și moficarea constantelor de timp derivativă.

După analiza raspunsului la intrarea de treaptă a unui regulator PD putem observa că acțiunea componentei derivative se manifestă numai în momentul inițierii, și are loc o creștere a mărimii de 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ă performanțe de reglare superioare celorlaltor tipuri. Ele cuprind următoarele efecte: proporțional P, integral I și dereivativ D, conform legii de reglare:

x(t)

Unde:

Variația de treaptă a intrării.

Răspunsul de treaptă al iesirii regulatorului PID.

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

Pentru a arăta influența tipului de regulator asupra SRA(Sistem de reglare automată) , avem urmatoarea figură, unde sunt afișate răspunsurile în timp , a mărimii de ieșire într-un SRM (Storage resurce manager), xc(t) pentru o variație de treaptă a mărimii de intrări xb pentru regulatoarele P, PI, PD și PID.

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

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

în urma introducerii componentei I, regulatorul PI anulează eroarea de 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 mică 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

În 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 în timp. Acestea pot fi și ele:

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

comandă 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 în timp .

În funcție de sursa de energie exterioară folosită, se pot clasifica în:

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.

În functie de viteza de răspuns :

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

parametrilor proceselor cu răspuns rapid și conțin constante cu timpi mai mici de( 10 s).

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

mai mari de( 10 s) și sunt întâlnite la procesele cu urmatorii parametri: temperatură, debit, presiune etc.

În 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.

În functie de agentul purtător de semnal :

Regulatoare automate pneumatice – folosesc aer comprimat.

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

electrică și care conțin blocuri electronice.

Regulatoare automate hidraulice – folosesc ulei sub presiune.

Regulatoare mixte – pot fi electropneumatice sau electrohidraulice.

În 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țin o structură constructivă și semnale de lucru special concepute.

Procesele industriale conțin multe intrări ce generează efecte asupra ieșirilor. Pentru a explica 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 . Dacă este dorită o viteza mai mare se poate acționa viteza 2 a motorului.Aceasta poate fi activată acționând din nou I1 și este comandată prin Q2 având o întârziere de 2 secunde. Daca I1 este acționată din nou , viteza scade. De fiecare dată când I1 este acționată , viteza obținută va fi viteza 1 ori viteza 2, în ambele cazuri dupa un timp de 2 secunde . Un indicator luminos conectat la Q2 se aprinde dacă motorul este poziționat iar viteza este mai mare. Pentru a opri procesul,pedala trebuie să fie apăsată și astfel 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 mai eficientă.

În continuare voi prezenta modul de funcționare a doua componente PID legate între ele printr-un proces numit ”cascada”. Se poate observa că , ieșirea 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 răspuns , facilitând ieșirea dispozitivului folosit. Un mod standard de folosire a unei unei funcții PID în cascadă este prin intermediul a două intrări de sistem, ce pot oferi de exemplu, informații legate de poziția și viteza unui obiect. În continuare un codificator de pozitie este comparat cu valoarea de referință dorită, apoi, ieșirea rezultată devine punctul de referință pentru controlul vitezei.

În actualul proiect de licență am realizat doua PID-uri pentru controlul a două motoare electrice, acestea pun în mișcare două elice printr-o forță de frecare. În funcție de viteza de rotire a elicelor vom trimite un feedback înapoi pentru ca PID-urile să compenseze și să anuleze perturbațiile.

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

Sistemul de automatizare ce conține:

Controlerul programabil PLC Siemens S7-1200.

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

Softul scris în mediul Tia Portal , programat cu ajutorul unui PLC.

Microcontrolerul conține urmatoarele componnente:

Placa de bază cu Microcontrolerul PIC18F4450.

Softul de control al Microcontrolerului scris in MPLABX.

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 intrărilor și ieșirilor digitale, respectiv analogice.

Simularea elicelor motoarelor electrice ce folosesc o fortă de frecare.

Sistemul de automatizare are în componentă PLC-ul Siemens SIMATIC S7-1200 și folosește

aplicația Tia Portal V13 pentru a implementa două PID-uri . Acestea va simula motoarele unei drone iar tensiunea de ieșire de la un conector va fi controlată de pe PLC prin intermediul a două componente Setpoint și a două Feedback-uri.

În momentul în care sistemul de automatizare este pornit și dorim să simulăm cele două motoare ,

PID-urile vor fi setate ca două Setpoint-uri cu o anumită valoare. Acest lucru este realizat prin rotirea potentiometrelor de pe pozitia AI1 si AI3 ..

În cele două blocuri DIV implementate , cu ajutorul PLC-ului se va face conversia dintre

valorile de la 0 la 3000 , la o valoare cuprinsa între 0 si 100. Acesta este transmisă mai departe la blocurile PID , care vor afișa 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ția , apoi o convertește pentru a putea fi interpretată de către aplicația Android, respectiv de catre PLC dacă procesul este invers.

Microcontrolerul va primi tensiunea transmisă de către sistemul PLC și o va transforma în

informație , pe care o va trimite mai departe prin USB către aplicația Android. Ea poate fi citită de pe un dispozitiv smartphone/tableta sau de pe un dispozitiv virtual.

Simularea software preia datele primite și aplică un impuls asupra unei componente „Gear” a

unui motor care va începe sa se învartă , si va pune în mișcare o elice prin intermediul unei forțe de frecare. Pentru a pune în mișcare elicea s-a luat în considerare ca componenta ”gear” șă aibă o greutate stabilită.

Tensiunea masurată la bornele unui generator electric este reprezentată de viteza de rotație a

elicei. Valoarea obținută 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 pentru a se menține tensiuna 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 va fi transformată într-o valoare, care va fi stocată în memoria PLC-ului. Această valoare va fi transformată de către PLC dintr-un numar cuprins între 0 și 30000 într-o mărime cu valoarea între 0 și 100, printr-o operație de dividere a numarului la 300, iar rezultatul va fi cuprins între 0 si 100 (reprezentând valoarea procentuală).

În urma acestui proces se va obține câte o componentă „Setpoint” pentru fiecare bloc PID

implementat în softul Tia Portal , componente ce vor ridica tensiunea pe conectorii de tip Output conenctati la Microcontroler. Microcontrolarul va prelua această tensiune și va trimite o valoare către Tabletă prin intermediul unei conexiuni de tip USB.

Acesta valoare va fi interpretată de către aplicația de Android și astfel se va pune în miscare o

componentă Gear a motorului care la rândul ei va pune în miscare o elice printr-un transfer de miscare , folosind o fortă de frecare.

În momentul în care elicea se învarte , aplicația de Android va interpreta acest lucru și va

afișa o valoare a vitezei cu care se va învarti elicea, valoare transmisă mai departe către Microcontroler.

Aceasta valoare va ajunge în Microcontroler , astfel transformând-o în tensiune și trimitând-o către PLC. Tensiunea este citită de PLC și va efectua un calcul pentru a determina cu cât trebuie să suplimenteze, cu tensiune pentru ca în Output să rămâne viteza motorului constantă.

Pentru a menține și controla viteza de rotație a elicei folosim potentiometrul Analog I1(proiectul constă din simularea a doua motoare, astfel vom avea si Analog I2). În aplicatia de pe Tableta se pot selecta valorile de referintă precum: valoarea frânei inițiale, frâna maximă,ordin frână,putere maximă exercitată, ordin putere si viteya maximă motor dupa .

4. Descrierea componentelor Hardware

4.1.Sistemul de automatizare SIMATIC S7-1200

4.1.1 Noțiuni generale

Controlerele Programabile Logice(PLC) sunt automate de comandă și reglare programabile ce folosesc mașini și procese de tip industrial (de exemplu: un sistem de semaforizare , un dispozitiv pentru tăiat sticla etc ). Pentru a obține un astfel de proces este necesară o aplicație software, un dispozitiv PLC și un dispozitiv programabil.

+

SOFT-pentru controulul unui motor PLC

+

Dispozitiv – motor electric

Procesul de automatizare se bazează pe tehnică și are ca scop lucrarea automată a mașinilor și a instalaților pentru a înlocui sau ușura efortul depus de forța de muncă umană. Cu cât este necesară o funcție mai complexă pentru un automat, cu atât este mai ridicat gradul de automatizare. Pentru instalațile automatizate forța de muncă umană are rolul de a supraveghea buna funcționare a aparatului și de a aproviziona cu materiale și de intreținere a dispozitivului etc. Noile microprocesoare accelereaza procesele de automatizare . Acest proces are ca efect ridicarea calitații produselor și a productivitații acestora, cu o reducere a efeortului forței de muncă umană , a costurilor dar și a eventualelor accidente umane ce pot avea loc .

Sistemul de automatizare SIMATIC S7-1200 este un controler foarte flexibil,scalabil și cuprinde o gama larga de module care pot fi adaptate la necesitățile sistemului de automatizare. Controlerul S7 cuprinde un CPU (unitate centrala de procesare) ce folosește intrări și ieșiri pentru semnale analogice și digitale.

Pot fi instalate mai multe module de intrare și ieșire în cazul în care nu sunt suficiente cele integrate în CPU și deasemenea se mai pot adăuga procesoare de comunicare RS232 sau RS485.Este necesară pentru CPU și o interfată de tip TCP/IP.

RS232 și 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 și utilizare.

Un sistem de automatizare SIMATIC S7-1200 este un sistem modular care poate sa conțină urmatoarele module:

Modulul CPU cu o Interfața PROFINET și mai multe intrări/ieșiri.

CPU215

Sursa de alimentare PM(power supply module) cu intrări de 120-230V.

PM1207

Un modul de extensie a semnalului (SM) pentru intrări și ieșiri digitale / analogice suplimentare.

Pot fi adăugate maxim două astfel de module.

SM 1232

CM (comunication module) conectează sistemul de automatizare SIEMENS cu sisteme de

nivel înalt.

CM 1243

Acest proiect a fost realizat folosind tehnologii de automatizre puse la dispozitie de către

Facultatea Titu Maiorescu din Bucuresti in cadrul laboratorului SIEMENS.

Panoul PLC S7-1200 ce conține: CPU215,un PM1207,un CM124 si două SM 1232

Panoul de comanda conține mai multe porturi de intrare/ieșire conectate prin cabluri la panou.

Aplicația necesită ca Microcontrolerul să fie conectat la panou, prin intermediul unor cabluri, astfel vor fi trimise semnale electrice la Microcontroler ce vor fi transformate în semnale digitale și trimise către tabletă prin intermediul unei conexiuni USB. De asemenea din Tabletă vor fi trimise semnale digitale la Microcontroler, apoi sunt convertite în semnale electrice și trimise mai departe la PLC pentru a fi prelucrate.

Panoul PLC conține pini de tip „Analog Inputs” ce pot fi activați prin întrerupatoare de tip

EXT , astfel potentiometrul dorit este activat. Acesta controlează viteza de referință a motorului de care va ține cont.

4.1.3. Unitatea centrala(CPU).

Modulul CPU S7-1200 poate funcționa individual fără alte componente suplimentare , el

detinând toate mijloacele necesare: o tensiune de alimentare integrată și intrări/ieșiri integrate. Acesta conține și un port TCP/IP pentru a putea comunica cu dispozitivele de pe care este implementată aplicația. Acesta poate comunica cu dispozitive de tip HMI (human machine interface), sisteme PC sau alte module CPU.

Se poate face o conexiune TCP/IP . Este locul unde sunt stocate datele . De asemenea se pot

face urmatoarele operații: transfer de date între mai multe module CPU și se poate face o actualizare de firmware a modulelor CPU, al modulelor de semnale SM și al modulelor de comunicare CM.

Led-urile arată intrări/ieșiri conectate și regimurile de operare a modulului CPU.

Sunt blocuri terminale din care se face conexiunea cu procesul, folosind cabluri.

Conexiunea de 24V folosită pentru alimentare.

4.2. Microcontrolerul PIC18F4550

Toate dispozitivele de testare precum: placa de bază cu microcontrolerul PIC18F4550, placa de

testare si placa de conectare la PLC au fost puse la dispoziție de profesorul coordonator din cadrul laboratorului SIEMENS al Universitatii Titu Maaiorescu din București.

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

apărute . Microcontrolerul conține 40 de pini, dintre care 5 de input/output(PORTA, PORTB, PORTC, PORTD si PORTE). PORTB si PORTD dețin pini pentru primirea/ transmiterea de biți de informație I/O. Restul porturilor au un numar diferit de pini pentru comunicarea informației de intrare/ieșire. Acesta conține un convertor A/D pe 10 biți cu 13 canale, doua comparatoare, 4 componente de monitorizare, unul pe 8 biți și 3 pe 16 biți.

Cipul PIC18F4550 are rolul de a citi tensiunea intrată în micrcontroler și de a genera o nouă

tensiune în momentul ieșirii.

În componența acestui proiect modulul conține:

2 porturi analogice ( PWM ) de ieșire, prin care se poaet trimite o tensiune între 0 și 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 ieșire.

Softul Eagle PCB 8.1 a fost folosit pentru a realiza schemele care arată configurarea pinilor

microcontrolerului.

Microcontrolerul a fost programat folosind o aplicație in limbaj C++ implementată în

programul MPLAB-X , cu o versiune gratuită.

4.2.1 Placa de bază a Microcontrolerului PIC1F4550

Placa de bază este destul de simplă. Aceasta conține un led care se aprinde în momentul în care exista o conexiune de tip USB, un buton de reset prin care microcontrolerul poate fi adus la starea sa inițială , un rezonator( un dispozitiv capabil sa amplifice oscilațiile mecanice, electrice etc) de 20 MHz care permite funcționarea procesorului din microcontroler la o frecvență de 20 MHz, o panglica pentru conectarea la celelalte placute.

4.2.2 Placa de testare

Aceasta placa este folosită pentru a verifica buna funcționare a sistemului și a porturilor de intrare / ieșire.

Placa conține urmatoarele porturi de intrare/ieșire:

2 leduri care își schimbă intensitatea cu care luminează, în funcție de tensiunea primită de la cele

doua porturi analogice de ieșire .Se merge pe principiul Power With Modulation (PWM).

5 potențiometre prin care trece tensiune către cele 5 porturi de intrare ale Microcontrolerului.

8 butoane conectate la intrări digitale ale Microcontrolerului.

8 leduri conectate la ieșirile digitale ale Microcontrolerului.

În schema electronica alăturată se pot vedea cele

opt butoane și modul în care vor acționa cele opt intrări digitale ale Microcontrolerului .

Ieșirile Microcontrolului sunt reprezentate de ledurile

din partea de sus, cele din dreapta sunt digitale iar cele

două din stanga sunt analogice.

Aceasta placă este folosită pentru a testa aplicația

Android și pentru a vedea modul de funcționare a acesteia.

4.2.3 Placa de conectare la sistemul de automatizare PLC

Aceasta placă este folosită pentru a realiza

conexiunile necesare între automatul SIMATIC

S7-1200 și placa de baza a Microcontrolerului.

Pentru a evita o tensiune mare în cadrul

ieșirilor a fost realizată cu ajutotul unui regulator de

tensiune L78S05CV care accepta +32V dar nu

scoate o tensiune mai mare de +5V.

Pe placă este montat un conector, la care se pot atașa cabluri pentru fiecare pin al Micro- controlerului. Un regulator este adăugat pentru a proteja tot sistemul de automatizare PLC,Microcontroler și dspozitivele pe care rulăm aplicațile o posibilă deteriorare în urma unei tensiuni mai mare decât limita permisă.

5.Descrierea aplicațiilor Software

5.1Software pentru programarea Microcontrolerului PIC18F4550

5.1.1 Schema bloc funcțională

Schema logică de implementare a aplcației este următoarea:

Funcția Main() are rolul de a inițializa sistemul, astfel sunt inițializați pinii folosiți și convertiți în fișiere de tip header. Au urmatoarele componente :

InitializeSystem() inițializează sistemul ;

USBDeviceInit() inițializează setările portului USB;

USBDeviceAttach() inițializează procedurile de conectare la portul USB, în modul host sau modul client.

Funcția Main() mai are rolul de a atașa , deconecta portul USB și de a apela metoda DeviceTask().

Metoda DeviceTask() citește și scrie în microcontroler valorile dorite.

Funcția Main() este componentă principală a programului și 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 poziția dinaintea while . */

if( USBGetDeviceState() < CONFIGURED_STATE ){

/* Se sare inapoi la while. */

continue;

}

/* Daca procesul este suspendat, trebuie să vedem dacă trebuie să

* initiem manual procesul. În ambele cazuri, nu ar trebui să apăsăm nici o tastă.

* Deoarece nu are loc comunicare cu hostul ne vom întoarce inapoi la while. */

if( USBIsDeviceSuspended() == true ){

/* Se sare înapoi la while . */

continue;

}

DeviceTasks();

}//end while

}//end main

Metoda InitializeSystem() are rolul de a apela componentele software de pe Microcontroler în funcție de starea conexiunii la USB.

void InitializeSystem( SYSTEM_STATE state ){

switch(state){

case SYSTEM_STATE_USB_START:

InitializeStatusLED();

InitializeDataINPins();

InitializeDataOUTPins();

InitializeAnalogINPins();

InitializeAnalogOUTPins();

break;

}

}

Pentru inițializarea 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 conectării prin USB a modulului de simulare, se va executa codul din bucla principală 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 definită de comanda COMMAND_DIN și va citi starea

pinului digital (butonul) atunci când comanda este primită de modul. Valoarea va fi trimisă către Tabletă.

Citirea pinilor de ieșire digitală, este definită de comanda COMMAND_DOUT și va scrie starea

primită către pinul digital cu o valoarea între 0- 5V în funcție de valoarea primită ,când comanda este primită de modul.

Citirea pinilor de intrare analog, este definită de comanda COMMAND_AIN și valoarea aleasă

pentru a reprezenta pinul analog este valoarea bitului urmator. Microcontrolerul va trimite 2 biți la Tabletă în funcție de valoarea pinului.

Scrierea pinilor de ieșire analog, este definită de comanda COMMAND_AOUT și atunci când

este inițiata comanda , Microcontrolerul va interpreta următorii 3 biți primiți pe Tabletă .Primul pin este cel scris iar ceilalți doi vor fi timiși ca o tensiune către PLC.

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

În continuare se poate vedea în codul sursa modul de luare a aceastei decizii:

void DeviceTasks(){

//Verificam dacă avem date de ieșire de la host

if(HIDRxHandleBusy(USBOutHandle) == false){

//Am obținut un pachet de date de la hostul USB.

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

//sa rulăm.

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 asigură ca endpoint/buffer să fie liber pentru a se putea modifica conținutul.

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 informații la host. USBInHandle = HIDTxPacket(CUSTOM_DEVICE_HID_EP, (uint8_t*)&ToSendDataBuffer[0],64);

}

break;

case COMMAND_AIN:

//Se asigură 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 informații 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 sursă ce țin de programarea Microcontrolerului

Aplicația pentru configurarea și pentru scrierea codului sursă a Microcontrolerului a fost scrisă în limbaj C++ folosind softul MPLAB X. Pentru această aplicație a fost creat un nou proiect cu denumirea Simulator și cu urmatoarele componente:

Fisiere de tip Header(cu extensia .h) adăugate într-un folder logic cu denumirea aplicație pentru

configurarea Microcontrolerului.

Fisiere de tip Header(cu extensia .h) adăugate într-un folder logic cu denumirea USB pentru

configurarea librăriei de comunicare USB .

Fisiere de tip Sursa(cu extensia .c) adăugate într-un folder logic cu denumirea aplicație ce conține

coduri sursă pentru Microcontroler.

Fisiere de tip Sursa(cu extensia .c) adăugate într-un folder logic cu denumirea USB ce conțin

fișiere sursa ale librăriilor de comunicare USB.

Fisierele de tip Header sunt urmatoarele:

status.h – are loc configurarea ledurilor de pe placa principală.

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

analog_out.h – are loc configurarea pinilor de ieșire PWM.

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

digital.out.h – are loc configurarea pinilor de ieșire digitală.

Fisierele de tip Sursa sunt urmatoarele:

device.c – conține codul sursă în care are loc procesul de conversie dintre stările hardware și

stările software.

status.c – conține codul de control al ledului plăcii principale, care se aprinde atunci când are loc o

conexiune USB.

main.c –inițiază și controlează conexiunea de tip USB .

anlog_in.c – inițiază și definește starea pinilor de intrare analog.

analog_out.c – inițiaza si definește starea pinilor de ieșire analog.

digital_in.c – inițiaza si definește starea pinilor de intrare digitali.

digital_out.c – inițiaza si definește starea pinilor de ieșire digitali.

system.c – sunt definite metodele de inițializare a sistemului.

usb_descriptors.c – conține metode de inițializare și setare a conexiunii la USB.

5.2 Sistemul de automatizare SIMATIC S7-1200 :

Sistemul de automatizare SIMATIC S7-1200 este un sistem minicontroler modular din gama de performanțe scazute. În familia S7-1200 se regăsesc mai multe module care au ca rol adaptarea la necesitățile de automatizare.

Automatul S7 constă dintr-o unitate centrala de procesare (CPU) ce conține intrări si ieșiri pentru semnalele analogice și cele digitale. La acesta se mai poate instala alte module de intrare și ieșire suplimentare în cazul în care acestea nu sunt suficiente(RS232 sau RS485).

5.2.1 Softul Tia Portal V13.

Totally Integrated Automațion(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 permite utilizarea urmatoarelor funcții de automatizare:

de configurare a componentelor hardware.

de definire a comunicației între dispozitive.

de programare a dispozitivelor.

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

Pentru a conecta unitatea centrală de procesare la mediul Tia Portal este necesară o conexiune de tip TCP/IP dar și ca adresele celor două părți să corespundă .

O adresă IP(Ex: 192.168.1.4) este formată din patru numere zecimale cu valori cuprinse în intervalul 0-255, separate între ele printr-un punct. Asemanator este si cu masca de subretea(Ex:255.255.255.0).

Masca de subretea este folosită pentru a recunoaste dacă un post sau o adresă IP aparține subretelei locale său dacă poate fi accesată folosind un ruter.

Pentru a seta adresa IP a calculatorului sunt necesari urmatorii pași:

pentru Windows 7 intrăm în Control Panel Network and Internet Network and Sharing

Center Change adapter settings se selectează conexiunea dorită , se dă click dreapta și se intră în Properties.

Se alege Internet Protocol Ipv4 și se apasă butonul de Properties.

In tabul General se alege opțiunea USE the following Ip address după care se introduce adresa ,

,maska și DNS-urile.

Pentru a seta Adresa IP a sistemului de automatizare SIMATIC S7-1200 sunt necesari următorii pași:

Se deschide Programul TIA Portal.

Se accesează ”Project View”.

Accesam in panoul „Devices” „Online access” si vom observa placa de rețea instalată. Prin

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

Pentru a seta adresa automatului accesăm în meniul „Functions” unde se vor putea introduce și în

campurile ”IP address” , ”Subnet” adresa IP dorită dar și masca de subretea.Astfel se va obține o nouă adresă IP pentru automatul SIMATIC S7-1200 dacă urmărim exact pașii menționați(Functions Assign IP address( Ex: 192.168.1.2) Subnet (Exemplu : 255.255.224.0) Assign IP address) .

Pentru a reseta adresa în modul inițial se acceseaza meniul „Functions” si submeniul „Reset to

factory settings” unde vor exista două opțiuni: „KeepIP address” și „ResetIP address”, a doua este necesară pentru a avea loc resetarea, după care se va apăsa butonul ”Reset”.

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

5.2.2 Aplicația în TIA Portal V13 pentru controlul celor două PID-uri.

Sistemele de reglare pot funcționa pe baza principiului acțiunii după efect(sisteme cu acțiune inversă) sau pe baza principiului acțiunii după cauză(sisteme cu acțiune directă). Pentru acest proiect am ales două regulatoare cu acțiune după efect, câte unul pentru fiecare componentă PID. Un regulator primește două semnale la intrare: unul de masură, generat de traductorul mărimii reglate și unul de referintă (Setpoint) care afisează valoarea procentuală a mărimii reglate dorite.

Principiul reglării după efect presupune intervenția asupra procesului reglat, în funcție de informația obținută prin măsurarea mărimii de ieșire a mărimii reglate. Scopul este de a menține aceste mărimi la o valoare apropiată de valoarea referinței, în condițiile în care timpul referinței variază. La aceste tipuri de sisteme apariția erorii nu poate fi prevenită , ci doar se dorește o reducere a acesteia.

In figura urmatoare este prezentată schema practică a unui sistem monovariabil de reglare automată după efect(eroare).

Unde:

P este procesul de reglare a dispozitivului.

T este traductorul.

R este regulatorul.

E elementul de execuție care îndeplineste funcțiile de măsurare, de comandă și de execuție.

In funcție de natura semnalelor de intrare/ieșire ,regulatorul poate fi electronic,mecanic, hidraulic sau pneumatic, cele mai utilizate fiind, regulatoarele electronice numerice.

Pentru scrierea aplicației am ales mediul de lucru TIA Portal V13 acesta fiind legată la aplicatia de Android și va controla viteza cu care se rotesc cele doua motoare(componente Propeller) în simulatorul de pe Tableta.

Pentru a crea un mediu de lucru ce folosește sistemul de automatizare SIMATIC S7-1200 ,putem reproduce urmatorii pași:

Intrăm în programul TIA Portal V13

Setăm adresa IP a automatului, exact cum a fost prezentat in subcapitolul de mai sus.

Dăm click pe Create New Project pentru a crea un nou proiect.Selectăm o denumire și un

Director unde dorim să salvăm proiectul respectiv.

In continuare va trebui să configurăm un nou dispozitiv( în cazul nostru S7-1200). În meniul

„First steps” urmăm următorii pași: Configure a device Add new device selectam Controllers SIMATIC S7-1200 CPU Unspecified CPU 1200 6ES7 2XX-XXXXX-XXXX. Adițional se poate alege și versiunea.

Vom obține un dispozitiv PLC-1200 care trebuie configurat. În continuare putem să

procedam în două moduri: unul în care vom adăuga manual modulele pe care le vom folosi din catalogul din dreapta și altul mai usor în care putem lăsa programul să detecteze singur dispozitivul PLC și modulele conectate la acesta.

Dacă alegem ca dispozitivul să fie detectat va trebui să selectăm tipul interfeței PG/PC , tipul

de conexiune PLC și calculator. După ce facem click pe butonul ”Detect” putem observa în tabelul de mai sus o listă de conexiuni între dispozitive și va trebui să alegem conexiunea dorită după care va trebui apăsat butonul OK. Putem bifa „Flash LED” pentru a observa dacă este recunonscută aplicația de către PLC. În cazul în care este recunoscută se vor aprinde două leduri pe componenta CPU.

Am obtinut un dispozitiv configurat ce conține o componentă CPU si modulele SM1223

(modul de transmitere radio) și SM1234(modul pentru semnal ce conține intrări/ieșiri suplimentare).

Pentru a crea o aplicație ce simuleaza un control PID putem reproduce următorii pași:

Pentru a crea o aplicație de tip PID control trebuie mai întâi adăugată o componentă de tip bloc (

sau două în aplicația cu doua PID-uri). Acest lucru se face din meniu accesând Proiectul PLC-ul Folderul ”Program blocks” Add new block . Se selectează Cyclic interrupt din tabul Organization block după care se alege modul: manual sau automatic , limbajul LAD si un timp care semnifică durata unui ciclu. Un bloc de organizare de tip „Cyclic interrupt” permite utilizatorului să pornească programe la anumite intevale de timp .

După ce a fost creat blocul sau blocurile se selectează in meniul ”Technology ” o componentă

de tip ”PID Controller” sau mai multe in funcție de câte PID-uri avem nevoie și le adăugăm în rețeaua

”Network1” . De asemenea trebuie adăugat un bloc DIV sau mai multe în funcție de cate componente

PID avem, în meniul Basic instrucționsMath functions și le situăm într-o altă rețea”Network2”.

Blocurile PID vor fi configurate astfel :

Pentru a accesa tabela de scrierea a tagurilor apăsăm click dreapta pe blocul PID si alegem

„Rewrite tags”.Astfel putem introduce denumirile tagurilor( Input, Output , Setpoint) după care trebuie stabilit tipul lor(Global Memory, Global Input, Global Output),tipul de dată(Int, Word, Word), pinii de intrare pentru fiecare bloc( ”%IW112” respectiv ”%IW116”) și pinii de ieșire pentru fiecare bloc (”%QW112” respectiv ”%QW116”).

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

Pentru configurarea unui bloc DIV vom folosi aceeași metodă ca la Blocul PID.

„Setpoint POT” reprezintă potențiometrul și poate lua o valoare de la 0 la 30000 unde la

30000 avem +10V.

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

transforma cu ajutorul potentiometrului dintr-o valoare 0-30000 într-o valoare 0-100. Aceasta valoare este Setpointul și este trimisă către blocul PID , ea reprezentând viteza motorului.

Setările pentru fiecare bloc PID se fac din meniul Technology objects PID_Compact1 sau

PID_Compact2 Configuration . În subdomeniul basic trebuie setat tipul controlerului ca unul pentru control al vitezei(Speed). În sudomeniul Advanced settings putem stabili mai mulți parametrii precum: limita grafului, timpul de desfasurare etc.

După configurare, blocurile trebuie să arate astfel:

După configurarea acestor blocuri putem considera că aplicația SIMATIC S7-1200 este

finalizată. Pentru a rula această aplicație trebuie să intrăm în meniul Technology objects PID_Compact1 sau PID_Compact2 Commisioning. Urmatorul pas este să încărcam aplicația la automatul SIMATIC S7-1200 și să apăsăm butonul Start pentru a rula aplicația.

5.3 Aplicația Android

5.3.1 Noțiuni generale

Android este cel mai popular sistem de operare pentru dispozitive de tip smartphone sau pentru tablete, dovadă fiind faptul că în ultimii ani calitatea aplicațiilor sa dezvoltat tot mai mult.

Pentru acest proiect am ales o aplicație de tip Android ce testează sistemul format(PLC, Microcontroler si Android) și simulează două motoare electrice ale unei drone, cu componente precum: forte de frecare, vectori etc. Folosirea acestor componente a fost posibilă datorită librăriilor AndEngine și AndEnginePhysicsBox2D.

AndEngine este o librărie OpenGL(Open Graphycs Library) ce face mai usoară crearea de aplicații 2D pentru dispozitivele Android. Aceasta poate suporta extensii precum: AndEnginePhysicsBox2 Extension, AndEngineMultiplayerExtension etc.

Sunt posibile două simulări incluse în aplicația Android și o simulare creată în mediul Unity ce poate fi rulată din Windows sau prin intermediul unei alte aplicații de tip Android. Primele două simulări au rolul de a testa sistemul PLC-Microcontroler-Android și de a simula două motoare electrice ale unei drone în momentul în care asupra lor se acționează o frână.

Motorul de simulare AndEnginePhysicsBox2:

Motorul Box2D este o componentă a librăriei AndEngine ce face posibilă efectuarea de operațiuni cu origini legte de fizică. Box2D a fost scris inițial de Erin Catto în limbaj C++, ea fiind adaptată ulterior pentru mai multe limbaje de programare precum Java.

Mediul pus la dispoziție de librăria Box2D ne permite să construim obiecte care se comportă asemănător ca în relitate . Acest mediu virtual este format din corpuri, puncte fixe, articulații și constrângeri ce formează o simulare fizică a acestei lumi.

Corpurile sunt componentele de bază a simulării Box2D. Ele pot lua atribute fizice mai complexe dacă sunt asociate cu forme, constrângeri sau puncte fixe. Aceste corpuri sunt toate rigide, iar formele lor nu devin distorsionate.

Corpurile pot fi:

Dinamice: acestea sunt simulate integral într-un mediu virtual și nu au întoadeauna o masă

finită,ele putând să interacționeze cu alte corpuri statice sau cinematice.

Statice: acestea sunt fixate în loc iar în momentul simulării acționează ca și cum ar avea masa

infinită , putând să interacționeze și cu alte corpuri dinamice.

Cinematice: acestea nu reacționeaza la alte forte și nu fac parte din simularea fizică, comportându-

se ca și cum ar avea o masă infinită.Ele pot să interacționeze cu corpurile dinamice.

Pentru dezvoltarea de jocuri, Box2D adaugă claselor existente în AndEngine 16 noi clase ce fac posibilă simularea elementelor de natură fizică. Pentru crearea unui joc , sunt necesare trei clase de bază: PhysicsWorld (reprezintă lumea Box2D), PhysicsConnector ( conectează entitățile din librăria AndEngine cu corpurile Box2D) și PhysicsFactory (generează corpuri și puncte fixe).

Crearea unei lumi PhysicsWorld se poate face folosind o clasă cu aceeasi denumire la care se adaugă o scenă AndEngine cu doi constructori. Aceasta arată 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 și poate arăta 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 clasă cu denumirea PhysicsFactory și poate arăta 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 posibilă reducerea decalajului dintre entitațile librariei AndEngine și componentele extensiei AndEnginePhysicsBox2.

5.3.2. Programul principal Android

Aplicația Android a fost concepută pentru a simula buna funcționalitate a sistemului PLC-Microcontrolăr-Android dar și pentru a simula două motoare electrice a unei drone ce primește informații de la PLC prin intermediul unui Microcontroler PIC18F4550.

Pentru scrierea aplicației am folosit un limbaj de programare Java implementat în aplicația Eclipse IDE( soft ce conține modulul de implementare al aplicațiilor Android).

Schema bloc a aplicatiei Android:

În această schemă se pot observa obiectele principale ale aplicației scrisă în limbaj Java care poate fi rulată de pe un dispozitiv Smartphone sau Tabletă .

Modul de funcționare al aplicației este următorul: atunci când este conectat Microcontrolerul la un port USB se inițiaza o conexiune iar aplicația este pornită. În interiorul aplicației pot avea loc două tipuri de simulări: una folosind plăcuta de testare pentru verificarea funcționalității sistemului și alta pentru a simula două motoare ale unei drone, folosind parametrii primiți de la PLC prin intermediul Microcontrolerului.

Metoda apelată la inițierea aplicației Android este urmatoarea:

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

MainActivity.thisObject = this;

this.showNoDeviceView();

}

În cazul în care nu este conectat niciun dispozitiv aplicația va afișa un mesaj și va fi inițiată urmatoarea metodă:

public void showNoDeviceView() {

setContentView(R.layout.activity_main);

SetupObject = null;

}

Pentru a verifica conexiunea oricărui dispozitiv la portul USB, există un ”listener” iar atunci când este conectat Microcontrolerul va fi posibilă efectuarea primei simulări în meniul Debug(placuța de testare).

Inițierea acestui ”listner ” se face folosind următoarea metodă:

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);

În cazul în care există o conexiune la Microcontroler este apelată o metodă showMainView() și va fi inițiat dispozitivul Device .Acesta va primi informația legată de starea pinilor de intrare/ieșire.

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 recunoașterea Microcontrolerului sunt necesare VendorID: 04D8 si ProductID: 003F.Pentru verificarea porturilor se poate folosi programul USBDeview.

După ce este conectat Microcontrolerul putem efectua o simulare pentru testarea pinilor de intrare/ ieșire. 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 între dispozitive se face prin setarea pinilor de ieșire analog AOUT cu valori din aplicație. Aceste valori sunt transmise prin Microcontroler de la aplicația Android la 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));

}

}

În momentul în care de la PLC prin intermediul Microcontrolerului aplicația Android primește date, este folosită urmatoarea metodă 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 stările pinilor de intrare/ieșire folosim placa de testare formată din butoane și potențiometre .

Prin apăsarea butoanelor cu valoarea inițiala OFF , în interiorul aplicației Android se poate observa pe placa de testare aprinderea unor leduri.

Metoda prin care informațiile sunt stocate în obiectul Device() cu valorile lor actualizate este updateAIN () și arată astfel:

protected void updateAIN(int index, int value) {

SeekBar AIN = getAIN(index);

AIN.setProgress(value);

}

Pentru a trimite valoarea dorită la Microcontroler și pentru a seta intensitatea cu care două leduri luminează se va apela urmatoarea metodă:

protected void sendAOUT(int index, int value){

MainActivity.deviceObject.Send_AOUT(index, value);

}

5.3.4. Simularea motoarelor dronei.

Aplicația Android pune la dispoziție o simulare a doua motoare electrice ale unei drone prin accesarea meniului Motor. În acest meniu pot fi setați parametrii de intrare a simulării , iar prin accesarea butonului Simulare se porneste simularea celor două motoare.

După pornirea simulării valorile nu mai pot fi modificate, numai dacă este repornită aplicația. Acest lucru se poate observa în următoarea secvență 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 obiectului Device() sunt citite si setate de către 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 conține mai multe elemente precum: două elice și două componente de tip ” Gear ” care sunt puse în mișcare cu ajutorul celor două motoare ale dronei. Elicele întâmpină mai multe acțiuni de natură fizică precum: masă si fortă de frecare. Vor fi puse în mișcare de către tensiunea furnizată de automatul SIEMENS S7-1200.

Elicele conțin două componente de tip ”Gear”conectate care ating celelalte componentele ”Gear ” puse în mișcare de către cele două motoare și astfel se obține un transfer de mișcare. Informația afișată reprezintă informația referitoare la mișcarea celor două elice. Aceasta este calculată cu ajutorul librariei AndEnginePhysicsBox2 ce efectuează operațiuni ce țin de fizică.

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

// Propeller

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

@Override

public InputStream open() throws IOException {

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

}

})

);

Se poate folosi același cod pentru a construi și alte obiecte , insă trebuiesc modificate numele și extensia fisierului png sau jpg .

Putem seta puterea Microcontrolarului cu ajutorul celor cinci potențiometre. Astfel cu ajutorul unei surubelnițe putem mări sau micșora puterea primită în mod manual, prin rotirea celor cinci suruburi de pe potențiometre. Dacă am făcut acest lucru putem observa în aplicația Android valoarea nouă Analog IN a fiecărui potentiometru .

Dacă avem toate potențiometrele în poziția 0 elicele nu se vor roti.

Dacă potențiometrele au valori mai mari decât zero ,cele două motoare sunt puse în mișcare iar elicele se învart cu o viteză constantă. Putem observa poziția celor trei cercuri care difera fată de starea lor inițială.

După crearea sprite-urilor(obiectelor) pentru texturile obiectelor propiu zise, acestea trebuiesc inițiate pentru a îndeplini diverse operațiuni.

Metoda de inițializare a motorului și a unei componente 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 inițializare 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 inițiate folosind urmatoarea metodă :

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");

}

Secvența de cod care se ocupă de mișcare unei elice este următoarea:

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 Microcontrolerului viteza cu care se va invârti elicea vom folosi urmatoarea secventă 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 în Unity

5.4.1. Noțiuni generale:

Unity este o platforma folosită pentru crearea jocurilor video cu un IDE integrat, fondat în anul 2005 de către firma Unity Technologies.

Aceasta folosește un limbaj C++ , iar IDE-ul folosește un limbaj C#.

Jocurile create pot rula pe diverse platforme: Windows, console, Android, IOS și Web.

Versiunea folosită pentru crearea aplicației este una Free: Unity 3D V5.3.5f1 cu obiecte (assets-uri) puse la dispoziție de această aplicație. Componentele de tip assets pot fi achiziționate de pe Assets Store direct din aplicația Unity editor dar și de pe site-ul: https://assetstore.unity3d.com/ (Exemplu de joc creat în Unity este ”Temple Run”).

5.4.2. Fisierele sursă, componente și rolul lor:

Aplicația conține urmatoarele fișiere sursă:

DroneBase.cs – conține scriptul pentru configurarea obiectului de suport al dronei.

DroneController.cs- contine scriptul de configurare a motoarelor dronei

Propeller.cs – conține scriptul de preluare a datelor de catre cele patru elice.

HoverFollowCam.cs – conține scriptul pentru configurarea ecranului și al unghiului din care este vazută drona în momentul rulării aplicației

Reset.cs – conține scriptul pentru butonul de reset.

WaterFlowFREEDemo.cs – un script pus la dispoziție de Unity pentru simularea apei.

Componentele aplicației:

Componente Dronă

Două componente 3D de tip ”Cube” redimensionate pentru a arăta în fomă de X .

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

Patru componente de tip ”Cube” redimensionare și cu denumirea ”Propeller” ce reprezintă elicele dronei.

Componente Canvas(ecranul principal )

Un panou ”ThrottlePanel ” pentru afișarea puterii primite de cele patru motoare ale dronei.

O componentă ”TextPanel ” pentru a denumi cele patru motoare.

Patru componente ”Slider” care au rolul de a afișa puterea primită de fiecare motor individual.

Mai multe componente de tip ”Terain”pentru a simula pamântul.

Mai multe componente de tip ”Tree” pentru ambient.

O componenta de tip ”Water” pentru simularea apei.

5.4.3. Configurarea dronei.

Aplicația a fost creată cu ajutorul softului Unity V5.3.5f și poate fi rulată din Windows , intr-un fisier executabil sau de pe un dispozitiv Android.

Dacă dorim aplicația poate fi importată în programul Unity astfel: deschideți Unity Open selectați folderul în care este aplicația și apăsați butonul Select.

După ce s-a încărcat aplicația se va observa cum în meniul Project vor fi încarcate Obiectele (assetsurile).

Pasul următor este să accesați File OpenSene selectați in folderul proiectului, folderul Assets unde poate fi găsit fișierul TestScene.

Drona a fost creată prin redimensionarea a două cubluri 3D pentru a forma o bază. La aceasta s-au mai adăugat patru componente cilindrice pe post de suport al elicelor și patru elice care reprezinte patru motoare ale dronei. Drona a fost programată folosind un fisier scris în C# cu denumirea ”DroneController.cs” care acționează elicele în funcție de anumite comenzi, iar elicele folosesc un fișier scris în C# cu denumirea ”Propeller.cs” să se invârtă după un anumit tipar.

Model simplu dronă cu patru motoare

Putem observa în secvența de cod DroneController.cs obiectele declarate , incluse în 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 creșterea puterii fiecărui motor în mod individual și în același timp prin scăderea puterii motorului diametral opus lui(Exemplu: Dacă crestem puterea motorului din fată, scade motorul din spate). Pentru a arăta acest proces avem urmatoarea secvența 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);

}

Secvența de mai sus permite și gruparea mai multor motoare prin schimbarea valorii 0f sau -1f cu 1f.

Metoda care returnează valoarea calculată a puterii unui motor 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 să se invârtă în sensul invers al acelor ceasornicului după cum putem observa în 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);

}

}

. Modul de funcționare al aplicațiilor

6.1 Sistemul de simulare PLC-Microcontroler-Android

6.1.1 Testarea aplicației folosind placa de testare și controlul de pe tabletă al acesteia

Simularea folosind plăcuța de testare.

Pentru a conecta placa principală cu Microcontrolerul PIC18F4550 la placa de testare se

folosește o componentă de tip panglică. După ce am făcut acest lucru trebuie conectată Tableta la Microcontroler.Se folosește un cablu USB și un HUB pentru a face legătura la tableta în cazul în care nu există un port USB in tabletă.

Dacă conexiunea există, atunci aplicația intră în programul principal și vom putea folosi meniul ”Placută de testare” pentru a efectua diferite operațiuni de testare. Prin folosirea unei surubelnițe asupra potențiometrelor putem schimba valorile transmise in mod manual și vom observa cum în dreptul Intrare Analog se vor schimba valorile primite de aplicația Android. Butoanele din dreptul Info iesire vor aprinde fiecare câte un led pe placa de testare iar două dintre leduri vor fi aprinse folosind cursorul din dreptul Analog OUT.

Simularea celor două motoare ale dronei.

O altă simulare pe care o putem efectua este pentru două motoare electrice, a unei drone. Aceasta se face accesând meniul ”Motor drona” si prin apasasarea butonului ”Simulare”. În momentul în care am ales valorile initiale și am apasat butonul ”Simulare” vom observa două obiecte de tip ”elice” care se invârt în funcție de valoarea primită din potentiometru.

Simularea motoarelor electrice ce folosesc automate SIEMENS

Pentru această simulare vom folosi un sistem format din aplicația Android, Microcontroler și sistemul de automatizare PLC. Scopul este de a simula două motoare ale unei prin două 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 două componente de tip ” PID_Control” care au ca scop simularea vitezei a două motoare electrice.

Aplicația de tip Android exercită o frână asupra celor două componente de tip PID din mediul Tia Portal pentru a scădea viteza ,lucru care se poate oserva pe un grafic în mediul TIA(printr-un Setpoint) dar si din modul în care se învarte elicea în simularea de pe tabletă.

Acest lucru este posibil datorită Microcontrolerului care transformă informația primită de la tableta în tensiune trimisă catre PLC și invers.

Pasi de urmat:

Se introduce cablul de tip panglică atașat plăcii de bază în care se regasește Microcontrolerul la

placa de conectare cu PLC-ul și se conectează Tableta la microcontroler printr-o conexiune USB. Placa de conectare se conectează prin masa GND la masa GND a PLC-ului , pinul AOUT2 la Analog I0 și pinul AIN1 la AnalogQ0. Acelasi proces se repeta și pentru al doile model, însa diferă pinii care sunt AOUT4 la AnalogI2 și AIN2 la AnalogQ2.

Se rulează aplicația în TIA Portal V13 și se conecteaza printr-un cablul de rețea la calculator și la

PLC. Dupa ce s-a încarcat dispozitivul urmatorul pas este sa apasăm butonul ”Go online” pentru a comunica cu sistemul PLC si se apasă butonul din cadrul PLCTechnology objects Commisioning.

Pe tabloul PLC se poziționează switc-ul AnlogI1 pe poziția de sus si AnalogI0 pe pozitia de jos,

astfel AnalogI0 va primi curent printr-un cablu conectat la Microcontroler prin placa de conectare și AnalogI1 va primi curent de la un generator controlat printr-un potentiometru de pe PLC. Acelasi lucru il facem și pentru a simula al doilea motor numai că în 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.

Următorul pas este sa rulăm aplicația de pe tableta și să pornim simularea celor două

motoare ale dronei din meniul ”Simulare dronă”. Dacă potențiometrul are valoarea 0 vom observa că motorul pentru care rulăm simularea este într-o stare de repaus.

În momentul în care rotim din potentiometru se genereaza o tensiune, iar motorul din simulator va

exercita un impuls către aplicația 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 și pași de urmat:

Initial setăm potentiometrul pe poziția 0, astfel una din elice va fi în stare de repaus.

Setăm frâna exercitată din aplicația Android să fie de 0.4

Din poziția 0 rotim potentiometrul în proporție de 60% până depașește jumătatea și astfel putem observa cum Output-ul urcă la 65% si cum Setpoint-ul este egal cu Input-ul atunci când scade la 15.7% si rămâne constant datorită Setpoint-ului care este egal cu Input-ul. Putem observa acest lucru în imaginile urmatoare.

În continuare vom mări frâna 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 ramâne la 1565 rpm .Astfel avem dovada că aplicatia de PID_Control funcționează.

Exemplu 2 de simulare și pasi de urmat:

Pornim cu potentiometrul la jumătate iar frâna simulatorului o setăm să fie 1.5 . Dacă scădem frâna la 0.6 se poate observa cum în grafic scade Output-ul, deoarece este nevoie de o tensiune mai mică pentru a menține viteza la valoarea dorită.Dacă scădem valoarea potentiometrului la 25% vom observa cum scade brusc și Setpoint-ul, iar Output-ul va scădea la 8.5%.

In continuare vom mări frâna prin acționarea butonului ” + ” din aplicația Android ,astfel va creste valoarea Output-ului și tensiunea aplicată motorului pentru a menține viteza constantă(val 660).

Atunci când acționăm o frână asupra motorului PLC-ul va ridica tensiunea pentru a mentine o viteza constanta a elicelor.

6.2 Simularea unei drone în Unity.

Simularea este formată dintr-o aplicație scrisă în Unity și folosește elemente de tip C# și JAVA . Ea poate fi salvată și în mediul Eclipse sub forma unei aplicații Android cu ajutorul unui plugin adăugat în Unity numit unity2eclipse ce poate fi achizitionat din Assets Store. Această aplicație simulează o dronă cu patru motoare ce poate fi controlată prin intermediul unor săgeti și a două butoane: unul pentru ascensiune si altul pentru coborâre. Drona a fost creată prin combinarea a mai multor obiecte 3D (assetsuri) : două cuburi(remodelate) folosite pe post de bază a dronei , patru componente cilindrice pe post de suport a elicelor, și alte patru cuburi care au fost redimensionate pentru a arăta asemanator cu o elice.

În acest moment putem încarca aplicația folosind pasii menționați anterior și putem apăsa butonul Play pentru a rula aplicația.

Inițial drona se află într-o poziție de repaus, după cum putem observa motoarele au valoarea 0 ceea ce înseamnă că puterea primită de acestea este nula.

Pentru a porni drona și pentru a o ridica de la sol putem apasa tasta ”A”. Astfel dacă puterea motoarelor depășește valoarea stabilită de 24.00, drona se va ridica usor.Dacă dorim să coborâm puterea motoarelor putem apăsa tasta ”X”.

Motoarele dronei pot fi acționate în mod individual astfel: prin tasta ”I” motorul din fată va primi putere iar puterea celui din spate va scădea, prin tasta ”L” motorul din dreapta va primi putere iar puterea celui din stânga va scădea, prin tasta ”K” puterea motorului din spate va creste iar cel din fata va scădea, prin tasta ”J” puterea motorului din stânga va creste iar cel din dreapta va scădea.

De asemenea există si tasta ”S” care întoarce drona spre partea stânga și tasta ”D” care întoarce drona spre partea dreapta.

7. Concluzii

Sistemele de reglare automată sunt folositoare deoarece mențin unele procese la o valoare stabilită inițial și nu necesită intervenția omului pentru efectuarea fiecărei sarcini în parte.

Folosind simulatorul bazat pe PLC-Microcontroler-Android putem verifica modul în care echipamentele se comportă în situații critice, precum , situația în care motorul necesită o putere mai mare pentru a rula datorită unei frâne exercitate asupra sa. Datorită extensiei AndroidAndEngineBox2D putem simula și alte lucruri precum : un ascensor cu toate componentele sale, un sistem de semaforizare sau un sistem control al temperaturii.

Simularea creată in Unity ne oferă posibilitatea de a simula o dronă într-un mediu virtual și de a vedea modul în care se comportă aceasta atunci când asupra motoarelor sale este exercitată o putere. Astfel motoarele primesc puterea necesară, fiind posibilă deplasarea acesteia. Asemanator putem simula și alte lucruri în Unity precum: un sistem de recunoaștere a sunetelor într-un mediu, simularea unei schimbări climatice etc.

Putem preciza că am abordat urmatoarele subiecte:

În capitolul 1 am discutat noțiuni generale pentru a ințelege mai bine un astfel de sistem.

În capitolul 2 am urmat toți pașii necesari pentru a vedea cum se ajunge la un regulator de tip PID.

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

În capitolul 4 am specificat rolul și componentele hardware folosite pentru simularea PLC-Microcontroler-Android.

În capitolul 5 am prezentat aplicațiile software utilizare pentru cele două simulari: PLC-Microcontroler- Android și aplicația în Unity.

În capitolul 6 am prezentat cele două simulări în Unity și cea ce implică sistemul PLC-Microcontroler-Android .

Aceste simulări sunt importante deoarece putem evalua dispozitivele cu care dorim să lucrăm și astfel se pot evita situații în care acestea se deteriorează și nu mai pot fi folosite.Astfel am simulat cu succes o dronă într-un mediu virtual și am realizat simularea a două elice puse în miscare de două motoare electrice, controlate de pe un Automat programabil.

În locul aplicației Unity putem folosi orice soft ce poate implementa în limbaj C# sau Java , excepția fiind ca în Unity obiectele sunt create mai usor, prin încarcarea lor în dispozitiv și pozitionarea lor pe ecranul principal . Dacă folosim un alt mijloc de implementare este posibil să fim nevoiți să declaram aceste obiecte.

Sistemul de automatizare PLC poate fi înlocui și el la randul lui cu un alt automat programabil iar componentele folosite pot fi utilizate si ele pentru a îndeplini acelasi rol.

Bibliografie

Note de curs – Programare orientată pe obiecte(C++) anul 2

Note de curs – Interfețe grafice(JAVA) anul 3

Note de curs – Programare JAVA anul 2

Note de curs – Programare procedurală(C/C++) anul 1

Note de curs – Informatică aplicată în industrie anul 3

Librăria AndEngine și extensile AndEngineBox2D, android-support-v7-appcompat au fost furnizate de http://www.andengine.org/ .

Pentru configurarea microcontrolerului si descărcarea softului MPLAB X am folosit

http://www.microchip.com/.

Pentru descărcarea softului Eclipse si a componentelor necesare lui am folosit

http://developer.android.com/

Pentru descarcarea softului Unity varianta free am folosit http://unity3d.com

Pentru Tia Portal V13 am consultat – http://www.industry.siemens.com

Pentru configurarea schemelor plăcutelor a fost folosit EagleView descărcat de pe

http://www.cadsoftusa.com/

Preluarea de informații JAVA am folosit http://www.java.com

AndEngine for Android Geme Development Cookbook by Jayme Schroeder and Broyles

Learning Android Game Programming by Rick Rogers.

Training Document for Integrated Automation Solutions Totally Integrated Automation(TIA) by SIEMENS Industry Automation and Drive Technologies – SCE

Modetn Control Technology omponents and Systems by Kilian

Pentru AndEngineBox2D – http://www.box2d.org/manual.html

Similar Posts