
Was ist ?
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:

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
Ich hatte bereits einen Code erstellt, lassen Sie uns ihn neu erstellen. File->Neu.

Wir erhalten folgendes:

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:

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:

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

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:

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_1Alles, 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:
makeDas Programm wird im Ordner ~/DeviceServers kompiliert.
tango-cs@tangobox:~/DeviceServers$ ls
NEO6MJIVE
jive
In der Datenbank gibt es bereits einige GerÀte, nun erstellen wir unser eigenes. Bearbeiten->Server erstellen

Jetzt versuchen wir, eine Verbindung herzustellen:

Es wird nichts funktionieren, zuerst mĂŒssen wir unser Programm starten:
sudo ./NEO6M neo6m -v2Ich kann nur mit Rechten zu dem COM-Port verbinden root-a. v â Protokollierungsstufe.
Jetzt können wir uns verbinden:

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*53Wir 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
