Commandes Tango

Commandes Tango

Qu'est-ce que TANGO?

Il s'agit d'un système de gestion de divers matériels et logiciels.
TANGO prend actuellement en charge 4 plates-formes : Linux, Windows NT, Solaris et HP-UX.
Ici, nous décrirons le travail avec Linux (Ubuntu 18.04)

Pour quelle raison?

Simplifie le travail avec divers équipements et logiciels.

  • Vous n'avez pas besoin de réfléchir à la manière de stocker les données dans la base de données, c'est déjà fait pour vous.
  • Il suffit de décrire le mécanisme d'interrogation des capteurs.
  • Réduit tout votre code à un seul standard.

Où l'obtenir?

Je n'ai pas pu le lancer à partir du code source ; j'ai utilisé une image toute faite de TangoBox 9.3 pour travailler.
Les instructions décrivent comment installer à partir de packages.

En quoi cela consiste?

  • JIVE — utilisé pour visualiser et éditer la base de données TANGO.
  • POGO — générateur de code pour les serveurs d'appareils TANGO.
  • Astor — responsable de programme pour le système TANGO.

Nous nous intéresserons uniquement aux deux premières composantes.

Langages de programmation pris en charge

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

J'ai travaillé avec en python et c++. Ici, le C++ sera utilisé comme exemple.

Passons maintenant à une description de la façon de connecter l'appareil à TANGO et de comment l'utiliser. Les frais seront pris à titre d'exemple GPS néo-6m-0-001:

Commandes Tango

Comme vous pouvez le voir sur l'image, nous connectons la carte au PC via UART CP2102. Lorsqu'il est connecté à un PC, l'appareil apparaît /dev/ttyUSB[0-N], généralement /dev/ttyUSB0.

POGO

Maintenant courons pogo, et générez un code squelette pour travailler avec notre tableau.

pogo

Commandes Tango

J'ai déjà créé le code, créons-le à nouveau Fichier->Nouveau.

Commandes Tango

Nous obtenons ce qui suit :

Commandes Tango

Notre appareil (à l'avenir, par appareil nous désignerons la partie logicielle) est vide et dispose de deux commandes de contrôle : Région & Statut.

Il doit être rempli des attributs nécessaires :

Propriété de l'appareil — valeurs par défaut que nous transférons à l'appareil pour l'initialiser ; pour la carte GPS, vous devez transférer le nom de la carte dans le système com="/dev/ttyUSB0" et la vitesse du port COM baudrade=9600

Commandes — des commandes pour contrôler notre appareil ; elles peuvent recevoir des arguments et une valeur de retour.

  • ETAT - renvoie l'état actuel, de États
  • STATUT - renvoie l'état actuel, c'est le complément de la chaîne à ETAT
  • Tableau GPS - Retour gps chaîne sous la forme DevVarCharArray

Ensuite, définissez les attributs du périphérique qui peuvent être lus/écrits vers/depuis celui-ci.
Attributs scalaires — attributs simples (char, string, long, etc.)
Attributs du spectre - tableaux unidimensionnels
Attributs d'image - tableaux bidimensionnels

États — l'état dans lequel se trouve notre appareil.

  • OUVERT — l'appareil est ouvert.
  • CLOSE - l'appareil est fermé.
  • ÉCHEC - erreur.
  • ON — recevoir des données de l'appareil.
  • de remise — aucune donnée de l'appareil.

Exemple d'ajout d'un attribut chaîne_gps:

Commandes Tango

Période de scrutin temps en ms, à quelle fréquence la valeur gps_string sera mise à jour. Si l'heure de mise à jour n'est pas spécifiée, l'attribut sera mis à jour uniquement sur demande.

Il s'est avéré:

Commandes Tango

Maintenant vous devez générer le code Fichier->Générer

Commandes Tango

Par défaut, le Makefile n'est pas généré ; la première fois il faut cocher la case pour le créer. Ceci est fait pour que les modifications qui y sont apportées ne soient pas supprimées lors d'une nouvelle génération. Après l'avoir créé une fois et configuré pour votre projet (enregistrement des clés de compilation, fichiers supplémentaires), vous pouvez l'oublier.

Passons maintenant à la programmation. pogo a généré ce qui suit pour nous :

Commandes Tango

Nous serons intéressés par NEO6M.cpp & NEO6M.h. Prenons un exemple de constructeur de classe :

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
}

Qu'y a-t-il et qu'est-ce qui est important ici ? La fonction init_device() alloue de la mémoire pour nos attributs : chaîne_gps & tableau_gps, mais ce n'est pas important. La chose la plus importante ici, voici les commentaires :

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

Tout ce qui se trouve à l'intérieur de ce bloc de commentaires ne sera pas inclus dans pogo lors des régénérations de code ultérieures éloignez-vous !. Tout ce qui n'est pas en blocs le sera ! Ce sont les endroits où nous pouvons programmer et effectuer nos propres modifications.

Maintenant, quelles sont les principales fonctions contenues dans la classe ? NÉO6M:

void always_executed_hook();
void read_attr_hardware(vector<long> &attr_list);
void read_gps_string(Tango::Attribute &attr);
void read_gps_array(Tango::Attribute &attr);

Quand nous voulons lire la valeur de l'attribut chaîne_gps, les fonctions seront appelées dans l'ordre suivant : toujours_exécuté_hook, read_attr_hardware и read_gps_string. Read_gps_string remplira gps_string avec la valeur.

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
}

Compilation

Allez dans le dossier source et :

make

Le programme sera compilé dans le dossier ~/DeviceServers.

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

JIVE

jive

Commandes Tango

Il y a déjà quelques appareils dans la base de données, créons maintenant le nôtre Edition->Créer un serveur

Commandes Tango

Essayons maintenant de nous y connecter :

Commandes Tango

Rien ne fonctionnera, nous devons d'abord exécuter notre programme :

sudo ./NEO6M neo6m -v2

Je ne peux me connecter qu'au port COM avec des droits racine-a v — niveau de journalisation.

Nous pouvons maintenant connecter :

Commandes Tango

Client

En graphisme, regarder des images est certes une bonne chose, mais il faut quelque chose de plus utile. Écrivons un client qui se connectera à notre appareil et en tirera des lectures.

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

Comment compiler :

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

Résultat:

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

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

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

Nous avons obtenu le résultat sous forme de retour de commande, prenant les attributs d'une chaîne et d'un tableau de caractères.

références

J'ai écrit l'article pour moi-même, car au bout d'un moment, je commence à oublier comment et quoi faire.

Je vous remercie de votre attention.

Source: habr.com

Ajouter un commentaire