Tango Controls

Tango Controls

Vad Àr TANGO?

Det hÀr Àr ett system för att hantera olika utrustningar och programvara.
TANGO stöder för nÀrvarande 4 plattformar: Linux, Windows NT, Solaris och HP-UX.
HĂ€r kommer arbetet med Linux (Ubuntu 18.04) att beskrivas.

Vad behövs det för?

Det förenklar arbetet med olika utrustningar och mjukvara.

  • Du behöver inte tĂ€nka pĂ„ hur du lagrar data i databasen, det Ă€r redan gjort Ă„t dig.
  • Det enda som behövs Ă€r att beskriva mekanismen för att frĂ„ga sensorer.
  • Det samlar all din kod till en standard.

Var kan man fÄ det?

Jag kunde inte starta den frÄn kÀllkoden, jag anvÀnde den fÀrdiga TangoBox 9.3-bilden.
I instruktionerna beskrivs hur man installerar frÄn paketen.

Vad bestÄr den av?

  • JIVE – anvĂ€nds för att visa och redigera TANGO-databasen.
  • POGO – en kodgenerator för TANGO-enhetsservrar.
  • Astor – programhanterare för TANGO-systemet.

Vi kommer endast att intressera oss för de tvÄ första komponenterna.

Stödda programmeringssprÄk

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

Jag har arbetat med den i Python & c++. HÀr kommer c++ att anvÀndas som exempel.

Nu gÄr vi vidare till beskrivningen av hur man ansluter en enhet till TANGO och hur man arbetar med den. Som exempel kommer ett kort GPS neo-6m-0-001:

Tango Controls

Som bildligt visar ansluter vi kortet till PC:n via UART CP2102. NÀr det Àr anslutet till PC:n visas enheten /dev/ttyUSB[0-N], vanligtvis /dev/ttyUSB0.

POGO

Nu startar vi. pogo, och vi skapar skelettkoden för att arbeta med vÄrt kort.

pogo

Tango Controls

Jag hade redan skapat koden, lÄt oss skapa den pÄ nytt File->New.

Tango Controls

Vi fÄr följande:

Tango Controls

VÄr enhet (under enheten avses hÀr den programmÀssiga delen) Àr tom och har tvÄ kommandon för kontroll: State & Status.

Den behöver fyllas med nödvÀndiga attribut:

Device Property – standardvĂ€rden som vi skickar till enheten för initiering, för GPS-kortet mĂ„ste vi skicka kortets namn i systemet com="/dev/ttyUSB0" och hastigheten pĂ„ COM-porten baudrate=9600

Commands – kommandon för att styra vĂ„r enhet, de kan ges argument och returvĂ€rden.

  • STATE – returnerar det aktuella tillstĂ„ndet, frĂ„n States
  • STATUS – returnerar aktuell status, detta Ă€r en strĂ€ng som lĂ€ggs till STATE
  • GPSArray – returnerar gps en strĂ€ng i form av DevVarCharArray

DÀrefter anges attributen för enheten som kan lÀsas/skrivas till/frÄn.
Scalar Attributes – enkla attribut (char, string, long osv.)
Spectrum Attributes – endimensionella arrayer
Image Attributes – tvĂ„dimensionella arrayer

States – tillstĂ„ndet för vĂ„r enhet.

  • OPEN – enheten Ă€r öppen.
  • CLOSE – enheten Ă€r stĂ€ngd.
  • FAILT – fel.
  • PÅ — vi tar emot data frĂ„n enheten.
  • AV — det finns ingen data frĂ„n enheten.

Exempel pÄ att lÀgga till attribut gps_string:

Tango Controls

Polling period tiden i ms, hur ofta vÀrdet för gps_string ska uppdateras. Om ingen uppdateringstid anges kommer attributet endast att uppdateras pÄ begÀran.

Det lyckades:

Tango Controls

Nu behöver vi generera koden Fil->Generera

Tango Controls

Som standard genereras ingen Makefile, vid första gÄngen mÄste du markera rutan för att skapa den. Detta görs sÄ att Àndringar som görs i den inte tas bort vid ny generation. NÀr den har skapats en gÄng och anpassats för ditt projekt (ange kompilationsnycklar, ytterligare filer) kan du glömma den.

Nu gÄr vi direkt till programmeringen. pogo har genererat följande:

Tango Controls

Vi kommer att intressera oss för NEO6M.cpp & NEO6M.h. LÄt oss titta pÄ konstruktören för klassen som exempel:

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

    /*----- SKYDDAD REGION SLUT -----*/    //  NEO6M::constructor_1
}

Vad finns hÀr och vad Àr det viktigaste? I funktionen init_device() allokeras minne för vÄra attribut: gps_string & gps_array, men det Àr oviktigt. Det viktigaste hÀr, Àr kommentarerna:

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

Allt som finns inom detta kommentarblock kommer vid framtida nygenereringar av koden i pogo inte att tas bort!. Allt som Àr i icke-block kommer att! Det hÀr Àr platser dÀr vi kan programmera och göra vÄra Àndringar.

Nu vilka huvudsakliga funktioner innehÄller klassen 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);

NÀr vi vill lÀsa vÀrdet pÄ ett attribut gps_string, kommer funktionerna att anropas i följande ordning: always_executed_hook, read_attr_hardware och read_gps_string. I read_gps_string kommer gps_string att fyllas med vÀrde.

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

    /*----- SKYDDAD REGION SLUT -----*/    //  NEO6M::read_gps_string
}

Kompilering

GÄ in i mappen med kÀllkoden och:

make

Programmet kommer att kompileras i mappen ~/DeviceServers.

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

JIVE

jive

Tango Controls

I databasen finns redan nÄgra enheter, lÄt oss nu skapa vÄr Redigera->Skapa server

Tango Controls

Nu lÄt oss försöka ansluta till den:

Tango Controls

Det kommer inte att fungera, först mÄste vi starta vÄrt program:

sudo ./NEO6M neo6m -v2

Anslutning till com-porten kan jag bara göra med rĂ€ttigheter root-a. v — loggningsnivĂ„.

Nu kan vi ansluta:

Tango Controls

Klient

Att titta pÄ bilder i diagrammet Àr visserligen bra, men vi behöver nÄgot mer anvÀndbart. LÄt oss skriva en klient som kopplar upp sig mot vÄr enhet och hÀmtar dess mÀtvÀrden.

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

Resultatet:

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

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

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

Vi fick resultatet som en retur frÄn kommandot, hÀmtade attributen av strÀngen och arrayen av tecken.

LĂ€nkar

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

Tack för uppmÀrksamheten.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster