Tango Controls

Tango Controls

Was ist TANGO?

Dies ist ein System zur Steuerung verschiedener Hardware und Software.
TANGO unterstĂŒtzt derzeit 4 Plattformen: Linux, Windows NT, Solaris und HP-UX.
Hier wird die Arbeit mit Linux (Ubuntu 18.04) beschrieben.

Wozu ist es nötig?

Es erleichtert die Arbeit mit verschiedenen GerÀten und Software.

  • Sie mĂŒssen sich keine Gedanken darĂŒber machen, wie Daten in der Datenbank gespeichert werden, das wurde bereits fĂŒr Sie erledigt.
  • Sie mĂŒssen nur den Mechanismus zur Abfrage der Sensoren beschreiben.
  • Es vereinfacht Ihren gesamten Code auf einen Standard.

Woher bekommt man das?

Ich konnte es aus dem Quellcode nicht starten, fĂŒr die Arbeit habe ich das fertige Image TangoBox 9.3 verwendet.
In der Anleitung wird beschrieben, wie man es aus Paketen installiert.

Woraus besteht es?

  • JIVE — dient zur Anzeige und Bearbeitung der TANGO-Datenbank.
  • POGO — ein Code-Generator fĂŒr TANGO-GerĂ€teserver.
  • Astor — ein Software-Manager fĂŒr das TANGO-System.

Uns werden nur die ersten beiden Komponenten interessieren.

UnterstĂŒtzte Programmiersprachen

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

Ich habe damit in Python & C++ gearbeitet. Hier wird als Beispiel C++ verwendet.

Jetzt kommen wir zur Beschreibung, wie man ein GerÀt mit TANGO verbindet und damit arbeitet. Als Beispiel wird das Board GPS neo-6m-0-001:

Tango Controls

Wie auf dem Bild zu sehen, schließen wir das Board ĂŒber UART CP2102 an den PC an. Beim Anschluss an den PC erscheint das GerĂ€t /dev/ttyUSB[0-N], normalerweise /dev/ttyUSB0.

POGO

Jetzt starten wir pogo, und wir generieren das Skelett des Codes fĂŒr die Arbeit mit unserem Board.

pogo

Tango Controls

Ich hatte bereits einen Code erstellt, lassen Sie uns ihn neu erstellen. File->Neu.

Tango Controls

Wir erhalten folgendes:

Tango Controls

Unser GerÀt (mit GerÀt ist hier die Softwarekomponente gemeint) ist leer und hat zwei Steuerbefehle: State & Status.

Es muss mit den notwendigen Attributen gefĂŒllt werden:

Device Property — Standardwerte, die wir an das GerĂ€t zur Initialisierung ĂŒbergeben, fĂŒr das GPS-Board muss der Name des Boards im System ĂŒbergeben werden com="/dev/ttyUSB0" und die Geschwindigkeit des COM-Ports baudrade=9600

Commands — Steuerbefehle fĂŒr unser GerĂ€t, die Argumente und RĂŒckgabewerte definieren können.

  • STATE — gibt den aktuellen Zustand zurĂŒck, aus States
  • STATUS — gibt den aktuellen Status zurĂŒck, dies ist eine string ErgĂ€nzung zu STATE
  • GPSArray — gibt zurĂŒck gps einen String in Form von DevVarCharArray

Anschließend werden die GerĂ€teeigenschaften festgelegt, die gelesen/geschrieben werden können.
Scalar Attributes — einfache Attribute (char, string, long usw.)
Spectrum Attributes — eindimensionale Arrays
Image Attributes — zweidimensionale Arrays

States — ZustĂ€nde, in denen sich unser GerĂ€t befindet.

  • OPEN — das GerĂ€t ist geöffnet.
  • CLOSE — das GerĂ€t ist geschlossen.
  • FAILT — ein Fehler.
  • AN — Wir empfangen Daten vom GerĂ€t.
  • AUS — Es liegen keine Daten vom GerĂ€t vor.

Beispiel fĂŒr das HinzufĂŒgen eines Attributs gps_string:

Tango Controls

Abfragezeitraum Zeit in ms, wie oft der Wert von gps_string aktualisiert wird. Wenn die Aktualisierungszeit nicht festgelegt wird, wird das Attribut nur auf Anfrage aktualisiert.

Es hat geklappt:

Tango Controls

Jetzt mĂŒssen wir den Code generieren Datei->Generieren

Tango Controls

StandardmĂ€ĂŸig wird kein Makefile generiert. Beim ersten Mal muss das HĂ€kchen gesetzt werden, um es zu erstellen. Das wurde gemacht, damit die vorgenommenen Änderungen bei einer neuen Generierung nicht gelöscht werden. Nachdem wir es einmal erstellt und an unser Projekt angepasst haben (KompilierungsschlĂŒssel, zusĂ€tzliche Dateien), können wir es vergessen.

Jetzt kommen wir direkt zum Programmieren. Pogo hat uns Folgendes generiert:

Tango Controls

Wir werden uns fĂŒr NEO6M.cpp & NEO6M.h interessieren. Lassen Sie uns zum Beispiel den Konstruktor der Klasse betrachten:

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
}

Was ist hier und was ist das Wichtigste? In der Funktion init_device() wird Speicher fĂŒr unsere Attribute reserviert: gps_string & gps_array, aber das ist nicht wichtig. Das Wichtigste hiersind die Kommentare:

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

Alles, was sich innerhalb dieses Kommentarblocks befindet, wird bei nachfolgenden Code-Regenerierungen in Pogo nicht gelöscht!. Alles, was nicht in Blöcken ist, wird gelöscht! Das sind die Stellen, an denen wir programmieren und unsere Änderungen vornehmen können.

Jetzt, welche Hauptfunktionen enthÀlt die Klasse 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);

Wenn wir den Wert eines Attributs lesen möchten, gps_stringwerden die Funktionen in folgender Reihenfolge aufgerufen: always_executed_hook, read_attr_hardware und read_gps_string. In read_gps_string wird gps_string mit dem Wert gefĂŒllt.

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

    /*----- PROTECTED REGION END -----*/    //  NEO6M::read_gps_string
}

Kompilation

Gehen Sie in den Quellcode-Ordner und:

make

Das Programm wird im Ordner ~/DeviceServers kompiliert.

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

JIVE

jive

Tango Controls

In der Datenbank gibt es bereits einige GerÀte, nun erstellen wir unser eigenes. Bearbeiten->Server erstellen

Tango Controls

Jetzt versuchen wir, eine Verbindung herzustellen:

Tango Controls

Es wird nichts funktionieren, zuerst mĂŒssen wir unser Programm starten:

sudo ./NEO6M neo6m -v2

Ich kann nur mit Rechten zu dem COM-Port verbinden root-a. v — Protokollierungsstufe.

Jetzt können wir uns verbinden:

Tango Controls

den Kunden zurĂŒckzufĂŒhren sind, nicht verfĂŒgbar ist.

Im Diagramm ist es natĂŒrlich gut, die Bilder zu betrachten, aber wir brauchen etwas NĂŒtzlicheres. Lassen Sie uns einen Client schreiben, der sich mit unserem GerĂ€t verbindet und die Messwerte abruft.

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

Wie man kompiliert:

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

Ergebnis:

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

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

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

Wir haben das Ergebnis in Form einer RĂŒckgabe des Befehls zum Abrufen von Attributen der Zeichenkette und des Zeichenarrays erhalten.

Links

Ich habe den Artikel fĂŒr mich selbst geschrieben, weil ich nach einiger Zeit zu vergessen beginne, wie und was zu tun ist.

Danke fĂŒr Ihre Aufmerksamkeit.

Quelle: habr.com

ZuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz kaufen, VPS VDS Server đŸ”„ ZuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz kaufen, VPS VDS Server - ProHoster