Tango Controls

Tango Controls

Mi az TANGO?

Ez egy rendszer különböző berendezések és szoftverek kezelésére.
A TANGO jelenleg 4 platformot támogat: Linux, Windows NT, Solaris és HP-UX.
Itt a Linux (Ubuntu 18.04) használatát írjuk le.

Mire van szükség?

Megkönnyíti a különböző berendezésekkel és szoftverekkel való munkát.

  • Nem kell gondolkodnia, hogyan tárolja az adatokat az adatbázisban, ezt már elvégeztük Ön helyett.
  • Csak a szenzorok lekérdezésének mechanizmusát kell leírni.
  • Minden kódját egy egységes szabványra redukálja.

Hol szerezhető be?

Nem tudtam életre kelteni az forráskódot, a munkához a kész TangoBox 9.3 képet használtam.
A használati útmutató leírja, hogyan kell telepíteni csomagokból.

Miből áll?

  • JIVE — a TANGO adatbázis megtekintésére és szerkesztésére szolgál.
  • POGO — a TANGO eszközszerverekhez készült kódgenerátor.
  • Az első két komponens érdekel minket. Támogatott programozási nyelvek

Matlab

LabVIEW

  • C
  • C++
  • Java
  • JavaScript
  • Python
  • Én Python-nal és C++-sal dolgoztam vele. Itt példaként C++-t fogunk használni.
  • Most térjünk át arra, hogyan kell csatlakoztatni az eszközt a TANGO-hoz és hogyan lehet vele dolgozni. Példaként a következő lapkát vesszük:

GPS neo-6m-0-001

Ahogy a képen látható, a lapkát a PC-hez UART CP2102-n keresztül csatlakoztatjuk. Amikor csatlakoztatjuk a PC-hez, akkor a következő eszköz jelenik meg , általában /dev/ttyUSB0.:

Tango Controls

pogo /dev/ttyUSB[0-N], és generálunk egy alap kodot a lapkával való munkához.

POGO

Most indítsuk el. Már létrehoztam egy kódot, most újra létrehozzuk.File->New

Már létrehoztam egy kódot, most újra létrehozzuk.

Tango Controls

A mi eszközünk (itt az eszköz szoftveres részére utalunk) üres, és két vezérlési parancsát tartalmazza: State.

Tango Controls

A következőt kapjuk:

Tango Controls

Ki kell tölteni a szükséges attribútumokkal: Device Property & Állapot.

— az alapértelmezett értékek, amelyeket az eszköznek az inicializáláshoz átadunk, a GPS lapkához a következő értéket kell átadni a rendszerben:

com="/dev/ttyUSB0" és a com port sebességét baudrade=9600 Commands — az eszközünkkel kapcsolatos vezérlési parancsok, amelyekhez argumentumokat és visszatérési értékeket rendelhetünk.

STATE — a jelenlegi állapotot adja vissza, a

  • States — a jelenlegi státuszt adja vissza, ez egy szöveges kiegészítés a GPSArray
  • STATUS — visszaadja States
  • gps a következő formátumban: DevVarCharArray Ezután meg kell határoznunk az eszköz attribútumait, amelyeket olvasni/írni lehet belőle. Scalar Attributes

— egyszerű attribútumok (char, string, long stb.)
Spectrum Attributes — egy dimenziós tömbök
Image Attributes — két dimenziós tömbök
— az állapot, amelyben az eszközünk van. OPEN

GPSArray — az eszköz nyitva van.

  • CLOSE — az eszköz zárva van.
  • FAILT — hiba.
  • ON ON
  • ON — az eszközről származó adatokat fogadunk.
  • OFF — nincs adat az eszközről.

Attribútum hozzáadásának példája gps_string:

Tango Controls

Polling időszak ms-ben kifejezett idő, hogy milyen gyakran frissüljön a gps_string értéke. Ha a frissítési időt nem adunk meg, akkor az attribútum csak kérésre frissül.

Sikerült:

Tango Controls

Most kódot kell generálnunk File->Generate

Tango Controls

Alapértelmezés szerint a Makefile nem generálódik, először pipa kell, hogy létrehozzuk. Ezt azért tettük, hogy az abban végzett módosítások ne vesznek el az újabb generálás során. Miután egyszer létrehoztuk és beállítottuk a projektünknek megfelelően (fordítási kulcsok, további fájlok megadása), elfelejthetjük azt.

Most térjünk rá a programozásra. A pogo a következőket generálta nekünk:

Tango Controls

A NEO6M.cpp & NEO6M.h fájlok érdekelnek minket. Nézzük meg például a osztály konstruktorát:

NEO6M::NEO6M(Tango::DeviceClass *cl, string &s)
 : TANGO_BASE_CLASS(cl, s.c_str())
{
    
    init_device();

    
}

Mi van itt és mi a lényeg? Az init_device() függvényben memóriát foglalunk az attribútumaink számára: gps_string & gps_array, de ez nem fontos. A legfontosabb dolog itt, ezek a megjegyzések:

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

Minden, ami ebben a megjegyzés blokkban található, a kód későbbi újragenerálásakor a pogo-ban nem fog eltűnni!. Minden, ami nem blokkban van, eltűnik! Ezek azok a helyek, ahol programozhatunk és végezhetjük el a módosításainkat.

Most nézzük meg, hogy milyen főbb funkciókat tartalmaz a 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);

Amikor szeretnénk elolvasni az attribútum értékét, akkor a következő sorrendben hívódnak meg a funkciók: gps_stringalways_executed_hook read_attr_hardware, read_gps_string és . A read_gps_string során a gps_string értéke kitöltődik.void NEO6M::read_gps_string(Tango::Attribute &attr) { DEBUG_STREAM << "NEO6M::read_gps_string(Tango::Attribute &attr) entering... " <attr_gps_string_read = Tango::string_dup(this->gps.c_str());attr.set_value(attr_gps_string_read); }

Fordítás

Komplikáció

Lépjünk be a forráskód mappájába és:

make

A program a ~ /DeviceServers mappába lesz lefordítva.

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

JIVE

jive

Tango Controls

A DB-ben már vannak eszközök, most létrehozzuk a sajátunkat Edit->Create Server

Tango Controls

Most próbáljunk csatlakozni hozzá:

Tango Controls

Nem fog sikerülni, először el kell indítanunk a programunkat:

sudo ./NEO6M neo6m -v2

Csak jogokkal tudok csatlakozni a com portra , felhasználó nevében fut, mivel alapvető rendszerbeállításokat módosítanak, de a WordPress közvetlenül egy normál felhasználóként működik.-a. v — a naplózási szint.

Most csatlakozhatunk:

Tango Controls

Ügyfél

A grafikonon nézni a képeket természetesen jó, de szükség van valami hasznosabbra. Írjunk egy klienst, amely csatlakozik az eszközünkhöz és begyűjti a méréseket.

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

Hogyan kell fordítani:

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++

Eredmény:

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

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

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

A parancs visszatérési értékeként kaptuk az attribútumok és karaktertömbök megszerzését.

Hivatkozások

A cikket magamnak írtam, mert idővel kezdem elfelejteni, hogy mit és hogyan kell csinálni.

Köszönöm a figyelmet.

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster