Sunteți pe pagina 1din 184

PROGRAMAREA INTERFETELOR

PENTRU INSTRUMENTATIE VIRTUALA

Curs – Anul III – Mecatronica si Robotica


NOTARE

- 50p pe parcurs, din care:


- 20 puncte laborator – toate laboratoarele sunt obligatorii
- 20 puncte proiect – toate sedintele sunt obligatorii. Predarea se face la ultima sedinta de proiect,
prin platforma Moodle, se noteaza in ultima saptamana
- 10 puncte prezenta curs – 1 punct / prezenta

- 50p examen final:


- 25p partial 1 – saptamana 7 (discutabil)
- 25p partial 2 (in sesiune)
*nota finala la examen trebuie sa fie >=25p
*prezenta la toate activitatile este obligatorie
**prezenta la toate activitatile nu este neaparat obligatorie
CUPRINS

1. Introducere
2. Concepte generale
3. Programare orientata obiect 1
4. Programare orientata obiect 2
5. Programare orientata obiect 3
6. Module de baza
7. Partial (eventual)
8. Interfete grafice
9. NumPy/SciPy
8. Fire de executie
11. Networking
12. Baze de date
13. Exemple de aplicatii pentru mecatronica
14. Exemple de aplicatii pentru mecatronica
*) structura cursului poate varia in functie de necesitatile aparute pe durata semestrului
LIMBAJE DE PROGRAMARE / UTILIZARE
CATEVA CUVINTE DESPRE ACEST CURS

Cursul de fata nu isi doreste a fi un ghid complet in ceea ce priveste programarea orientata-obiect pentru sisteme mecatronice in
general ci mai degraba un ghid pentru inginerul mecatronist aflat in impas cand vine vorba de programarea multora dintre
caracteristicile sistemelor mecatronice.

Vine in ajutorul studentilor de anul III al specializarii Mecatronica si Robotica (si nu doar) in vederea intregirii unui pachet de
cunostinte necesare oricarui proiect in domeniul mecatronicii.

Pe parcursul lucrarii vor fi tratate atat concepte de baza (tipuri de variabile, lucrul cu fisiere, bucle repetitive,etc), concepte de baza
OOP precum si multe dintre modulele si aplicatii ale acestora specifice (OOP) necesare realizarii unor proiecte complete.

In cadrul acesteia se vor discuta elemente de baza ale programarii orientate obiect, precum si optiuni avansate ale acesteia. Se
doreste ca dupa parcurgerea acestei lucrari sa fie posibila abordarea unor proiecte de complexitate cel putin medie, in contextul
conducerii sistemelor mecatronice.

Solutiile prezentate nu sunt absolute: problemele pot fi rezolvate prin foarte multe metode, dar in aceasta lucrare sunt prezentate
cele mai usor abordabile sau cele deja utilizate drept norma in efecutarea anumitor operatiuni.
PARADIGMELE PROGRAMARII

Wiki: Paradigma este o construcție mentală larg acceptată, care oferă unei comunități sau unei societăți pe perioadă
îndelungată o bază pentru crearea unei identități de sine (a activității de cercetare de exemplu) și astfel pentru rezolvarea
unor probleme sau sarcini.

Paradigmele de programare se refera la o modalitate de a clasifica limbajele de programare in functie de felul in care
acestea functioneaza. In general, un limbaj de programare poate fi incadrat la mai multe astfel de paradigme.
PRINCIPII ORIENTAT OBIECT

- Metoda/Functie/Obiect/Clasa

- Constructor

- Abstractizare

- Incapsulare

- Modularizare

- Ierarhizare

- Mostenire

- Polimorfism

- Overloading/Overriding
INTERPRETAT VS. COMPILAT
*GARBAGE COLLECTION

▪ Administrarea automata a memoriei (garbage collector)


Multe limbaje de programare impun ca programatorul sa tina evidenta obiectelor create si sa le
distruga ın mod explicit atunci cand nu mai este nevoie de ele, cu alte cuvinte sa administreze singur
memoria ocupata de obiectele sale.
Un obiect este eliminat din memorie de procesul de colectare atunci cand nu mai exista nici o
referinta la acesta. Referintele (care sunt de fapt variabile) sunt distruse doua moduri:
- natural, atunci cand variabila respectiva iese din domeniul sau de vizibilitate, de exemplu la terminarea
metodei ın care ea a fost declarata;
- explicit, daca atribuim variabilei respective valoare null.
Garbage collector este un proces de prioritate scazuta care se executa periodic, scaneaza dinamic
memoria ocupata de programul scris si aflat ın executie si marcheaza acele obiecte care au referinte directe
sau indirecte. Dupa ce toate obiectele au fost parcurse, cele care au ramas nemarcate sunt eliminate
automat din memorie.
LIMBAJE OOP
TIPURI DE DATE

In domeniul calculatoarelor, tipul de date face referire la o metoda prin care creatorul programului
semnaleaza felul in care o variabila va fi folosita. Specific, se face referire la tipul de operatii care pot
fi executate asupra acelei variabile si felul in care le va afecta rezultatul obtinut.

Date Tip
Text Str
Numeric Int, float
Secventa Lista, tuplu
Mapping Dictionar
Set Set
Boolean Bool
TIPURI DE DATE - BOOL

Cel mai “simplu” tip de date, permite stocarea unei valori de adevar (True/False).

Utilitatea sta in stocarea rezultatului unor comparatii, starii unor biti de intrare/iesire, etc.

Utilizare:
TIPURI DE DATE - INT

In cazul Python, un numar de tip int poate fi oricat de lung, in conditiile restrangerilor legate de
memoria sistemului.
Daca nu se specifica altfel, valorile sunt considerate ca fiind in baza 10. Specificarea unei alte baze se
face prin inserarea unui prefix: 0b pentru binar, 0x pentru hexadecimal si 0o pentru baza 8

Se poate observa de asemenea ca utilizarea type() intoarce clasa


din care a fost instantiata variabila si nu tipul variabilei. Acest
aspect va fi discutat mai tarziu dar momentan se poate observa
ca acest comportament se pastreaza si la aplicarea type() pe o
valoare si nu o variabila.
TIPURI DE DATE - FLOAT
TIPURI DE DATE - STRING

In limbajul de programare Python variabilele de tip string sunt reprezentate fie cu ajutorul a doua
caractere “ “ sau ‘ ‘. Spre exemplu “Salut” este echivalent cu ‘Salut’.

Limbajul permite de asemenea stocarea si printarea string-urilor


pe mai multe randuri. Sfarsitul unui rand va fi acelasi cu cel din
declararea variabilei. Asignarea unei valori string pe mai multe
randuri se marcheaza cu ajutorul a trei ghilimele simple sau
duble (“”” sau ‘’’)
TIPURI DE DATE - STRING

Este posibila de asemenea accesarea unui caracter individual sau a unui substring prin utilizare indexului:
TIPURI DE DATE - TYPECASTING

Deseori, este necesara conversia intre tipurile de variabile. Mecanismul utilizat pentru transformare
poarta denumirea de typecasting si rezolva in mod automat, pe baza unor reguli prestabilite, toate
problemele ce pot aparea un cazul unei conversii intre timpurile de variabile.
STRUCTURI DE DATE - LISTE

In Python, listele sunt colectii ordonate si mutabile care permit elemente duplicat. Listele pot contine
numere, siruri, liste sau tupluri. Listele se pot declara sub forma:

Un aspect interesant al listelor este faptul ca pot contine in acelasi timp tipuri diferite de elemente, dupa cum
este exemplificat in cele ce urmeaza:
STRUCTURI DE DATE - LISTE

Un alt aspect important este faptul ca listele pot fi atat indexate, cat si mutabile
STRUCTURI DE DATE - LISTE

Lucrul cu liste in Python este inlesnit de existenta unei serii de metode pre-existente, printre care se
numara (pentru exemplele urmatoare se porneste de la lista=[3,2,1])

Metoda Rol Input(exemplu) Output

Adauga elementul A la capatul listei


Append lista.append(4) lista=[3,2,1,4]

Sorteaza in ordine crescatoare


elementele dintr-o lista
Sort list.sort() lista=[1,2,3,4]

Sorteaza in ordine descrescatoare


elementele dintr-o lista
Reverse list.reverse() lista=[4,3,2,1]

Numara de cate ori apare intr-o lista un


Count anumit element list.count(2) 1
STRUCTURI DE DATE - TUPLU

Este o colectie de variabile, fara conditie de unicitate cu sintaxa tuplu=(var1, var2, var3, etc). Astfel:

Tuplul este de asemenea un tip de variabila imutabil


STRUCTURI DE DATE - TUPLU

Tuplul permitie de asemenea concatenarea:

Adresarea elementelor dintr-un tuplu se face asemanator elementelor discutate deja:


STRUCTURI DE DATE - TUPLU

Adresarea elementelor dintr-un tuplu nested:


STRUCTURI DE DATE - SET

Setul in Python este o colectie de elemente unice, fara index, declarat intre acolade {var1, var2, var3, etc}.

Elemenele incluse intr-un set nu sunt ordonate intr-un fel anume si pot aparea altfel de fiecare data cand sunt
utilizate deci adresarea lor nu se poate face pe baza de index. De asemenea, valorile incluse intr-un set nu pot fi
schimbate dupa atribuire.
STRUCTURI DE DATE - SET

Setul poate fi transformat in alt tip de variabila prin utilizarea type casting. In exemplul de mai jos lista
L este transformata in set pentru eliminarea valorilor duplicat.

Operatiile aplicabile la seturi sunt intersectia,


uniunea, diferenta si diferenta simetrica
STRUCTURI DE DATE - SET

Adaugarea sau eliminarea unor elemente ale unui set se poate face prin intermediul metodelor add,
respectiv discard:
Parcugerea valorilor dintr-un set de date se face astfel:
STRUCTURI DE DATE - DICTIONAR

Tip de date utilizat in Python entru buna organizare a valorilor in perechi key:value. Se declara sub forma
a={key1:value1, key2:value2, etc}, cu mentiunea ca variabila key poate fi doar caracter sau numeric dar
trebuie sa fie unica, in timp ce value poate contine orice tip de variabila.
STRUCTURI DE DATE - DICTIONAR

Cateva dintre metodele atasate lucrului cu dictionare in Python sunt:


DATE (NE)SIGURE

Termenul face referire la cat de sigure sau mai degraba cat de potrivite sunt datele pentru ciclare. In
speta, se pot identifica:

- Date sigure: Sirul de caractere si tuplul

- Date nesigure, dar cu protectie: Dictionar si set

- Date nesigure si fara protectie: Lista


DATE SIGURE

Explicit, date sigure inseamna in cazul unui sir de caractere spre exemplu ca ciclarea prin intermediul
unei bucle nu va conduce la o conditie infinita:
DATE SIGURE

Explicit, date sigure inseamna in cazul unui sir de caractere spre exemplu ca ciclarea prin intermediul
unei bucle nu va conduce la o conditie infinita:
DATE NESIGURE - PROTEJATE

In cazul unui dictionar (tip de date nesigur dar cu protectie) este imposibila modificarea acestuia in timpul
ciclarii. La fel si pentru set.
DATE NESIGURE

In cazul unei liste insa lucrurile se schimba:

Programul de mai sus va adauga elementul 4 la lista si va cicla lista conform cu noua structura.
Se va genera astfel o bucla infinita:
CAPTURA DATE TASTATURA

Captura elementelor introduse de la tastatura in Python se face cu ajutorul metodei input(). Aceasta
permite stocarea unui caracter sau sir de caractere introduse de la tastatura sub forrma unui array de
caractere.

Se poate observa ca oricare ar fi continutul datelor de intrare (String, int, mixt), tipul de iesire de tip
str. Acest lucru va fi intotdeauna valabil si este necesara utiliarea metodelor de tip typecast pentru
modificarea tipului variabilei cel dorit.
DATA VIITOARE:

Control executie
Functii
Introducere OOP
PROGRAMAREA INTERFETELOR
PENTRU INSTRUMENTATIE VIRTUALA

Curs – Anul III – Mecatronica si Robotica


NOTARE

- 50p pe parcurs, din care:


- 20 puncte laborator – toate laboratoarele sunt obligatorii
- 20 puncte proiect – toate sedintele sunt obligatorii. Predarea se face la ultima sedinta de proiect,
prin platforma Moodle, se noteaza in ultima saptamana
- 10 puncte prezenta curs – 1 punct / prezenta

- 50p examen final:


- 25p partial 1 – saptamana 7 (discutabil)
- 25p partial 2 (in sesiune)
*nota finala la examen trebuie sa fie >=25p
*prezenta la toate activitatile este obligatorie
**prezenta la toate activitatile nu este neaparat obligatorie
CUPRINS

1. Introducere
2. Concepte generale
3. Programare orientata obiect 1
4. Programare orientata obiect 2
5. Programare orientata obiect 3
6. Module de baza
7. Partial (eventual)
8. Interfete grafice
9. NumPy/SciPy
8. Fire de executie
11. Networking
12. Baze de date
13. Exemple de aplicatii pentru mecatronica
14. Exemple de aplicatii pentru mecatronica
*) structura cursului poate varia in functie de necesitatile aparute pe durata semestrului
ASTAZI:

Control executie
Functii
Introducere OOP
CONTROL EXECUTIE - WHILE

Bucla While este folosita pentru repetarea unei instructiuni sau grup de instructiuni pana cand o conditie
este indeplinita.

Este necesar ca in cazul acestei bucle insa atentie sporita sa fie


acordata cazurilor in care se poate crea o bucla infinita, aceste
cazuri nu sunt de dorit.
CONTROL EXECUTIE - FOR

Acest tip de bucla repeta o anumita instructiune pana la indeplinierea unei anumite conditii. Prezinta de
asemenea mai multe modalitati de utilizare, cum ar fi:

Ciclarea printr-o lista: Parcugerea unui string:


CONTROL EXECUTIE - FOR

Bucla for nu necesita setarea unei valori de incrementat, acest lucru se poate face implicit prin utilizarea
range().

Utilizarea range permite de asemenea si setarea unui start al intervalului din care se vor
genera valori – range(start,stop):
CONTROL EXECUTIE - FOR

Este posibila de asemenea si setarea incrementului range(start,stop,increment):


CONTROL EXECUTIE - IF

Aceasta functie permite compararea logica a unor valori si obtinerea unui rezultat boolean, (True sau
False). In functie de acesta se poate executa o ramura a functiei sau ramura else. Sintaxa este:
CONTROL EXECUTIE - IF

Aceasta functie permite compararea logica a unor valori si obtinerea unui rezultat boolean, (True sau
False). In functie de acesta se poate executa o ramura a functiei sau ramura else. Sintaxa este:

Suplimentar fata de cazul anterior se poate executa si instructiunea elif. Aceasta permite executarea unei
verificari suplimentare daca cele anterioare nu au fost adevarate:
CONTROL EXECUTIE - IF

Daca numarul redus de instructiuni permite acestea pot fi scrise pe un singur rand:

Dupa cum se poate observa instructiunea executata in cazul verificarii conditiei este scrisa inaintea if. Pot
fi inlantuite si mai multe astfel de instructiuni:

If permite utilizarea operatorilor logici AND si OR:


CONTROL EXECUTIE - IF

Instructiunea IF poate fi de asemenea si imbricata (nerecomandat):


CONTROL EXECUTIE – BREAK, PASS, CONTINUE

Automatizarea unor sarcini cu Python presupune de multe ori controlul unor bucle in afara
sensului direct al acestora. Poate fi necesara spre exemplu iesirea brusca dintr-o bucla, ignorarea unei
portiuni de cod sau ignorarea unor semnale exterioare. Intr-un asemenea caz se pot dovedi utile
instruciunile break, pass sau continue.
CONTROL EXECUTIE - BREAK

Instructiunea break permite intreruperea functionarii unei bucle, spre exemplu la indeplinirea unei anumite
sarcini sau intalnirea unui anumit semnal. Spre exemplu programul de mai jos se va executa pana la i=3,
desi conditia buclei este i<1000: executia buclei while este intrerupta la intalnirea instructiunii break.
CONTROL EXECUTIE - CONTINUE

Instructiunea continue permite insa blocarea executiei buclei doar in anumite conditii. Spre exemplu,
daca inlocuim break in programul anterior vor fi afisate toate valorile in afara de i=3. Cu alte cuvinte bucla
este intrerupta la intalnirea instructiunii continue si reluata direct de la pasul urmator.
CONTROL EXECUTIE - PASS

Ultima dintre instructiuni, pass, permite executarea unor bucle sau portiuni de cod fara a avea vreun
impact asupra rezultatului. Spre exemplu, putem utiliza o instructiune if fara vreun efect. Programul de mai
jos va afisa toate valorile i:

Pentru ce este utilizat?


FUNCTII - GENERAL

Functia reprezinta o portiune de cod care poate fi apelata in vederea rularii unui anumit set de
instructiuni in anumite conditii. In limbajul de programare Python declararea unei functii se face prin
utilizarea cuvantului cheie def . Toate instructiunile incluse intr-o functie vor fi pozitionate la un tab
suplimentar fata de cuvantul cheie. Un exemplu de functie este:
FUNCTII - GENERAL

Se poate observa ca este declarat sub forma def NumeFunctie(): .Spatiul dintre paranteze poate fi
utilizat pentru declararea unor parametri, dupa cum se va explica in cele ce urmeaza. Apelarea unei functii
se face prin utilizarea numelui functiei urmat de paranteze, intre care se pot include, daca este necesar,
parametrii necesari pentru functionare.

Functia declarata este de asemenea un obiect.


FUNCTII - GENERAL

Este posibila apelarea unei functii din interiorul unei alte functii. Functionarea functiei care apeleaza va
fi intrerupta pana la incheierea instructiunilor din functia apelata.
FUNCTII - GENERAL

De multe ori parametrii pot avea valori standard sau pot fi pozitionali. In acest caz un prim exemplu
face referire la ordinea parametrilor dintr-o functie. Astfel pentru:
FUNCTII - GENERAL

De multe ori parametrii pot avea valori standard sau pot fi pozitionali. In acest caz un prim exemplu
face referire la ordinea parametrilor dintr-o functie. Astfel pentru:

Se observa ca indiferent de ordinea parametrilor de intrare functia este executata. Pentru a preveni
aceasta problema se poate face apelarea functiei cu utilizarea unor cuvinte cheie:
FUNCTII - GENERAL

Acest mecanism este destul de flexibil, cu anumite mentiuni. Spre exemplu, parametrii pozitionali
trebuie asezati inaintea parametrilor specificati prin eticheta:

Dupa adaugarea parametrului inaltime, prima apelare a functiei va intoarce rezultatul dorit: parametrii
marcati prin cuvinte cheie, desi nu sunt in ordine, sunt asezati dupa parametrii pozitionali. In schimb, a
doua apelare va intoarce eroare, nu exista o metoda sigura de a determina parametrul caruia i se adreseaza
valoarea “George”.
FUNCTII - GENERAL

Limbajul de programare permite si definirea unor functii care includ in signatura lor si parametri
impliciti:

Se poate observa apelarea functiei in trei cazuri: fara parametri, caz in care se va rula cu parametrii
impliciti, cu un singur parametru si eticheta acestuia sau cu ambii parametrii, in orice ordine, atat timp cat au
etichetele potrivite.
FUNCTII - *ARGS SI **KWARGS

In cazul limbajului de programare Python este posibila de asemenea si utilizarea parametrilor *args si
**kwargs. Acestia se pot utiliza atunci cand se doreste transmiterea catre functie a unui numar mare de
parametri sau daca la momentul definirii functiei aceasta are un numar necunoscut de intrari.

Spre exemplu, la *args se poate apela atunci cand se doreste adunarea a unui numar necunoscut de
elemente:

Se poate observa ca functia este apelata cu trei parametri


desi aceasta a fost definita cu unul singur, precedat insa de *.
Cei trei parametri sunt transmisi catre functie sub forma unui
tuplu care apoi poate fi parcurs si folosit. In cazul de fata se
obtine o suma stocata sub forma variabilei x.
FUNCTII - *ARGS SI **KWARGS

Spre deosebire de *args, argumentele de tip **kwargs permit transmiterea informatiilor sub forma unui
dictionar.
FUNCTII - NAMESPACES

Un alt aspect important de discutat in cazul functiilor tine de valabilitatea variabilelor in namespace-
uri. Mai exact, ce se intampla cu variabilele declarate in corpul programului in corpul functiilor. Spre
exemplu:
FUNCTII - NAMESPACES
FUNCTII - NAMESPACES
CLASE

In programarea orientata obiect o clasa este o portiune de cod tip care permite crearea unor obiecte ce vor avea
variabile si metode/functii comune. Atunci cand un obiect este creat prin intermediul unei clase se numeste ca
acesta este instantiat. Acest obiect va avea propriile variabile ale instantei obiectului, diferite de cele ale clasei care
sunt valabile pentru toate obiectele instantiate din acea clasa.

Sintaxa pentru declararea unei clase este compusa din cuvantul cheie class urmat de numele clasei (Exemplu)
si cele doua paranteze care permit mostenirea unei alte clase
CLASE

Pentru a fi utile clasele vor contine si metode, cele care implementeaza comportamentul dorit. Este obligatoriu
ca obiectul sa fie instantiat din clasa care contine metoda dorita inainte ca aceasta sa poata fi apelata. Metoda dintr-
o clasa se va regasi in toate obiectele instantiate din acea clasa. Spre exemplu:
CLASE

Se poate oberva utilizarea cuvantului cheie self la declararea metodei – acest parametru este obligatoriu
si este utilizat pentru accesarea atributelor si metodelor din cadrul aceleiasi instante ale unei clase.

In cadrul programului au fost definite doua metode


denumite Metoda1 si Metoda2. La apelarea Metoda1
variabila self.x primeste valoarea 1 iar la apelarea
Metodei2 aceiasi variabila este incrementata si apoi
listata. Se poate observa ca in cadrul Metoda2 se
defineste si o alta variabila x. Desi aparent poarta
acelasi nume, adaugarea prefixului self defineste self.x
drept valabil pentru namespace-ul obiectului iar
variabila simpla x este valabila doar in namespace-ul
metodei Metoda2.
DATA VIITOARE:
PROGRAMAREA INTERFETELOR
PENTRU INSTRUMENTATIE VIRTUALA

Curs 4 – Anul III – Mecatronica si Robotica


NOTARE

- 50p pe parcurs, din care:


- 20 puncte laborator – toate laboratoarele sunt obligatorii
- 20 puncte proiect – toate sedintele sunt obligatorii. Predarea se face la ultima sedinta de proiect,
prin platforma Moodle, se noteaza in ultima saptamana
- 10 puncte prezenta curs – 1 punct / prezenta

- 50p examen final:


- 25p partial 1 – saptamana 7 (discutabil)
- 25p partial 2 (in sesiune)
*nota finala la examen trebuie sa fie >=25p
*prezenta la toate activitatile este obligatorie
**prezenta la toate activitatile nu este neaparat obligatorie
CUPRINS

1. Introducere
2. Concepte generale
3. Programare orientata obiect 1
4. Programare orientata obiect 2
5. Programare orientata obiect 3
6. Module de baza
7. Partial (eventual)
8. Interfete grafice
9. NumPy/SciPy
8. Fire de executie
11. Networking
12. Baze de date
13. Exemple de aplicatii pentru mecatronica
14. Exemple de aplicatii pentru mecatronica
*) structura cursului poate varia in functie de necesitatile aparute pe durata semestrului
DATA TRECUTA:

Control executie
Functii
Introducere OOP
ASTAZI:

“Detalii” OOP
CLASE

In programarea orientata obiect o clasa este o portiune de cod tip care permite crearea unor obiecte ce vor avea
variabile si metode/functii comune. Atunci cand un obiect este creat prin intermediul unei clase se numeste ca
acesta este instantiat. Acest obiect va avea propriile variabile ale instantei obiectului, diferite de cele ale clasei care
sunt valabile pentru toate obiectele instantiate din acea clasa.

Sintaxa pentru declararea unei clase este compusa din cuvantul cheie class urmat de numele clasei (Exemplu)
si cele doua paranteze care permit mostenirea unei alte clase
CLASE

Pentru a fi utile clasele vor contine si metode, cele care implementeaza comportamentul dorit. Este obligatoriu
ca obiectul sa fie instantiat din clasa care contine metoda dorita inainte ca aceasta sa poata fi apelata. Metoda dintr-
o clasa se va regasi in toate obiectele instantiate din acea clasa. Spre exemplu:
CLASE

Acestea fiind spuse, nu este obligatorie instatierea explicita. Este insa necesara utilizarea decoratorului
@staticmethod
EXEMPLE CLASE - 1

Declarati o clasa Robot care sa contina:

- 3 variabile ale clasei (ID, culoare, tip controller)

- O prima metoda denumita “deplasare”, responsabila pentru deplasarea robotului. Metoda va intoarce deocamdata doar
un mesaj potrivit

- A doua metoda denumita “oprire” – va intoarce un mesaj potrivit

Cerinte:

1. Instantiati un obiect denumit robOne din clasa definita. Printati variabilele clasei.

2. Rulati cele doua metode ale clasei.

3. Modificati atributele robOne si printati din nou.


EXEMPLE CLASE - 1

Tema pentru acasa:

1. Instantiati un obiect denumit robOne din clasa definita. Printati variabilele clasei.
2. Rulati cele doua metode ale clasei.
3. Modificati atributele robOne si printati din nou.
4. Printati variabilele clasei. Ce observati? Explicati.
5. Modificati variabilele clasei. Printati din nou punctele 3 si 4.
6. Instantiati robTwo si repetati punctul 1
7. Printati variabilele clasei, atributele robOne si robTwo. Explicati rezultatul.
8. Adaugati o metoda “listareVariabile”. Printati idn, culoareRobot si controller. Explicati rezultatul.

9. Adaugati o modalitate prin care sa determinati daca in instanta curenta


prin intermediul careia se apeleaza metoda de la 8 variabilele clasei sunt
modificate.
Explicati mecanismul prezentat. Dati exemple de utilizari.
EXEMPLE CLASE - 2

La problema de la punctul anterior adaugati un constructor.

Cerinte:

1. Constructorul va avea un singur parametru de intrare: tip_deplasare si va afisa un mesaj “Robot instantat”

2. Instantiati robThree din clasa Robot. Explicati rezultatul.

3. Adaugati in constructor o variabila tip_deplasare si stocati “Default”. Printati self.tip_deplasare si tip_deplasare.


Explicati rezultatul
EXEMPLE - INCAPSULARE

Incapularea presupune “ascunderea” datelor intr-un namespace in asa fel incat acestea nu pot fi accesate
din namespace-ul global. Spre exemplu, putem crea o functie intr-o alta functie:
EXEMPLE - INCAPSULARE

Incapularea presupune “ascunderea” datelor intr-un namespace in asa fel incat acestea nu pot fi accesate
din namespace-ul global. Spre exemplu, putem crea o functie intr-o alta functie:

Rularea codului de mai sus va intoarce valoarea 2. Daca insa incercam sa apela Met2() din afara Met1()
rezultatul va fi eroare:
EXEMPLE - INCAPSULARE

O variabila declarata in afara namespace-ului unei functii poate fi accesata (citita), dar nu poate fi
modificata. In exemplul urmator acest lucru este demonstrat atat pentru namespace-ul global cat si pentru
namespace-ul functiei Met1().
DATA VIITOARE:

Module Python
PROGRAMAREA INTERFETELOR
PENTRU INSTRUMENTATIE VIRTUALA

Curs 5 – Anul III – Mecatronica si Robotica


NOTARE

- 50p pe parcurs, din care:


- 20 puncte laborator – toate laboratoarele sunt obligatorii
- 20 puncte proiect – toate sedintele sunt obligatorii. Predarea se face la ultima sedinta de proiect,
prin platforma Moodle, se noteaza in ultima saptamana
- 10 puncte prezenta curs – 1 punct / prezenta

- 50p examen final:


- 25p partial 1 – saptamana 7 (discutabil)
- 25p partial 2 (in sesiune)
*nota finala la examen trebuie sa fie >=25p
*prezenta la toate activitatile este obligatorie
**prezenta la toate activitatile nu este neaparat obligatorie
CUPRINS

1. Introducere
2. Concepte generale
3. Programare orientata obiect 1
4. Programare orientata obiect 2
5. Programare orientata obiect 3
6. Module de baza
7. Partial (eventual)
8. Interfete grafice
9. NumPy/SciPy
8. Fire de executie
11. Networking
12. Baze de date
13. Exemple de aplicatii pentru mecatronica
14. Exemple de aplicatii pentru mecatronica
*) structura cursului poate varia in functie de necesitatile aparute pe durata semestrului
AZI:

Reutilizare cod (“Librarii”)


Fisiere/tipuri fisiere/parsare
Module diverse
FRAMEWORK/LIBRARIE/PACHET/MODUL

Un modul reprezinta o portiune de cod cu un anumit scop care poate fi inclusa si rulata in
corpul unui alt program, in vederea indeplinirii unui anumit scop.

Utilizarea modulelor permite distribuirea si reutilizarea unei anumite portiuni de cod, fara a mai
fi necesara rescrierea acestuia de fiecare data.

Mecanismul permite reutilizarea unor variabile, metode sau clase in intregime.

Sintaxa import modul: import nume_modul

nume_modul – poate fi numele fisierului in care au fost salvate metodele/clasele vizate sau
numele unui pachet de module/modul instalat.
MODULE

Exemplu 1 – import si utilizare functii

2 1

3
MODULE

Exemplu 2 – import si utilizare clase

2
1

3
MODULE

Exemplu 3 – import partial


MODULE

Exemplu 4 – import partial / namespace / suprascriere


EXEMPLE MODULE – 1.TIME

Python permite administrarea functiilor de timp cu ajutorul modului time. Acesta permite efectuarea
operatiunilor comune in programare atunci cand vine vorba de administrarea datei curente, calculul timpului
scurs intre doua evenimente, formatarea timpului, etc.
EXEMPLE MODULE – 1.TIME

O posibilitate interesanta este cea de a astepta o perioada de timp, impusa prin intermediul metodei time.sleep().
Metoda de mai jos va astepta o secunda dupa fiecare iteratie a buclei for, insa trebuie retinut ca in acest timp
programul doar asteapta si nu poate face alte operatiuni.
EXEMPLE MODULE – 1.TIME

Time.localtime() permite accesarea unui tuplu de 9 elemente:


EXEMPLE MODULE – 1.TIME

Time.localtime() permite accesarea unui tuplu de 9 elemente:


EXEMPLE MODULE – 1.TIME

Modulul time permite si formatarea timpului conform cu necesitatile (vezi tabelul de mai jos):
EXEMPLE MODULE – 1.CALENDAR

Mai poate fi mentionat aici si modulul Calendar, care poate fi util in manipularea datelor legate de timp in
formatul unui calendar:
EXEMPLE MODULE – I1.FISIERE

Atunci cand se face referire la fisiere de tip plain text ne referim la acele fisiere care contin doar caractere din
setul ASCII, sunt astfel independente de sistemul de operare si pot fi deschise de foarte multe aplicatii. Fisierele
binare in schimb pot contine caractere non-ASCII si pot fi in general procesate doar de o aplicatie care cunoaste
structura fisierelui.

In cel mai simplu sens, deschiderea unui fisier se face cu ajutorul metodei open(). Sintaxa acesteia este:

Obiect_fisier=open(“Cale fisier”, “mode”) ; unde:

- Cale fisier poate fi calea relativa sau absoluta catre fisierul care se doreste a fi deschis

- Mode este modul in care va fi accesat fisierul, conform cu tabelul de pe slide-ul urmator.
EXEMPLE MODULE – I1.FISIERE
EXEMPLE MODULE – I1.FISIERE

De exemplu, pentru citirea unui fisier cu numele “fisier.txt” aflat in acelasi folder cu programul rulat, vom
rula codul de mai jos:

Acest rand va instantia un obiect fisier care va putea fi folosit pentru citirea continutului fisierului. Rularea
comenzii de print:

va intoarce date referioare la acest obiect si nu datele continute in fisier.


EXEMPLE MODULE – I1.FISIERE

Citire:
EXEMPLE MODULE – I1.FISIERE

Scriere:
EXEMPLE MODULE – I1I.TIPURI DE FISIERE

Pentru stocarea si parsarea datelor, printre tipurile de fisiere


comune intalnite in inginerie se numara:

- CSV/TSV

- JSON

- XML

- XLS/XLSX
EXEMPLE MODULE – I1I.TIPURI DE FISIERE

- CSV/TSV
Fisier text in care valorile sunt separate prin virgula (comma -
CSV) sau caracter special TAB( TSV) .

Tipic utilizat pentru stocarea datelor tabelare intr-un format cu


amprenta mica.

***Discutie encoding
EXEMPLE MODULE – I1I.TIPURI DE FISIERE

Exemplu tipic de utilizare pentru citire:

Exemplu tipic de utilizare pentru scriere:

Documentatie completa CSV aici: https://docs.python.org/3/library/csv.html


EXEMPLE MODULE – I1I.TIPURI DE FISIERE

- XML
Extensible Markup Language

De asemenea utilizat pentru stocarea datelor cu o


amprenta cat mai mica.

Este structurat, descriptiv, ierarhic.

Parsarea fisierului este ceva mai dificila.


EXEMPLE MODULE – I1I.TIPURI DE FISIERE

- JSON

Compact, usor de inteles.

Nu este neaparat necesara cunoasterea


in prealabil a sturcturii datelor.
DATA VIITOARE:
PROGRAMAREA INTERFETELOR
PENTRU INSTRUMENTATIE VIRTUALA

Curs 6 – Anul III – Mecatronica si Robotica


NOTARE

- 50p pe parcurs, din care:


- 20 puncte laborator – toate laboratoarele sunt obligatorii
- 20 puncte proiect – toate sedintele sunt obligatorii. Predarea se face la ultima sedinta de proiect,
prin platforma Moodle, se noteaza in ultima saptamana
- 10 puncte prezenta curs – 1 punct / prezenta

- 50p examen final:


- 25p partial 1 – saptamana 7 (discutabil)
- 25p partial 2 (in sesiune)
*nota finala la examen trebuie sa fie >=25p
*prezenta la toate activitatile este obligatorie
**prezenta la toate activitatile nu este neaparat obligatorie
CUPRINS

1. Introducere
2. Concepte generale
3. Programare orientata obiect 1
4. Programare orientata obiect 2
5. Programare orientata obiect 3
6. Module de baza
7. Partial (Nu, evident)
8. Comunicatii (RS232 si TCP)
9. Matplotlib, NumPy/SciPy
10. Fire de executie
11. Baze de date
12. Interfete grafice
13. Exemple de aplicatii pentru mecatronica
14. Exemple de aplicatii pentru mecatronica
*) structura cursului poate varia in functie de necesitatile aparute pe durata semestrului
AZI:

Retele date
RS232/ RS485
TCP/IP
DATE, IN GENERAL:

Transmiterea datelor este procesul de trimitere a datelor digitale sau analogice prin intermediul un mediu
de comunicație către unul sau mai multe dispozitive (calcul, rețea, comunicații, electronice, etc).

Permite transferul datelor și comunicarea dispozitivelor.

Medii posibile:
• Conductoare de cupru – pentru transmisia datelor sub formă de semnale electrice;
• Fibră optică – din fibre de sticlă sau materiale plastice – pentru a transporta datelesub formă de
impulsuri luminoase;
• Medii de transmisie a datelor fără fir – transmit datele sub formă de unde radio, microunde, raze
infraroşii sau raze laser - în cadrul conexiunilor fără fir (wireless);
DATE, IN GENERAL:

O clasificare a reţelelor după criteriul răspândirii pe arii geografice, al modului de administrare si al


mediului de transmisie a datelor ar evidenţia, printre altele , următoarele tipuri de reţele:

- Personal Area Network (PAN)

- Local Area Network (LAN)

- Metropolitan Area Network (MAN)

- Wide Area Network (WAN)


DATE, IN GENERAL:

O reţea suportă trei moduri de transmisie a datelor: simplex, half-duplex şi fullduplex:

Simplex- întâlnit şi sub numele de transmisie unidirecţională, constă în transmisia datelor într-un singur
sens.

Half-duplex – constă în transmiterea datelor în ambele direcţii alternativ. Datele circulă în acest caz pe
rând într-o anumită direcţie. Sistemele sunt formate din două sau mai multe staţii de emisie-recepţie dintre
care una singură joacă rol de emiţător, în timp ce celelalte joacă rol de receptor;

Full-duplex – constă în transmisia datelor simultan în ambele sensuri. Lăţimea de bandă este măsurată
numai într-o singură direcţie (un cablu de reţea care funcţionează în full-duplex la o viteză de 100 Mbps
are o lăţime de bandă de 100 Mbps).
DATE, IN GENERAL:

Topologii de retea:
DATE, IN GENERAL:

Internetul lucrurilor (Internet of Things - IoT) este o tehnologie în curs de dezvoltare prin care se doreste
conectarea unui numar din ce in ce mai mare de dispozitive prin intermediul retelelor locale si al
Internetului. Multiplele valente ale IoT, precum şi numărul din ce în ce mare de dispozitive, tehnologii şi
platforme în acest domeniu, au condus ca IoT să fie o tehnologie extinsă în multe domenii.

În industrie, IIoT deține un mare potențial pentru controlul calității, practici durabile și ecologice,
trasabilitatea lanțului de aprovizionare și eficiența lanțului de aprovizionare general.

Într-un cadru industrial, IIoT este cheia proceselor cum ar fi întreținerea predictivă (PdM), serviciile de
teren îmbunătățite, gestionarea energiei și urmărirea activelor.

IIoT este o rețea de dispozitive conectate prin intermediul tehnologiilor de comunicații pentru a forma
sisteme care monitorizează, colectează, schimbă și analizează date, oferind informații valoroase care
permit companiilor industriale să ia mai rapid decizii de afaceri mai inteligente.
RS232

Recommended Standard 232 sau RS232 – standard utilizat in telecomunicatii pentru transmisia
seriala a datelor (discutie serial vs paralel).

Defineste caracteristicile electrice si de temporizare ale semnalelor, modul de interpretare al


acestora dar si tipurile de conectori standard utilizate.

Foarte des intalnit intr-un numar foarte mare de echipamente (exemple).


RS232

In cel mai simplu sens, pentru conectarea cu acest standard sunt necesare minim doua conexiuni GND si
fie RX sau TX (receive sau transmit) dar deoarece standardul poate functiona in modul full duplex cele
doua conexiuni RX si TX pot fi prezente concomitent.
In cazul Python, cea mai simpla modalitate de accesare a acestui port este prin intermediul modulului
PySerial.
RS232

Dupa cum se poate observa, utilizarea presupune instanterea unui obiect din clasa Serial. In codul
reprezentat anterior este specificat doar numele portului accesat dar configurarea initiala poate face
referire la rata de transfer (9600, 19200, 57600, 115200 etc), bytesize, paritate, timeout. Portul este
deschis automat la crearea obiectului. Numele portului depinde de platforma pe care este utilizat (COMn
pentru platforme Windows sau dev/ttyX pentru Linux).

Citirea datelor se face prin intermediul metodelor read() sau readline(). Prima permite citirea numarului
de biti specificat drept parametru iar a doua citirea unui rand intreg – semnalat prin intalnirea \n.

In mod implicit, in absenta unui parametru write_timeout setat instructiunea write este blocking. Pentru
citire, instructiunea read blocheaza rularea programului pana la expirarea timeout-ului setat. Daca acesta
are valoarea None va astepta pana la primirea unui mesaj. Daca timeout-ul este setat la 0 va intoarce
continutul actual al bufferului.
RS232

Inchiderea portului se face cu ajutorul metodei close() a obiectului generat.

In exemplul simplu de mai jos este initializat portul serial COM3, cu o frecventa de 9600 si un timeout
pentru citire de 3 secunde sub denumirea de ser.

Programul functioneaza in conditiile conectarii cu un microcontroller real pe portul RS232 (USB FTDI) al
unui computer Windows. Acest microcontroller transmite mesajul “RS232” la primirea oricarui mesaj pe
portul serial. In cazul nostru vom transmite mesajul “Go!” apoi vom citi si afisa raspunsul.
RS232

Dupa cum se poate observa, citirea se face in doua etape: intai cu metoda read(), urmata de metoda
readline(). Rezultatul prezentat demonstreaza faptul ca metoda read() va afisa orice schimbare a bufferului
iar readline va astepta aparitia unui caracter special de final de linie.
RS232

Daca spre exemplu se doreste transmiterea datelor dintr-un fisier csv prin portul serial, este necesara doar
o mica modificare:
TCP

TCP (Transmission Control Protocol) este un standard care defineste felul in care se initializeaza si se
mentine o conexiune intr-un mediu de retea, conexiune prin intermediul careia programele pot face
schimb de date. Standardul TCP functioneaza impreuna cu standardul IP care defineste felul in care se
transmit pachetele de date intre echipamente conectate.

Protocoalele modelului TCP / IP funcționează independent de hardware și software sunt standardizate


pentru a funcționa indiferent de sistemul de operare si sunt aliniate straturilor 3 și 4 ale modelului OSI
responsabile pentru conectarea a două dispozitive într-o rețea. De exemplu, adresa IP este utilizata pentru
a identifica si trimite pachete de date unui destinatar iar TCP este responsabil pentru stabilirea unei
conexiuni între cele două dispozitive și menținerea conexiunii pentru transmiterea datelor.
TCP

O adresă de protocol Internet (adresa IP) este o etichetă numerică atribuită fiecărui dispozitiv conectat
la o rețea de calculatoare care utilizează protocolul de Internet pentru comunicații. O adresă IP servește
două funcții principale: identificarea interfeței gazdă sau a rețelei și adresarea locației.

Protocolul de Internet versiunea 4 (IPv4) definește o adresă IP ca număr de 32 de biți. Cu toate


acestea, din cauza creșterii numarului de dispozitive conectate la Internet și a epuizării adreselor IPv4
disponibile, o nouă versiune de IP (IPv6), utilizând 128 de biți pentru adresa IP, a fost dezvoltată în 1995
și standardizată în decembrie 1998. În iulie 2017, a fost publicată o definiție definitivă a protocolului.
Implementarea IPv6 continuă de la mijlocul anilor 2000.
TCP

Straturilor din modelul TCP / IP li se atribuie diverse sarcini și, prin urmare, protocoale.

Stratul de acces la rețea: acest strat este inclus în modelul de referință, dar nu este definit un protocol specific. În
practică, protocoalele Ethernet (cu fir) și IEEE 802.11 (fără fir) sunt utilizate în principal. Stratul de acces la rețea este
utilizat pentru a lega diferite subrețele pentru aplicații precum conectarea unei rețele Wi-Fi de acasă la Internet printr-
un router.

Strat Internet: Protocolul Internet funcționează pe acest strat și asigură că datele transmise ajung la destinația
corectă. Pachetele de date sunt direcționate prin rețea prin adresa IP.

Stratul de transport: TCP este utilizat pentru transport în modelul de referință. Protocolul permite comunicarea de
la un capăt la altul, ceea ce înseamnă că este responsabil pentru conexiunea dintre două dispozitive. Împreună cu TCP,
UDP face parte, de asemenea, din acest strat.

Stratul aplicației: stratul superior controlează comunicarea între aplicații din rețea. Protocoale precum HTTP și
FTP sunt cruciale pentru stratul de aplicație. Protocoalele de comunicare prin e-mail (cum ar fi POP sau SMTP)
funcționează și pe acest strat.
TCP

Adresele IP sunt împărțite în două părți:


- numărul de rețea din biții de înaltă ordine
- biții rămași sunt identificatorul de gazdă utilizat pentru numerotarea de dispozitive în cadrul unei
rețele
TCP
TCP

Porturi TCP
TCP

In Python, una dintre modalitatile de implementare a unei conexiuni este prin intermediul modulului
socket. Acesta vine insotit de metode specifice conectarii si transmiterii de date prin intermediul
protocolului TCP, cum ar fi:
TCP

Un exemplu simplu de server TCP necesita parcurgerea urmatorilor pasi:


TCP

Un exemplu simplu de server TCP necesita parcurgerea urmatorilor pasi:


TCP

Un exemplu simplu de client TCP necesita parcurgerea urmatorilor pasi:


RS232 + TCP
DATA VIITOARE:
PROGRAMAREA INTERFETELOR
PENTRU INSTRUMENTATIE VIRTUALA

Curs 7 – Anul III – Mecatronica si Robotica


NOTARE

- 50p pe parcurs, din care:


- 20 puncte laborator – toate laboratoarele sunt obligatorii
- 20 puncte proiect – toate sedintele sunt obligatorii. Predarea se face la ultima sedinta de proiect,
prin platforma Moodle, se noteaza in ultima saptamana
- 10 puncte prezenta curs – 1 punct / prezenta

- 50p examen final:


- 25p partial 1 – saptamana 7 (discutabil)
- 25p partial 2 (in sesiune)
*nota finala la examen trebuie sa fie >=25p
*prezenta la toate activitatile este obligatorie
**prezenta la toate activitatile nu este neaparat obligatorie
CUPRINS

1. Introducere
2. Concepte generale
3. Programare orientata obiect 1
4. Programare orientata obiect 2
5. Programare orientata obiect 3
6. Module de baza
7. Partial (Nu, evident)
8. Comunicatii (RS232 si TCP)
9. Fire de executie
10. Matplotlib, NumPy/SciPy
11. Baze de date
12. Interfete grafice
13. Exemple de aplicatii pentru mecatronica
14. Exemple de aplicatii pentru mecatronica
*) structura cursului poate varia in functie de necesitatile aparute pe durata semestrului
AZI:

Fire de executie

Threading

Queue
Multiprocessing
THREADING

Rularea unor fire de executie separate prin intermediul modulului Threading permite cresterea vitezei de
lucru a unei aplicatii precum si simplificarea designului acesteia. Trebuie mentionat insa ca acest modul
este util doar in cazul in care programul este compus din operatiuni care pot beneficia din lucrul in paralel
dar care nu cer un volum mare de putere de calcul: rularea in paralel se va face doar aparent. Solutia
pentru aceasta problema se poate gasi insa in modulul multiprocessing, discutat intr-un alt capitol.
THREADING

In diagrama din figura se poate observa ca in mod obligatoriu procesul va avea minim un fir de executie
principal. Acesta contine in namespace-ul sau variabilele globale care pot fi accesate de catre fiecare fir de
executie in parte.

In cadrul acestei lucrari vor fi discutate doua metode de lansare a firelor de executie: prin apelarea si
rularea unei functii in cadrul unui fir de executie si prin rularea unei clase in cadrul unui fir de executie.
THREADING – METODA 1 - FUNCTII

In cazul Threading, este posibila pornirea a unul, doua sau mai multe fire de executie paralele.
Lansarea unui noi fir de executie se face prin utilizarea comenzii:

Unde fir1 este numele firului de executie, target este functia tinta, cea care va rula in thread-ul respectiv
iar args reprezinta argumentele transmise catre functia tinta. Pornirea efectiva a firului se face prin
intermediul metodei start().
THREADING – METODA 1 - FUNCTII

In acest exemplu vor rula doua fire


de executie in paralel: fir1 si fir2,
fiecare cu un numarator de la 5,
respectiv 10 pana la 0 secunde.
THREADING – METODA 1 - FUNCTII

Se poate observa ca initial cele doua fire de executie


ruleaza in paralel iar dupa incheierea firului 1 (5 secunde),
firul 2 continua rularea. De asemenea, este important de
observat ca firul 2 pare sa intrerupa functionarea firului 1
(output intercalat).

Aceasta trateaza felul in care aceste fire functioneaza cu


adevarat: desi in aparenta vor lucra in paralel, mecanismul
utilizat, denumit GIL (Global Interpreter Lock) permite

utilizarea interpretorului Python de catre un singur fir de


executie in acelasi timp. Se ajunge astfel la ideea ca threading-
ul este potrivit pentru utilizare doar in cazurile in care
mecanismul GIL nu va afecta in mod negativ rularea
aplicatiei.
THREADING – METODA 1 - FUNCTII

In cazul in care se doreste ca un fir sa astepte ca un alt fir sa incheie se poate utiliza metoda join(). Aceasta poate fi
adaugata in programul nostru de mai devreme, caz in care thread-ul main se va incheia doar dupa ce firele 1 si 2 au rulat
complet:
THREADING – METODA 1 - FUNCTII

Exemplu:

In programul urmator
vom studia comportamentul
firelor de executie in mai
multe situatii: se cere
instantierea unui server care
sa accepte conexiuni pe
portul TCP 9999, cu un
timeout de 10 de secunde. In
paralel cu acesta vom rula o
numaratoare inversa de 10
secunde.
THREADING – METODA 1 - FUNCTII

Rezultat

Se poate observa ca
thread-ul TCP se incheie
datorita expirarii timeout-
ului fara o conexiune activa.
THREADING – METODA 1 - FUNCTII

Output mai simplu:


THREADING – METODA 1 - FUNCTII

Lansare fire multiple din o singura functie:


THREADING – METODA I1 - CLASE

Aceasta metoda are acelasi efect dar permite instantierea si utilizarea unor obiecte ale unei clase in cadrul unor fire de
executie separate. In acest caz, utilizarea threading se face prin mostenirea clasei threading.Thread si suprascrierea
metodei run() a acesteia:

Pornirea firului de executie se face prin utilizarea metodei start(), la fel ca la in varianta anterioara. Utilizarea run() ca
atare va conduce la apelarea metodei fara lansarea unui fir de executie separat.
THREADING – METODA I1 - CLASE

Un exemplu de astfel de program, in care doua contoare numara pana la 100 concomitent este:
THREADING – METODA I1 - CLASE

Exemplu: Primire datelor prin portul RS232 si transmiterea acestora prin TCP la o alta masina.

In acest exemplu vom rula trei fire de executie, dupa cum urmeaza:

- Un thread responsabil pentru monitorizarea celorlalte

- Un thread care va transmite date prin TCP

- Un thread se va conecta la dispozitivul prezent pe portul COM3 al unui calculator si receptiona date.

Primul dintre firele de executie va utiliza threading.enumerate() pentru a stoca thread-urile intr-o lista in vederea
listarii acestora. Procesul se va repeta o data la 5 secunde.
THREADING – METODA I1 - CLASE

Primul dintre firele de executie va utiliza threading.enumerate() pentru a stoca thread-urile intr-o lista in vederea
listarii acestora. Procesul se va repeta o data la 5 secunde.
THREADING – METODA I1 - CLASE

Cel de-ai doilea fir de executie va permite conectarea la un server TCP in vederea transmiterii unor date.
THREADING – METODA I1 - CLASE

Al treilea fir de executie va permite conectarea la un port RS232 (COM3) cu o rata de transfer de 9600 si un timeout
de 3 secunde.
THREADING – METODA I1 - CLASE

Pornirea celor trei fire de executie se face prin instanterea unui obiect din fiecare clasa si apelarea metodei start()
pentru fiecare dintre cele trei obiecte. Pentru comoditate, a fost specificat si numele firelor de executie lansate. De
asemenea, toate thread-urile au fost setate drept fire de executie daemon.
THREADING – METODA I1 - CLASE

Output:

Comunicare intre fire de executie?


THREADING – QUEUE

Modulul Queue permite implementarea unei cozi FIFO (First In First Out) utila in cazul programarii cu fire de
executie, in contexul administrarii automate a mecanismelor de blocare a resurselor (vezi GIL). Dupa instantierea unui
obiect Queue, se poate scrie in aceasta coada prin intermediul metodei put() si se pot extrage valori prin intermediul get().
Este important ca la citire sa se utilizeze in prealabil empty() care intoarce True daca coada este goala.

Module utilizate:
THREADING – QUEUE

Partea I:
THREADING – QUEUE

Partea II:
THREADING – QUEUE
PROGRAMAREA INTERFETELOR
PENTRU INSTRUMENTATIE VIRTUALA

Curs 8 – Anul III – Mecatronica si Robotica


NOTARE

- 50p pe parcurs, din care:


- 20 puncte laborator – toate laboratoarele sunt obligatorii
- 20 puncte proiect – toate sedintele sunt obligatorii. Predarea se face la ultima sedinta de proiect,
prin platforma Moodle, se noteaza in ultima saptamana
- 10 puncte prezenta curs – 1 punct / prezenta

- 50p examen final:


- 25p partial 1 – saptamana 7 (discutabil)
- 25p partial 2 (in sesiune)
*nota finala la examen trebuie sa fie >=25p
*prezenta la toate activitatile este obligatorie
**prezenta la toate activitatile nu este neaparat obligatorie
CUPRINS

1. Introducere
2. Concepte generale
3. Programare orientata obiect 1
4. Programare orientata obiect 2
5. Programare orientata obiect 3
6. Module de baza
7. Partial (Nu, evident)
8. Comunicatii (RS232 si TCP)
9. Fire de executie
10. Matplotlib, NumPy/SciPy
11. Baze de date
12. Interfete grafice
13. Exemple de aplicatii pentru mecatronica
14. Exemple de aplicatii pentru mecatronica
*) structura cursului poate varia in functie de necesitatile aparute pe durata semestrului
AZI:

Utilizarea DB

Connector DB

Exemplu utilizare DB

Interfete grafice
UTILIZAREA DB

O baza de date este o colecție de date sau informații organizată pentru căutare rapidă și recuperare a
datelor. Bazele de date sunt structurate pentru a facilita stocarea, recuperarea, modificarea și ștergerea
datelor împreună cu diverse operațiuni de prelucrare a datelor.

In cazul Python, una dintre metodele de interactionare cele mai raspandite care permit interactionarea
cu o astfel de baza de date este prin utilizarea unui driver: mysql-connector-python. Este necesara
instalarea acestuia prin comanda pip install mysql-connector-python pentru rularea exemplelor din acest
capitol.

Pentru utilizarea acestui modul este necesara cunoasterea minimala a unora dintre comenzile specifice
SQL, dupa cum urmeaza:
UTILIZAREA DB
UTILIZAREA DB

Pentru generarea unei baze de date prin intermediul Python si MySQL este necesara parcurgerea
urmatorilor pasi:

- Crearea unei conexiuni:

- Executarea unui query pentru generarea bazei de date:


UTILIZAREA DB

In portiunea de cod prezentata anterior se utilizeaza metoda connect() cu parametrii host, user si
password. Aceasta permite conectarea la un server SQL in vederea generarii unei baze de date. Aceasta se
realizeaza prin instantierea unui cursor prin mydb.cursor() si apoi utiliziarea metodei execute() a acestuia.
Metoda permite scrierea unei comenzi MySQL, asa cum ar fi ea scrisa in mod normal.
UTILIZAREA DB

Dupa crearea bazei de date va fi necesarea generarea unui tabel. Pentru aceasta vom folosi codul
prezentat anterior dar vom modifica instructiunea SQL. Rezultatul este:
UTILIZAREA DB

Se poate observa stocarea comenzii in variabila string_query. Aceasta modalitate de utilizare si marcarea
cu “”” permite scrierea pe mai multe randuri a unor instructiuni lungi.

Prin aceasta metoda poate fi transmisa catre baza de date orice tip de interogare: adaugarea unui tabel,
a unei coloane, a unui set de date, stergerea sau modificarea datelor, etc.

In cazul in care se doreste scrierea unui volum mare de date in baza de date (citiri senzori, date
obtinute in urma unor prelucrari matematice, etc), este de preferat utilizarea metodei executemany() mai
degraba decat apelarea succesiva a unui numar mare de instruciuni. Acesta permite interogarea bazei de
date cu ajutorul a doi parametri: instructiunea SQL si lista care va contine seturi de date care pot fi
aplicate instructiunii de mai devreme.
UTILIZAREA DB

Spre exemplu, in programul urmator, dupa generarea unei baze de date si generarea unui tabel sunt
stocate in acesta datele continute intr-un fisier CSV.
GUI - PYQT

Se va utiliza libraria PyQt, bazata pe Qt, un set de librarii si unelte de dezvoltare C++ independente de
platforma utilizata si care contine inclusiv componente de networking, fire de executie, baze de date SQL,
etc.

Instalarea modulului se face prin intermediul comenzii pip install pyqt5


GUI - PYQT

Un prim exemplu simplu de utilizare:

1. Import QApplication si a widget-urilor necesare

2. Instantierea Qapplication

3. Instantierea interfetei grafice


GUI - PYQT

4. Afisarea interefetei grafice

5. Rularea aplicatiei
GUI - PYQT

Pentru aplicatii mai complicate este necesara utilizarea mai multor concepte, printre care:

A) Widgets – clasa in care sunt incluse toate obiectele de baza pentru interactiunea cu utilizatorul, cum ar
fi butoane, etichete, casete text, butoane radio, etc. Acestea au atasate metode si atribute care pot ajuta
la configurarea aspectului si comportamentului acestora.
B) Layout managers – clase care permit modificarea dinamica a pozitionarii widgets-urilor in functie de
necesitati. Fara utilizarea acestora este necesara determinarea manuala a pozitiei si dimensiunii
fiecarui element grafic in parte.
C) Dialog – necesara pentru generarea ferestrelor de dialog de aplicatii. Poate fi mostenita din
QmainWindow sau Qdialog, cu rezultate diferite.
D) Ferestre principale
E) Aplicatii
F) Evenimente
G) Semnale si sloturi
GUI - PYQT

Pentru a explica functionarea elementelor listate mai sus vom crea o interfata grafica pentru
introducerea datelor legate de echipamentele dintr-un laborator de mecatronica si stocarea acestora sub
forma unui fisier CSV.

Vom incepe prin adaugarea a trei butoane organizate orizontal: Adauga echipament, Vezi echipamente
si Sterge echipamente. Pentru a le organiza orizontal vom folosi layout mangerul HboxLayout –
instantiem layout din aceasta clasa, apoi adaugam widget-urile pentru cele trei butoane la acest layout.
GUI - PYQT

Daca se dorea asezarea pe verticala a celor trei butoane, se putea folosi QVBoxLayout
GUI - PYQT

PyQt pemite si organizarea acestor butoane intr-o matrice, prin utilizarea QGridLayout. Rularea codului de mai jos,
dupa importul QGridLayout va intoarce rezultatul din figura Z. Valorile de dupa eticheta widgetului reprezinta
coordonatele (x,y) ale butoanelor in interfata generata.
GUI - PYQT

Dialog - ferestre care contin widget-uri si permit efectuarea unor operatiuni dar nu au meniuri fixe.
GUI - PYQT

Declararea randurilor din formular se face prin intermediul QLineEdit() iar accesarea datelor introduse de catre
utilizator se face prin utilizare metodei .text() .Stergerea datelor din campul de introducere se face prin apelarea metodei
.clear().
GUI - PYQT

Metodele de mai jos sunt apelate la apasarea butoanelor si permit salvarea in fisier .csv a datelor introduse si
vizualizarea datelor. Modulele utilizate pentru scrierea acestor metode au fost descrise intr-un capitol anterior.
GUI - PYQT

Main window – permite generarea unei ferestre principale prin mostenirea clasei QmainWindow. Aceasta permite
adaugarea unui toolbar, meniu si a altor widget-uri. Clasa Window mosteneste QmainWindow si implementeaza trei
metode (createMenu, createToolBar si creatStatusBar) pentru generarea elementelor din fereastra principala.

Metoda openDialog instantiaza un obiect al clasei Dialog descrisa la punctul anterior. Metoda openDialog va dechide
fereastra modala descrisa anterior la apasarea butonului ‘Meniu echipamente’.
GUI - PYQT

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