Tango Kontrolleri

Tango Kontrolleri

Ne TANGO?

Çeşitli donanım ve yazılımların yönetilmesine yönelik bir sistemdir.
TANGO şu anda 4 platformu desteklemektedir: Linux, Windows NT, Solaris ve HP-UX.
Burada Linux ile çalışmayı anlatacağız (Ubuntu 18.04)

Nasılsın?

Çeşitli ekipman ve yazılımlarla çalışmayı kolaylaştırır.

  • Verileri veritabanında nasıl saklayacağınızı düşünmenize gerek yok, bu zaten sizin için yapıldı.
  • Yoklama sensörlerinin mekanizmasını açıklamak yeterlidir.
  • Tüm kodunuzu tek bir standarda indirir.

Nereden alınır?

Kaynak kodundan başlatamadım; çalışmak için TangoBox 9.3'ün hazır bir görüntüsünü kullandım.
Talimatlarda paketlerden nasıl kurulum yapılacağı açıklanmaktadır.

Ne içeriyor?

  • JİV — TANGO veritabanını görüntülemek ve düzenlemek için kullanılır.
  • POGO — TANGO cihaz sunucuları için kod oluşturucu.
  • Astor — TANGO sistemi için program yöneticisi.

Sadece ilk iki bileşenle ilgileneceğiz.

Desteklenen programlama dilleri

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

Bununla python ve c++ ile çalıştım. Burada örnek olarak C++ kullanılacaktır.

Şimdi cihazı TANGO'ya nasıl bağlayacağınızı ve onunla nasıl çalışacağınızı açıklamaya geçelim. Ücret örnek olarak alınacak GPS neo-6m-0-001:

Tango Kontrolleri

Resimde gördüğünüz gibi kartı UART CP2102 üzerinden PC'ye bağlıyoruz. Bir PC'ye bağlandığında cihaz görünür /dev/ttyUSB[0-N], genellikle /dev/ttyUSB0.

POGO

Şimdi başlayalım pogove panomuzla çalışmak için iskelet kodu oluşturun.

pogo

Tango Kontrolleri

Kodu zaten oluşturdum, tekrar oluşturalım Dosya->Yeni.

Tango Kontrolleri

Aşağıdakileri alıyoruz:

Tango Kontrolleri

Cihazımız (ileride cihaz derken yazılım kısmını kastedeceğiz) boş ve iki kontrol komutu var: Eyalet & Durum.

Gerekli niteliklerle doldurulmalıdır:

Cihaz Özelliği — cihazı başlatmak için cihaza aktardığımız varsayılan değerler; GPS kartı için sistemdeki kartın adını aktarmanız gerekir com = "/dev/ttyUSB0" ve com bağlantı noktası hızı baudrade=9600

Komutları — cihazımızı kontrol etmek için komutlar; bunlara argümanlar ve bir dönüş değeri verilebilir.

  • BELİRTMEK, BİLDİRMEK - mevcut durumu döndürür Devletler
  • DURUMU - mevcut durumu döndürür; bu, dizenin tamamlayıcısıdır BELİRTMEK, BİLDİRMEK
  • GPS Dizisi - İadeler gps formdaki dize DevVarCharArray

Daha sonra, okunabilecek/yazılabilecek cihaz özelliklerini ayarlayın.
Skaler Nitelikler — basit nitelikler (karakter, dize, uzun vb.)
Spektrum Nitelikleri - tek boyutlu diziler
Görüntü Özellikleri - iki boyutlu diziler

Devletler — cihazımızın bulunduğu eyalet.

  • AÇIK — cihaz açık.
  • KAPAT - cihaz kapalı.
  • BAŞARISIZ - hata.
  • ON — cihazdan veri alın.
  • KAPALI — cihazdan veri yok.

Özellik ekleme örneği gps_string:

Tango Kontrolleri

Oylama dönemi ms cinsinden süre, gps_string değerinin ne sıklıkta güncelleneceği. Güncelleme zamanı belirtilmezse özellik yalnızca istek üzerine güncellenecektir.

Çıktı:

Tango Kontrolleri

Şimdi kodu oluşturmanız gerekiyor Dosya->Oluştur

Tango Kontrolleri

Varsayılan olarak Makefile oluşturulmaz; ilk kez oluşturmak için kutuyu işaretlemeniz gerekir. Bu, üzerinde yapılan değişikliklerin yeni nesilde silinmemesi için yapılır. Bunu bir kez oluşturduktan ve projeniz için yapılandırdıktan sonra (derleme anahtarlarını, ek dosyaları kaydedin), bunu unutabilirsiniz.

Şimdi programlamaya geçelim. pogo ile bizim için aşağıdakileri oluşturdu:

Tango Kontrolleri

NEO6M.cpp ve NEO6M.h ile ilgileneceğiz. Bir sınıf yapıcısının örneğini ele alalım:

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
}

Burada ne var ve önemli olan ne? init_device() işlevi niteliklerimiz için bellek ayırır: gps_string & gps_dizisiama önemli değil. Burada en önemli şey, bunlar yorumlar:

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

Bu yorum bloğunun içindeki her şey sonraki kod yeniden oluşturma işlemleri sırasında pogo'ya dahil edilmeyecektir. uzaklaş!. Bloklarda olmayan her şey olacak! Bunlar programlayabileceğimiz ve kendi düzenlemelerimizi yapabileceğimiz yerlerdir.

Şimdi sınıfın içerdiği ana işlevler nelerdir? NEO6M:

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

Özellik değerini okumak istediğimizde gps_string, işlevler aşağıdaki sırayla çağrılacaktır: her zaman_executed_hook, read_attr_hardware и read_gps_string. Read_gps_string, gps_string'i değerle dolduracaktır.

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
}

Derleme

Kaynak klasöre gidin ve:

make

Program ~/DeviceServers klasörüne derlenecektir.

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

JİV

jive

Tango Kontrolleri

Veritabanında zaten bazı cihazlar var, şimdi kendimizinkini oluşturalım Düzenle->Sunucu Oluştur

Tango Kontrolleri

Şimdi ona bağlanmayı deneyelim:

Tango Kontrolleri

Hiçbir şey işe yaramayacak, önce programımızı çalıştırmamız gerekiyor:

sudo ./NEO6M neo6m -v2

Com bağlantı noktasına yalnızca haklarla bağlanabiliyorum köks. v — kayıt düzeyi.

Artık bağlanabiliriz:

Tango Kontrolleri

Müşteri

Grafiklerde resimlere bakmak kesinlikle iyidir, ancak daha kullanışlı bir şeye ihtiyacınız var. Cihazımıza bağlanıp ondan okumalar alacak bir client yazalım.

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

Nasıl derlenir:

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

Sonuç:

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

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

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

Sonucu, bir dizenin ve bir karakter dizisinin niteliklerini alan bir komut dönüşü olarak aldık.

referanslar

Makaleyi kendim için yazdım çünkü bir süre sonra nasıl ve ne yapacağımı unutmaya başladım.

İlginiz için teşekkür ederiz.

Kaynak: habr.com

Yorum ekle