Tangokontroller

Tangokontroller

Hva er TANGO?

Det er et system for å administrere diverse maskinvare og programvare.
TANGO støtter for tiden 4 plattformer: Linux, Windows NT, Solaris og HP-UX.
Her vil vi beskrive arbeidet med Linux (Ubuntu 18.04)

Hva er den til?

Forenkler arbeidet med diverse utstyr og programvare.

  • Du trenger ikke tenke på hvordan du lagrer data i databasen, det er allerede gjort for deg.
  • Det er bare nødvendig å beskrive mekanismen for pollingsensorer.
  • Reduserer all din kode til én standard.

Hvor får jeg tak?

Jeg kunne ikke starte den fra kildekoden; Jeg brukte et ferdig bilde av TangoBox 9.3 for å fungere.
Instruksjonene beskriver hvordan du installerer fra pakker.

Hva består den av?

  • jive — brukes til å vise og redigere TANGO-databasen.
  • POGO — kodegenerator for TANGO-enhetsservere.
  • Astor — programleder for TANGO-systemet.

Vi vil bare være interessert i de to første komponentene.

Støttede programmeringsspråk

  • C
  • C + +
  • Java
  • Javascript
  • Python
  • matlab
  • LabVIEW

Jeg jobbet med det i python og c++. Her vil C++ bli brukt som eksempel.

La oss nå gå videre til en beskrivelse av hvordan du kobler enheten til TANGO og hvordan du arbeider med den. Gebyret vil bli tatt som eksempel GPS neo-6m-0-001:

Tangokontroller

Som du kan se på bildet kobler vi brettet til PC-en via UART CP2102. Når den er koblet til en PC, vises enheten /dev/ttyUSB[0-N], vanligvis /dev/ttyUSB0.

POGO

La oss nå starte pogo, og generer skjelettkode for å jobbe med brettet vårt.

pogo

Tangokontroller

Jeg har allerede laget koden, la oss lage den på nytt Fil->Ny.

Tangokontroller

Vi får følgende:

Tangokontroller

Enheten vår (i fremtiden vil vi med enhet mene programvaredelen) er tom og har to kontrollkommandoer: Tilstand & status.

Den må fylles med de nødvendige attributtene:

Enhetsegenskap — standardverdier som vi overfører til enheten for å initialisere den; for GPS-kortet må du overføre navnet på brettet i systemet com="/dev/ttyUSB0" og com-porthastighet baudrade=9600

Kommandoer — kommandoer for å kontrollere enheten vår; de kan gis argumenter og en returverdi.

  • STAT - returnerer gjeldende tilstand, fra Stater
  • STATUS - returnerer gjeldende status, dette er strengens komplement til STAT
  • GPSArray - returnerer gps streng i skjemaet DevVarCharArray

Angi deretter enhetsattributtene som kan leses/skrives til/fra den.
Skalære attributter - enkle attributter (char, string, long, etc.)
Spektrumattributter - endimensjonale arrays
Bildeattributter - todimensjonale arrays

Stater — tilstanden enheten vår befinner seg i.

  • ÅPNE — enheten er åpen.
  • CLOSE - enheten er lukket.
  • FEIL - feil.
  • ON — motta data fra enheten.
  • AV — ingen data fra enheten.

Eksempel på å legge til et attributt gps_string:

Tangokontroller

Avstemningsperiode tid i ms, hvor ofte gps_string-verdien vil bli oppdatert. Hvis oppdateringstiden ikke er spesifisert, oppdateres attributtet kun på forespørsel.

Det viste seg:

Tangokontroller

Nå må du generere koden Fil->Generer

Tangokontroller

Som standard genereres ikke Makefilen; første gang må du merke av i boksen for å opprette den. Dette gjøres slik at endringene som er gjort på den ikke slettes i løpet av en ny generasjon. Etter å ha opprettet det en gang og konfigurert det for prosjektet ditt (registrer kompileringsnøkler, tilleggsfiler), kan du glemme det.

La oss nå gå videre til programmering. pogo med genererte følgende for oss:

Tangokontroller

Vi vil være interessert i NEO6M.cpp & NEO6M.h. La oss ta et eksempel på en klassekonstruktør:

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
}

Hva finnes og hva er viktig her? Funksjonen init_device() tildeler minne for våre attributter: gps_string & gps_array, men det er ikke viktig. Det viktigste her, dette er kommentarene:

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

Alt som er inne i denne kommentarblokken vil ikke bli inkludert i pogo under påfølgende koderegenereringer Flytt deg!. Alt som ikke er i blokker blir det! Dette er stedene hvor vi kan programmere og gjøre våre egne redigeringer.

Hva er hovedfunksjonene klassen inneholder? 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 ønsker å lese attributtverdien gps_string, vil funksjonene kalles opp i følgende rekkefølge: alltid_utført_krok, read_attr_hardware и read_gps_string. Read_gps_string vil fylle gps_string med verdien.

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
}

Samling

Gå til kildemappen og:

make

Programmet vil bli kompilert i mappen ~/DeviceServers.

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

jive

jive

Tangokontroller

Det er allerede noen enheter i databasen, la oss nå lage våre Rediger->Opprett server

Tangokontroller

La oss nå prøve å koble til den:

Tangokontroller

Ingenting vil fungere, først må vi kjøre programmet vårt:

sudo ./NEO6M neo6m -v2

Jeg kan bare koble til com-porten med rettigheter root-EN. v - loggingsnivå.

Nå kan vi koble til:

Tangokontroller

kunde

I grafikk er det absolutt bra å se på bilder, men du trenger noe mer nyttig. La oss skrive en klient som kobler til enheten vår og tar avlesninger fra 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);
    }
}

Slik kompilerer 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 fikk resultatet som en kommandoretur, som tar attributtene til en streng og en rekke tegn.

referanser

Jeg skrev artikkelen for meg selv, for etter en stund begynner jeg å glemme hvordan og hva jeg skal gjøre.

Takk for oppmerksomheten.

Kilde: www.habr.com

Legg til en kommentar