Tango Controls

Tango Controls

Što je TANGO?

To je sustav za upravljanje raznim uređajima i softverom.
TANGO trenutno podržava 4 platforme: Linux, Windows NT, Solaris i HP-UX.
Ovdje će biti opisano kako raditi s Linuxom (Ubuntu 18.04)

Zašto je potrebno?

Olakšava rad s raznim uređajima i softverom.

  • Nije potrebno razmišljati o tome kako pohraniti podatke u bazi podataka, to je već učinjeno za vas.
  • Samo je potrebno opisati mehanizam ispitivanja senzora.
  • Svodi sav vaš kod na jedan standard.

Gdje pronaći?

Nisam je mogao pokrenuti iz izvora, za rad sam koristio gotovu sliku TangoBox 9.3.
U uputstvu je opisano kako instalirati iz paketa.

Od čega se sastoji?

  • JIVE — služi za pregled i uređivanje baze podataka TANGO.
  • POGO — generator koda za TANGO uređaje.
  • Astor — softverski upravitelj za sustav TANGO.

Interesirat će nas samo prva dva komponente.

Podržani programski jezici

  • C
  • C++
  • Java
  • JavaScript
  • Python
  • Matlab
  • LabVIEW

Radio sam s njom na pythonu i c++. Ovdje će se kao primjer koristiti c++.

Sada ćemo preći na opis kako povezati uređaj s TANGO i kako s njim raditi. Kao primjer uzet ćemo ploču GPS neo-6m-0-001:

Tango Controls

Kao što se vidi na slici, ploču povezujemo s računalom putem UART CP2102. Pri povezivanju s računalom pojavljuje se uređaj /dev/ttyUSB[0-N], obično /dev/ttyUSB0.

POGO

Sada pokrenimo pogo, i generiramo kostur koda za rad s našom pločom.

pogo

Tango Controls

Već sam imao kreiran kod, stvorit ćemo ga iznova. Datoteka->Nova.

Tango Controls

Dobivamo sljedeće:

Tango Controls

Naš uređaj (pod uređajem će se ubuduće smatrati softverski dio) je prazan i ima dvije naredbe za upravljanje: Stanje & Status.

Moraju se popuniti potrebnim atributima:

Atribut uređaja — zadane vrijednosti koje šaljemo uređaju za njegovu inicijalizaciju, za GPS ploču treba proslijediti naziv ploče u sustavu com="/dev/ttyUSB0" i brzinu com porta baudrate=9600

Naredbe — naredbe za upravljanje našim uređajem, mogu se dodati argumenti i vraćene vrijednosti.

  • STANJE — vraća trenutno stanje, iz Stanja
  • STATUS — vraća trenutni status, ovo je niz koji se dodaje STANJE
  • GPSArray — vraća gps niz u obliku DevVarCharArray

Nakon toga definiraju se atributi uređaja koje je moguće čitati/pisati u/iz njega.
Skalarni atributi — jednostavni atributi (char, string, long itd.)
Spektralni atributi — jednodimenzionalne nizove
Svojstva slike — dvodimenzionalne nizove

Stanja — stanja u kojem se naš uređaj nalazi.

  • OTVORENO — uređaj je otvoren.
  • ZATVORENO — uređaj je zatvoren.
  • FAILT — greška.
  • ON — primamo podatke s uređaja.
  • OFF — nema podataka s uređaja.

Primjer dodavanja atributa gps_string:

Tango Controls

Period ispitivanja vrijeme u ms, koliko često će se ažurirati vrijednost gps_string. Ako se vrijeme ažuriranja ne postavi, atribut će se ažurirati samo na zahtjev.

Ispalo je:

Tango Controls

Sada je potrebno generirati kod File->Generate

Tango Controls

Zadano, Makefile se ne generira, prilikom prvog puta potrebno je staviti kvačicu da bi ga stvorili. Ovo je učinjeno kako bi unosi u njemu ostali netaknuti prilikom nove generacije. Kada ga jednom stvorite i prilagodite svom projektu (napisati kompajlerske ključeve, dodatne datoteke) možete zaboraviti na njega.

Sada prelazimo na samo programiranje. pogo nam je generirao sljedeće:

Tango Controls

Zanimat će nas NEO6M.cpp & NEO6M.h. Razmotrit ćemo za primjer konstruktor klase:

NEO6M::NEO6M(Tango::DeviceClass *cl, string &s)
 : TANGO_BASE_CLASS(cl, s.c_str())
{
    /*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
    init_device();

    /*----- PROTECTED REGION END -----*/    //  NEO6M::constructor_1
}

Što ovdje ima i što je ovdje važno? U funkciji init_device() odvija se alokacija memorije za naše atribute: gps_string & gps_array, ali to nije bitno. Najvažnije ovdje, su komentari:

/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
    .......
/*----- PROTECTED REGION END -----*/    //  NEO6M::constructor_1

Sve što se nalazi unutar ovog komentarskog bloka prilikom sljedećih regeneracija koda u pogo neće biti izbrisano!. Sve što nije u blokovima hoće! To su mjesta gdje možemo programirati i unositi svoje izmjene.

Sada, koje glavne funkcije sadrži klasa NEO6M:

void always_executed_hook();
void read_attr_hardware(vector &attr_list);
void read_gps_string(Tango::Attribute &attr);
void read_gps_array(Tango::Attribute &attr);

Kada želimo pročitati vrijednost atributa gps_string, bit će pozvane funkcije u sljedećem redoslijedu: always_executed_hook, read_attr_hardware i read_gps_string. U read_gps_string će se popuniti gps_string vrijednošću.

void NEO6M::read_gps_string(Tango::Attribute &attr)
{
    DEBUG_STREAM << "NEO6M::read_gps_string(Tango::Attribute &attr) ulazi... " <attr_gps_string_read = Tango::string_dup(this->gps.c_str());

    attr.set_value(attr_gps_string_read);

    /*----- PROTECTED REGION END -----*/    //  NEO6M::read_gps_string
}

Komplikacija

Ulazimo u mapu s izvorima i:

make

Program će se kompajlirati u mapu ~/DeviceServers.

tango-cs@tangobox:~/DeviceServers$ ls
NEO6M

JIVE

jive

Tango Controls

U Bazi podataka već postoje neki uređaji, sada ćemo stvoriti naš Edit->Create Server

Tango Controls

Sada ćemo pokušati spojiti s njom:

Tango Controls

Ništa neće uspjeti, prvo moramo pokrenuti naš program:

sudo ./NEO6M neo6m -v2

Možemo se povezati s com portom samo s pravima root-a. v — razina logiranja.

Sada se možemo povezati:

Tango Controls

Klijent

Gledati slike u grafu je naravno dobro, ali treba nam nešto korisnije. Napisat ćemo klijenta koji će se povezivati s našim uređajem i uzimati njegove podatke.

#include <tango.h>
using namespace Tango;

int main(int argc, char **argv) {
    try {

        //
        // create a connection to a TANGO device
        //

        DeviceProxy *device = new DeviceProxy("NEO6M/neo6m/1");

        //
        // Ping the device
        //

        device->ping();

        //
        // Execute a command on the device and extract the reply as a string
        //

        vector<Tango::DevUChar> gps_array;

        DeviceData cmd_reply;
        cmd_reply = device->command_inout("GPSArray");
        cmd_reply >> gps_array;

        for (int i = 0; i < gps_array.size(); i++) {            
            printf("%c", gps_array[i]);
        }
        puts("");

        //
        // Read a device attribute (string data type)
        //

        string spr;
        DeviceAttribute att_reply;
        att_reply = device->read_attribute("gps_string");
        att_reply >> spr;
        cout << spr << endl;

        vector<Tango::DevUChar> spr2;
        DeviceAttribute att_reply2;
        att_reply2 = device->read_attribute("gps_array");
        att_reply2.extract_read(spr2);

        for (int i = 0; i < spr2.size(); i++) {
            printf("%c", spr2[i]);
        }

        puts("");

    } catch (DevFailed &e) {
        Except::print_exception(e);
        exit(-1);
    }
}

Kako kompilirati:

g++ gps.cpp -I/usr/local/include/tango -I/usr/local/include -I/usr/local/include -std=c++0x -Dlinux -L/usr/local/lib -ltango -lomniDynamic4 -lCOS4 -lomniORB4 -lomnithread -llog4tango -lzmq -ldl -lpthread -lstdc++

Rezultat:

tango-cs@tangobox:~/workspace/c$ ./a.out
$GPRMC,,V,,,,,,,,,,N*53

$GPRMC,,V,,,,,,,,,,N*53

$GPRMC,,V,,,,,,,,,,N*53

Dobiveni rezultat u obliku povratne komande, uzimanje atributa niza i niza znakova.

Linkovi

Članak sam pisao za sebe, jer nakon nekog vremena počinjem zaboravljati kako i što raditi.

Hvala na pažnji.

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster