Es handelt sich um ein System zur Verwaltung verschiedener Hardware und Software.
TANGO unterstützt derzeit 4 Plattformen: Linux, Windows NT, Solaris und HP-UX.
Hier beschreiben wir die Arbeit mit Linux (Ubuntu 18.04)
Was ist das überhaupt?
Vereinfacht die Arbeit mit verschiedenen Geräten und Software.
Sie müssen nicht darüber nachdenken, wie Sie Daten in der Datenbank speichern, das ist bereits für Sie erledigt.
Es ist lediglich erforderlich, den Mechanismus zur Abfrage von Sensoren zu beschreiben.
Ich konnte es nicht über den Quellcode starten; ich habe ein vorgefertigtes Image von TangoBox 9.3 verwendet, um zu funktionieren.
Die Anleitung beschreibt die Installation aus Paketen.
Woraus besteht es?
jive – dient zum Anzeigen und Bearbeiten der TANGO-Datenbank.
POGO — Codegenerator für TANGO-Geräteserver.
Astor — Programmmanager für das TANGO-System.
Wir werden uns nur für die ersten beiden Komponenten interessieren.
Unterstützte Programmiersprachen
C
C + +
Javac
JavaScript
Python
Matlab
LabVIEW
Ich habe damit in Python und C++ gearbeitet. Hier wird C++ als Beispiel verwendet.
Kommen wir nun zu einer Beschreibung, wie man das Gerät mit TANGO verbindet und wie man damit arbeitet. Als Beispiel soll die Gebühr genommen werden GPS neo-6m-0-001:
Wie auf dem Bild zu sehen ist, verbinden wir das Board per UART CP2102 mit dem PC. Bei Anschluss an einen PC erscheint das Gerät /dev/ttyUSB[0-N], normalerweise /dev/ttyUSB0.
POGO
Jetzt lasst uns starten Pogo, und generieren Sie Grundcode für die Arbeit mit unserem Board.
pogo
Ich habe den Code bereits erstellt, erstellen wir ihn erneut Datei->Neu.
Wir erhalten Folgendes:
Unser Gerät (mit Gerät meinen wir in Zukunft den Softwareteil) ist leer und verfügt über zwei Steuerbefehle: Bundesstaat & Status.
Es muss mit den notwendigen Attributen gefüllt sein:
Geräteeigenschaft — Standardwerte, die wir zur Initialisierung an das Gerät übertragen; für die GPS-Karte müssen Sie den Namen der Karte im System übertragen com="/dev/ttyUSB0" und COM-Port-Geschwindigkeit Baudrade=9600
Befehle – Befehle zur Steuerung unseres Geräts; ihnen können Argumente und ein Rückgabewert zugewiesen werden.
STATE - gibt den aktuellen Status zurück, von Staaten
STATUS - gibt den aktuellen Status zurück, dies ist das Komplement zu der Zeichenfolge STATE
GPSArray - kehrt zurück gps Zeichenfolge im Formular DevVarCharArray
Als nächstes legen Sie die Geräteattribute fest, die darauf gelesen/geschrieben werden können. Skalare Attribute — einfache Attribute (char, string, long usw.) Spektrumattribute - eindimensionale Arrays Bildattribute - zweidimensionale Arrays
Staaten — der Zustand, in dem sich unser Gerät befindet.
OPEN — Das Gerät ist geöffnet.
SCHLIESSEN — Das Gerät ist geschlossen.
FEHLGESCHLAGEN - Fehler.
ON — Daten vom Gerät empfangen.
OFF — Keine Daten vom Gerät.
Beispiel für das Hinzufügen eines Attributs gps_string:
Abstimmungszeitraum Zeit in ms, wie oft der gps_string-Wert aktualisiert wird. Wenn die Aktualisierungszeit nicht angegeben ist, wird das Attribut nur auf Anfrage aktualisiert.
Es stellte sich heraus:
Jetzt müssen Sie den Code generieren Datei->Generieren
Standardmäßig wird das Makefile nicht generiert. Beim ersten Mal müssen Sie das Kontrollkästchen aktivieren, um es zu erstellen. Dies geschieht, damit die daran vorgenommenen Änderungen bei einer neuen Generation nicht gelöscht werden. Nachdem Sie es einmal erstellt und für Ihr Projekt konfiguriert haben (Kompilierungsschlüssel registrieren, zusätzliche Dateien), können Sie es vergessen.
Kommen wir nun zur Programmierung. pogo with hat für uns Folgendes generiert:
Wir werden an NEO6M.cpp und NEO6M.h interessiert sein. Nehmen wir ein Beispiel für einen Klassenkonstruktor:
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 und was ist hier wichtig? Die Funktion init_device() reserviert Speicher für unsere Attribute: gps_string & gps_array, aber es ist nicht wichtig. Das Wichtigste hier, das sind die Kommentare:
/*----- PROTECTED REGION ID(NEO6M::constructor_1) ENABLED START -----*/
.......
/*----- PROTECTED REGION END -----*/ // NEO6M::constructor_1
Alles, was sich in diesem Kommentarblock befindet, wird bei nachfolgenden Code-Neugenerierungen nicht in Pogo einbezogen wegziehen!. Alles, was nicht in Blöcken ist, wird es sein! Dies sind die Orte, an denen wir programmieren und unsere eigenen Bearbeitungen vornehmen können.
Was sind nun die Hauptfunktionen, die die Klasse enthält? NEO6M:
Wenn wir den Attributwert lesen möchten gps_string, werden die Funktionen in der folgenden Reihenfolge aufgerufen: Always_executed_hook, read_attr_hardware и read_gps_string. Read_gps_string füllt gps_string mit dem Wert.
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
}
Zusammenstellung
Gehen Sie zum Quellordner und:
make
Das Programm wird in den Ordner ~/DeviceServers kompiliert.
tango-cs@tangobox:~/DeviceServers$ ls
NEO6M
jive
jive
Es sind bereits einige Geräte in der Datenbank vorhanden, jetzt erstellen wir eines Bearbeiten->Server erstellen
Versuchen wir nun, eine Verbindung herzustellen:
Nichts wird funktionieren, zuerst müssen wir unser Programm ausführen:
sudo ./NEO6M neo6m -v2
Ich kann mich nur mit Rechten mit dem COM-Port verbinden Wurzel-a. v — Protokollierungsstufe.
Jetzt können wir Folgendes verbinden:
Auftraggeber
In der Grafik ist das Betrachten von Bildern sicherlich gut, aber Sie brauchen etwas Nützlicheres. Schreiben wir einen Client, der sich mit unserem Gerät verbindet und Messwerte von diesem erfasst.
#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);
}
}