Tango Controls

Tango Controls

Milyen TANGO?

Ez egy rendszer különféle hardverek és szoftverek kezelésére.
A TANGO jelenleg 4 platformot támogat: Linux, Windows NT, Solaris és HP-UX.
Itt leírjuk, hogyan működik a Linux (Ubuntu 18.04)

Mire való?

Leegyszerűsíti a különféle berendezésekkel és szoftverekkel végzett munkát.

  • Nem kell azon gondolkodnia, hogyan tárolja az adatokat az adatbázisban, ez már megtörtént.
  • Csak a lekérdezési érzékelők mechanizmusát kell leírni.
  • Az összes kódot egyetlen szabványra redukálja.

Hol lehet kapni?

A forráskódból nem tudtam elindítani, a TangoBox 9.3 kész képét használtam a működéshez.
Az utasítások leírják, hogyan kell csomagokból telepíteni.

Miből áll?

  • DZSESSZMUZSIKA — a TANGO adatbázis megtekintéséhez és szerkesztéséhez használható.
  • POGO — kódgenerátor a TANGO eszközszerverekhez.
  • Astor — a TANGO rendszer programvezetője.

Minket csak az első két komponens érdekel.

Támogatott programozási nyelvek

  • C
  • C + +
  • Jáva
  • JavaScript
  • Piton
  • matlab
  • LabVIEW

Pythonban és c++-ban dolgoztam vele. Itt a C++ C++ lesz példaként.

Most térjünk át az eszköz TANGO-hoz való csatlakoztatásának és a vele való munkavégzés leírására. A díjat példaként vesszük GPS neo-6m-0-001:

Tango Controls

Amint a képen is látható, a kártyát UART CP2102-n keresztül csatlakoztatjuk a PC-hez. Ha számítógéphez csatlakozik, megjelenik az eszköz /dev/ttyUSB[0-N], általában /dev/ttyUSB0.

POGO

Most pedig indítsuk el PoGo, és generáljon vázkódot a táblánkkal való együttműködéshez.

pogo

Tango Controls

Már létrehoztam a kódot, hozzuk létre újra Fájl->Új.

Tango Controls

A következőket kapjuk:

Tango Controls

Eszközünk (a jövőben eszköz alatt a szoftverrészt fogjuk érteni) üres és két vezérlőparancsa van: Állami & Állapot.

Ki kell tölteni a szükséges attribútumokkal:

Eszköz tulajdonságai - alapértelmezett értékek, amelyeket átviszünk az eszközre az inicializáláshoz; a GPS kártyához át kell vinni a tábla nevét a rendszerbe com="/dev/ttyUSB0" és a com port sebességét baudrade=9600

Parancsok — parancsok az eszközünk vezérlésére, amelyek argumentumokat és visszatérési értéket kaphatnak.

  • ÁLLAPOT - visszaadja az aktuális állapotot, innen Államok
  • STATUS - az aktuális állapotot adja vissza, ez a karakterlánc kiegészítése ÁLLAPOT
  • GPSArray - visszatér gps karakterlánc a formában DevVarCharArray

Ezután állítsa be a rá/írható eszköz attribútumait.
Skaláris attribútumok - egyszerű attribútumok (karakter, string, long stb.)
Spektrum attribútumok - egydimenziós tömbök
Képtulajdonságok - kétdimenziós tömbök

Államok — az állapot, amelyben a készülékünk található.

  • NYISD KI — a készülék nyitva van.
  • CLOSE - a készülék zárva van.
  • HIBA - hiba.
  • ON — adatok fogadása a készülékről.
  • KI — nincs adat a készülékről.

Példa attribútum hozzáadására gps_string:

Tango Controls

Szavazási időszak idő ms-ban, milyen gyakran frissül a gps_string érték. Ha a frissítés időpontja nincs megadva, az attribútum csak kérésre frissül.

Történt:

Tango Controls

Most létre kell hoznia a kódot Fájl->Generálás

Tango Controls

Alapértelmezés szerint a Makefile nem jön létre; az első alkalommal be kell jelölnie a négyzetet a létrehozásához. Ez azért történik, hogy a rajta végrehajtott módosítások ne törlődnek az új generáció során. Miután egyszer létrehozta és konfigurálta a projekthez (regisztrálja a fordítási kulcsokat, további fájlokat), elfelejtheti.

Most pedig térjünk át a programozásra. A pogo with a következőket generálta számunkra:

Tango Controls

Érdeklődni fogunk a NEO6M.cpp és a NEO6M.h iránt. Vegyünk egy példát egy osztálykonstruktorra:

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
}

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

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

Minden, ami ebben a megjegyzésblokkban van, nem kerül bele a pogo-ba a későbbi kódregenerálások során elköltözni!. Minden, ami nincs blokkokban, az lesz! Ezek azok a helyek, ahol programozhatunk és elvégezhetjük saját szerkesztéseinket.

Most melyek az osztály főbb funkciói? NEO6M:

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

Amikor ki akarjuk olvasni az attribútum értékét gps_string, a függvények a következő sorrendben lesznek meghívva: mindig_végrehajtott_hook, read_attr_hardware и read_gps_string. A Read_gps_string kitölti a gps_string értéket.

void NEO6M::read_gps_string(Tango::Attribute &attr)
{
    DEBUG_STREAM << "NEO6M::read_gps_string(Tango::Attribute &attr) entering... " << endl;
    /*----- PROTECTED REGION ID(NEO6M::read_gps_string) ENABLED START -----*/
    //  Set the attribute value

        *this->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
}

Összeállítás

Lépjen a forrás mappába, és:

make

A program a ~/DeviceServers mappába kerül.

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

DZSESSZMUZSIKA

jive

Tango Controls

Már van néhány eszköz az adatbázisban, most hozzuk létre a miénket Szerkesztés->Szerver létrehozása

Tango Controls

Most próbáljunk meg csatlakozni hozzá:

Tango Controls

Semmi sem fog működni, először le kell futtatnunk a programunkat:

sudo ./NEO6M neo6m -v2

Csak joggal tudok csatlakozni a com porthoz gyökér-és. v — naplózási szint.

Most már csatlakozhatunk:

Tango Controls

vásárló

Grafikában a képek nézegetése biztosan jó, de kell valami hasznosabb. Írjunk egy klienst, amely csatlakozik a készülékünkhöz, és leolvassa róla.

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

Összeállítás módja:

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

Az eredményt parancsvisszaadásként kaptuk, egy karakterlánc és egy karaktertömb attribútumait véve.

referenciák

A cikket magamnak írtam, mert egy idő után kezdem elfelejteni, hogyan és mit tegyek.

Köszönöm a figyelmet.

Forrás: will.com

Hozzászólás