Documente Academic
Documente Profesional
Documente Cultură
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
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
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’.
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])
Este o colectie de variabile, fara conditie de unicitate cu sintaxa tuplu=(var1, var2, var3, etc). Astfel:
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.
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
Termenul face referire la cat de sigure sau mai degraba cat de potrivite sunt datele pentru ciclare. In
speta, se pot identifica:
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
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
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.
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:
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
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:
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:
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.
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:
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.
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
- O prima metoda denumita “deplasare”, responsabila pentru deplasarea robotului. Metoda va intoarce deocamdata doar
un mesaj potrivit
Cerinte:
1. Instantiati un obiect denumit robOne din clasa definita. Printati variabilele clasei.
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.
Cerinte:
1. Constructorul va avea un singur parametru de intrare: tip_deplasare si va afisa un mesaj “Robot instantat”
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
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:
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.
nume_modul – poate fi numele fisierului in care au fost salvate metodele/clasele vizate sau
numele unui pachet de module/modul instalat.
MODULE
2 1
3
MODULE
2
1
3
MODULE
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
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:
- 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:
Citire:
EXEMPLE MODULE – I1.FISIERE
Scriere:
EXEMPLE MODULE – I1I.TIPURI DE FISIERE
- 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) .
***Discutie encoding
EXEMPLE MODULE – I1I.TIPURI DE FISIERE
- XML
Extensible Markup Language
- JSON
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).
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:
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).
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
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.
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.
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
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
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 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
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 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:
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
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:
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.
2. Instantierea Qapplication
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