Tangokontroller

Tangokontroller

Vad är TANGO?

Det är ett system för att hantera olika hård- och mjukvara.
TANGO stöder för närvarande fyra plattformar: Linux, Windows NT, Solaris och HP-UX.
Här kommer vi att beskriva att arbeta med Linux (Ubuntu 18.04)

Vad är det för?

Förenklar arbetet med diverse utrustning och mjukvara.

  • Du behöver inte tänka på hur du lagrar data i databasen, det är redan gjort åt dig.
  • Det är bara nödvändigt att beskriva mekanismen för pollingsensorer.
  • Reducerar all din kod till en standard.

Var kan man få det?

Jag kunde inte starta den från källkoden; jag använde en färdig bild av TangoBox 9.3 för att fungera.
Instruktionerna beskriver hur man installerar från paket.

Vad består den av?

  • JIVE — används för att visa och redigera TANGO-databasen.
  • POGO — Kodgenerator för TANGO-enhetsservrar.
  • Astor — Programledare för TANGO-systemet.

Vi kommer bara att vara intresserade av de två första komponenterna.

Programmeringsspråk som stöds

  • C
  • C + +
  • java
  • JavaScript
  • Python
  • matlab
  • LabVIEW

Jag arbetade med det i python & c++. Här kommer C++ att användas som exempel.

Låt oss nu gå vidare till en beskrivning av hur man ansluter enheten till TANGO och hur man arbetar med den. Avgiften kommer att tas som exempel GPS neo-6m-0-001:

Tangokontroller

Som du kan se på bilden ansluter vi kortet till PC:n via UART CP2102. När enheten är ansluten till en dator visas enheten /dev/ttyUSB[0-N], vanligtvis /dev/ttyUSB0.

POGO

Låt oss nu starta pogo, och generera skelettkod för att arbeta med vår styrelse.

pogo

Tangokontroller

Jag har redan skapat koden, låt oss skapa den igen Arkiv->Ny.

Tangokontroller

Vi får följande:

Tangokontroller

Vår enhet (i framtiden, med enhet kommer vi att mena mjukvarudelen) är tom och har två kontrollkommandon: Ange & status.

Den måste fyllas med de nödvändiga attributen:

Enhetsegenskap — standardvärden som vi överför till enheten för att initiera den; för GPS-kortet måste du överföra namnet på kortet i systemet com="/dev/ttyUSB0" och com-porthastighet baudrade=9600

Kommandon — kommandon för att styra vår enhet; de kan ges argument och ett returvärde.

  • STAT - returnerar det aktuella läget, från Stater
  • STATUS - returnerar aktuell status, detta är strängens komplement till STAT
  • GPSArray - returnerar gps sträng i formuläret DevVarCharArray

Ställ sedan in enhetsattributen som kan läsas/skrivas till/från den.
Skalära attribut — enkla attribut (char, string, long, etc.)
Spektrumattribut - endimensionella arrayer
Bildattribut - tvådimensionella arrayer

Stater — i vilket tillstånd vår enhet befinner sig.

  • ÖPPEN — enheten är öppen.
  • NÄRA — enheten är stängd.
  • FEL - fel.
  • ON — ta emot data från enheten.
  • AV — inga data från enheten.

Exempel på att lägga till ett attribut gps_string:

Tangokontroller

Valperiod tid i ms, hur ofta gps_string-värdet kommer att uppdateras. Om uppdateringstiden inte anges kommer attributet att uppdateras endast på begäran.

Hände:

Tangokontroller

Nu måste du generera koden Arkiv->Generera

Tangokontroller

Som standard genereras inte Makefilen; första gången måste du markera rutan för att skapa den. Detta görs för att de ändringar som gjorts i den inte ska raderas under en ny generation. Efter att ha skapat det en gång och konfigurerat det för ditt projekt (registrera kompileringsnycklar, ytterligare filer), kan du glömma det.

Låt oss nu gå vidare till programmering. pogo med genererade följande åt oss:

Tangokontroller

Vi kommer att vara intresserade av NEO6M.cpp & NEO6M.h. Låt oss ta ett exempel på en klasskonstruktor:

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
}

Vad finns där och vad är viktigt här? Funktionen init_device() allokerar minne för våra attribut: gps_string & gps_array, men det är inte viktigt. Det viktigaste här, dessa är kommentarerna:

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

Allt som finns i det här kommentarsblocket kommer inte att inkluderas i pogo under efterföljande kodregenerering flytta på dig!. Allt som inte är i block kommer att vara! Det här är platserna där vi kan programmera och göra våra egna redigeringar.

Vilka är nu huvudfunktionerna som klassen innehåller? 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);

När vi vill läsa attributvärdet gps_string, kommer funktionerna att anropas i följande ordning: alltid_exekverad_krok, read_attr_hardware и read_gps_string. Read_gps_string kommer att fylla gps_string med värdet.

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
}

Kompilering

Gå till källmappen och:

make

Programmet kommer att kompileras till mappen ~/DeviceServers.

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

JIVE

jive

Tangokontroller

Det finns redan några enheter i databasen, låt oss nu skapa våra Redigera->Skapa server

Tangokontroller

Låt oss nu försöka ansluta till den:

Tangokontroller

Inget kommer att fungera, först måste vi köra vårt program:

sudo ./NEO6M neo6m -v2

Jag kan bara ansluta till com-porten med rättigheter rots. v — loggningsnivå.

Nu kan vi ansluta:

Tangokontroller

kund

Inom grafik är det säkert bra att titta på bilder, men du behöver något mer användbart. Låt oss skriva en klient som kommer att ansluta till vår enhet och ta avläsningar från den.

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

Så här kompilerar du:

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

Resultat:

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

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

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

Vi fick resultatet som ett kommandoretur, som tar attributen för en sträng och en uppsättning tecken.

referenser

Jag skrev artikeln för mig själv, för efter ett tag börjar jag glömma hur och vad jag ska göra.

Tack för er uppmärksamhet.

Källa: will.com

Lägg en kommentar