
Was ist ?
Dies ist ein System zur Verwaltung verschiedener Hardware- und Softwarekomponenten.
TANGO unterstĂŒtzt derzeit 4 Plattformen: Linux, Windows NT, Solaris und HP-UX.
Hier wird die Arbeit mit Linux (Ubuntu 18.04) beschrieben.
Wozu dient es?
Es vereinfacht die Arbeit mit verschiedenen GerÀten und Software.
- Sie mĂŒssen sich keine Gedanken darĂŒber machen, wie die Daten in der Datenbank gespeichert werden, das wurde bereits fĂŒr Sie erledigt.
- Sie mĂŒssen nur den Mechanismus zur Abfrage von Sensoren beschreiben.
- Es reduziert Ihren gesamten Code auf einen Standard.
Woher bekommen?
Ich konnte es aus den Quellcodes nicht starten, habe jedoch ein fertiges TangoBox 9.3-Image verwendet.
In der Anleitung wird beschrieben, wie man es aus Paketen installiert.
Woraus besteht es?
- JIVE â dient zum Anzeigen und Bearbeiten der TANGO-Datenbank.
- POGO â ein Code-Generator fĂŒr TANGO-GerĂ€teserver.
- Astor â ein Software-Manager fĂŒr das TANGO-System.
Wir werden uns nur fĂŒr die ersten beiden Komponenten interessieren.
UnterstĂŒtzte Programmiersprachen
- C
- C++
- Java
- JavaScript
- Python
- Matlab
- LabVIEW
Ich habe damit in Python und 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 im Bild zu sehen ist, verbinden wir die Platine mit dem PC ĂŒber UART CP2102. Bei der Verbindung mit dem PC erscheint das GerĂ€t /dev/ttyUSB[0-N], normalerweise /dev/ttyUSB0.
POGO
Jetzt starten wir pogo, und generieren den Code-Skelett zur Nutzung mit unserer Platine.
pogo
Ich hatte bereits Code erstellt, lassen Sie ihn uns neu erstellen Datei->Neu.

Wir erhalten Folgendes:

Unser GerÀt (mit dem in Zukunft die Softwarekomponente gemeint ist) ist leer und hat zwei Steuerbefehle: State & Status.
Es muss mit den erforderlichen Attributen ausgefĂŒllt werden:
GerĂ€teeigenschaft â Standardwerte, die wir an das GerĂ€t zur Initialisierung ĂŒbergeben, fĂŒr die GPS-Platine muss der Name der Platine im System ĂŒbergeben werden com="/dev/ttyUSB0" und die Geschwindigkeit des COM-Ports baudrate=9600
Befehle â Steuerbefehle fĂŒr unser GerĂ€t, die Argumente und RĂŒckgabewerte zugewiesen werden können.
- STATUS â gibt den aktuellen Zustand zurĂŒck, von ZustĂ€nde
- STATUS â gibt den aktuellen Status zurĂŒck, dies ist eine String-ErgĂ€nzung zu STATUS
- GPSArray â gibt zurĂŒck gps String in Form von DevVarCharArray
Als NÀchstes werden die GerÀteeigenschaften definiert, die von und in das GerÀt gelesen/geschrieben werden können.
Skalare Attribute â einfache Attribute (char, string, long usw.)
Spektrum-Attribute â eindimensionale Arrays
Bildattribute â zweidimensionale Arrays
ZustĂ€nde â der Zustand, in dem sich unser GerĂ€t befindet.
- ĂFFNEN â das GerĂ€t ist offen.
- SCHLIESSEN â GerĂ€t ist geschlossen.
- FEHLER â Fehler.
- EIN â Daten werden vom GerĂ€t empfangen.
- AUS â keine Daten vom GerĂ€t.
Beispiel fĂŒr das HinzufĂŒgen eines Attributs gps_string:

Abfrageintervall Zeit in ms, wie oft der Wert von gps_string aktualisiert wird. Wenn keine Aktualisierungszeit angegeben wird, wird das Attribut nur auf Anfrage aktualisiert.
Erhalten:

Nun muss der Code generiert werden Datei->Generieren

StandardmĂ€Ăig wird Makefile nicht generiert. Beim ersten Mal muss das HĂ€kchen gesetzt werden, um es zu erstellen. Dies wurde gemacht, damit die Ănderungen beim neuen Generieren nicht gelöscht werden. Wenn es einmal erstellt und an Ihr Projekt angepasst wird (Kompilierungsoptionen, zusĂ€tzliche Dateien festlegen), können Sie es vergessen.
Nun kommen wir direkt zum Programmieren. Pogo hat uns Folgendes generiert:

Uns interessieren NEO6M.cpp & NEO6M.h. Lassen Sie uns als 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 gibt es 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 hier, sind die Kommentare:
/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
.......
/*----- PROTECTED REGION END -----*/ // NEO6M::constructor_1Alles, was sich in diesem Kommentarblock befindet, wird bei zukĂŒnftigen Code-Neugenerierungen in Pogo nicht gelöscht! Das wird nicht gelöscht!. Alles, was nicht in Block ist, wird gelöscht! Das sind die Stellen, an denen wir programmieren und unsere Ănderungen vornehmen können.
Was sind die Hauptfunktionen der 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_string, werden die Funktionen in folgender Reihenfolge aufgerufen: always_executed_hook, read_attr_hardware und read_gps_string. In read_gps_string wird die gps_string-Variable gesetzt.
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
}Kompilierung
Gehen wir in den Quellcode-Ordner und:
makeDas Programm wird im Ordner ~/DeviceServers kompiliert.
tango-cs@tangobox:~/DeviceServers$ ls
NEO6MJIVE
jive
In der Datenbank sind bereits einige GerÀte vorhanden, jetzt erstellen wir unser GerÀt. Bearbeiten->Server erstellen

Jetzt versuchen wir, eine Verbindung herzustellen:

Es wird nicht funktionieren, zuerst mĂŒssen wir unser Programm starten:
sudo ./NEO6M neo6m -v2Eine Verbindung zum COM-Port ist nur mit Rechten möglich root-a. v â Protokollebene.
Jetzt können wir uns verbinden:

Kunde
Es ist zwar schön, die Bilder im Diagramm zu sehen, 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);
}
}So kompilieren Sie:
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++Das Ergebnis:
tango-cs@tangobox:~/workspace/c$ ./a.out
$GPRMC,,V,,,,,,,,,,N*53
$GPRMC,,V,,,,,,,,,,N*53
$GPRMC,,V,,,,,,,,,,N*53Wir haben das Ergebnis im RĂŒckgabewert des Befehls, beim Abrufen von Attributen und dem Zeichenarray erhalten.
Links
Ich habe den Artikel fĂŒr mich selbst geschrieben, da ich nach einer gewissen Zeit vergesse, wie und was zu tun ist.
Vielen Dank fĂŒr Ihre Aufmerksamkeit.
Quelle: habr.com
