Tango Controls

Tango Controls

Kas ir TANGO?

TANGO ir sistēma, kas paredzēta, lai pārvaldītu dažādu aparatūru un programmatūru.
TANGO pašlaik atbalsta četras platformas: Linux, Windows NT, Solaris un HP-UX.
Šeit tiks aprakstīta darba vide ar Linux (Ubuntu 18.04)

Kāpēc tas ir nepieciešams?

Vienkāršo darbu ar dažādu aparatūru un programmatūru.

  • Jums nav jādomā par to, kā uzglabāt datus datu bāzē, tas jau ir izdarīts jūsu vietā.
  • Jums tikai jāapraksta sensoru aptaujas mehānisms.
  • Samazina visu jūsu kodu līdz vienai standarta formai.

Kur to iegūt?

Es nespēju to palaist no avota kodu, darbībai izmantoju gatavu TangoBox 9.3 attēlu.
Instrukcijā aprakstīts, kā instalēt no pakotnēm.

No kā tas sastāv?

  • JIVE — tiek izmantots, lai apskatītu un rediģētu TANGO datu bāzi.
  • POGO — koda ģenerators TANGO ierīču serveriem.
  • Mūs interesēs tikai pirmie divi komponenti. Atbalstītās programmēšanas valodas

Matlab

LabVIEW

  • C
  • C++
  • Java
  • JavaScript
  • Python
  • Es strādāju ar to Python un c++. Šeit piemērs izmantos c++.
  • Tagad pāriesim pie apraksta par to, kā pieslēgt ierīci TANGO un kā ar to strādāt. Kā piemērs tiks izmantota plate

GPS neo-6m-0-001

Kā redzams attēlā, plate tiek pievienota PC caur UART CP2102. Pieslēdzoties PC parādās ierīce , parasti /dev/ttyUSB0.:

Tango Controls

pogo /dev/ttyUSB[0-N], un mēs ģenerēsim skeleta kodu, lai strādātu ar mūsu plati.

POGO

Tagad palaidīsim. Man jau bija izveidots kods, izveidosim to no jaunaFile->New

Man jau bija izveidots kods, izveidosim to no jauna

Tango Controls

Mūsu ierīce (turpmāk ierīce attieksies uz programmatūras daļu) ir tukša un tai ir divas vadības komandas: Tā jāaizpilda ar nepieciešamajiem atribūtiem:.

Tango Controls

Saņemam sekojošo:

Tango Controls

Device Property State & Status.

— noklusējuma vērtības, kuras nosūtām ierīcei tās inicializācijai, GPS platei jānosūta plates nosaukums sistēmā

com="/dev/ttyUSB0" un COM porta ātrums baudrade=9600 Commands — komandas, kas pārvalda mūsu ierīci, tās var norādīt kā argumentus un atgrieztos vērtības.

STATE — atgriež pašreizējo stāvokli, no

  • States — atgriež pašreizējo statusu, kas ir teksta papildinājums pie GPSArray
  • STATUS — atgriež States
  • gps rindu, kas izskatās DevVarCharArray Tālāk jānorāda ierīces atribūti, kurus var lasīt/ierakstīt. Scalar Attributes

— vienkārši atribūti (char, string, long utt.)
Spectrum Attributes — viendimensiju masīvi
Image Attributes — divdimensionālie masīvi
— stāvokli, kurā atrodas mūsu ierīce. OPEN

GPSArray — ierīce ir atvērta.

  • CLOSE — ierīce ir slēgta.
  • FAILT — kļūda.
  • Kļūda — kļūda.
  • IEKĻAUTS — mēs saņemam datus no ierīces.
  • IZSLĒGT — nav datu no ierīces.

Piemērs, kā pievienot atribūtu gps_string:

Tango Controls

Polling period laiks ms, cik bieži tiks atjaunināta gps_string vērtība. Ja atjaunināšanas laiks nav norādīts, tad atribūts tiks atjaunināts tikai pēc pieprasījuma.

Izdevās:

Tango Controls

Tagad jāsagatavo kods File->Generate

Tango Controls

Pēc noklusējuma Makefile netiek ģenerēts, pirmajā reizē jāizvēlas atzīme, lai to izveidotu. Tas izdarīts, lai veiktās izmaiņas netiktu dzēstas jaunā ģenerēšanā. Izveidojot to vienreiz un pielāgojot savam projektam (norakstot kompilācijas atslēgas, papildus failus), var aizmirst par to.

Tagad pārejam tieši uz programmēšanu. pogo ir ģenerējis mums sekojošo:

Tango Controls

Mūs interesēs NEO6M.cpp & NEO6M.h. Apskatīsim piemēram klases konstruktora definīciju:

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
}

Kas te ir un kas ir galvenais? Funkcijā init_device() tiek piešķirta atmiņa mūsu atribūtiem: gps_string & gps_array, bet tas nav svarīgi. Svarīgākais šeit, ir komentāri:

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

Viss, kas atrodas šī komentāra blokā, pēc tam, kad kods tiks pārgenerēts pogo, netiks dzēsts!. Viss, kas nav blokos, tiks dzēsts! Tās ir vietas, kur mēs varam programmēt un veikt savas izmaiņas.

Tagad, kādas galvenās funkcijas satur klase 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);

Kad mēs vēlēsimies izlasīt atribūta vērtību gps_string, tiks izsauktas funkcijas šādā secībā: always_executed_hook, read_attr_hardware un read_gps_string. read_gps_string tiks aizpildīts gps_string ar vērtību.

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
}

Kompilācija

Ieejamies mapē ar avotiem un:

make

Programma tiks sakompilēta mapē ~/DeviceServers.

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

JIVE

jive

Tango Controls

Datu bāzē jau ir kādas ierīces, tagad izveidosim mūsu Edit->Create Server

Tango Controls

Tagad izmēģināsim pieslēgties tam:

Tango Controls

Nekas nesanāks, vispirms ir jāstartē mūsu programma:

sudo ./NEO6M neo6m -v2

Pieslēgties pie com porta var tikai ar tiesībām root-a. v — žurnāla līmenis.

Tagad varam pieslēgties:

Tango Controls

Klients

Grafikā skatīties attēlus, protams, ir labi, bet nepieciešams kaut kas noderīgāks. Uzrakstīsim klientu, kurš savienosies ar mūsu ierīci un iegūs no tās datus.

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

Kā kompilēt:

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

Rezultāts:

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

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

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

Saņēmām rezultātu komandas atgriešanas, atribūtu ņemšanas un simbolu masīva veidā.

Saites

Rakstu rakstīju sev, jo pēc kāda laika sāku aizmirst, kā un ko darīt.

Paldies par uzmanību.

Avots: habr.com

Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem 🔥 Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem | ProHoster