Sterowanie tangiem

Sterowanie tangiem

Co to jest TANGO?

Jest to system do zarządzania różnorodnym sprzętem i oprogramowaniem.
TANGO obsługuje obecnie 4 platformy: Linux, Windows NT, Solaris i HP-UX.
Tutaj opiszemy pracę z Linuksem (Ubuntu 18.04)

Po co to jest?

Ułatwia pracę z różnorodnym sprzętem i oprogramowaniem.

  • Nie musisz zastanawiać się jak przechowywać dane w bazie danych, zostało to już zrobione za Ciebie.
  • Konieczne jest jedynie opisanie mechanizmu czujników odpytujących.
  • Redukuje cały kod do jednego standardu.

Skąd je wziąć?

Nie udało mi się go uruchomić z kodu źródłowego, do pracy użyłem gotowego obrazu TangoBox 9.3.
Instrukcje opisują sposób instalacji z pakietów.

Z czego to się składa?

  • JIVE — służy do przeglądania i edycji bazy danych TANGO.
  • POGO — generator kodu dla serwerów urządzeń TANGO.
  • Astor — kierownik programu dla systemu TANGO.

Nas będą interesować tylko dwa pierwsze elementy.

Obsługiwane języki programowania

  • C
  • C + +
  • Java
  • JAVASCRIPT
  • Python
  • matlab
  • LabVIEW

Pracowałem z nim w Pythonie i C++. Tutaj jako przykład zostanie użyty C++.

Przejdźmy teraz do opisu jak podłączyć urządzenie do TANGO i jak z nim pracować. Opłata zostanie podana jako przykład GPS neo-6m-0-001:

Sterowanie tangiem

Jak widać na zdjęciu płytkę łączymy z komputerem PC poprzez UART CP2102. Po podłączeniu do komputera urządzenie pojawia się /dev/ttyUSB[0-N], zwykle /dev/ttyUSB0.

POGO

Teraz uruchommy pogoi wygeneruj szkieletowy kod do pracy z naszą tablicą.

pogo

Sterowanie tangiem

Już stworzyłem kod, utwórzmy go jeszcze raz Plik->Nowy.

Sterowanie tangiem

Otrzymujemy co następuje:

Sterowanie tangiem

Nasze urządzenie (w przyszłości przez urządzenie będziemy rozumieć część programową) jest puste i posiada dwa polecenia sterujące: Stan & Rynek.

Należy go wypełnić niezbędnymi atrybutami:

Właściwość urządzenia — wartości domyślne, które przekazujemy do urządzenia w celu jego inicjalizacji; w przypadku tablicy GPS należy przenieść nazwę tablicy w systemie com="/dev/ttyUSB0" i prędkość portu com prędkość=9600

Polecenia — polecenia sterujące naszym urządzeniem, można im podawać argumenty i wartość zwracaną.

  • STAN - zwraca aktualny stan, z Zjednoczone
  • STATUS - zwraca aktualny status, jest to uzupełnienie ciągu STAN
  • Tablica GPS - zwroty GPS ciąg znaków w formularzu DevVarCharArray

Następnie ustaw atrybuty urządzenia, które można na nim czytać/zapisywać.
Atrybuty skalarne — proste atrybuty (char, string, long itp.)
Atrybuty widma - tablice jednowymiarowe
Atrybuty obrazu - tablice dwuwymiarowe

Zjednoczone — stan, w jakim znajduje się nasze urządzenie.

  • OPEN — urządzenie jest otwarte.
  • ZAMKNIJ - urządzenie jest zamknięte.
  • BŁĄD - błąd.
  • ON — odbierać dane z urządzenia.
  • OFF — brak danych z urządzenia.

Przykład dodania atrybutu gps_string:

Sterowanie tangiem

Okres odpytywania czas w ms, jak często wartość gps_string będzie aktualizowana. Jeżeli czas aktualizacji nie zostanie określony, atrybut zostanie zaktualizowany tylko na żądanie.

Stało się:

Sterowanie tangiem

Teraz musisz wygenerować kod Plik->Generuj

Sterowanie tangiem

Domyślnie plik Makefile nie jest generowany; za pierwszym razem należy zaznaczyć to pole, aby go utworzyć. Odbywa się to tak, aby wprowadzone w nim zmiany nie zostały usunięte podczas nowej generacji. Po jednorazowym utworzeniu i skonfigurowaniu dla swojego projektu (rejestr kluczy kompilacji, dodatkowe pliki) możesz o tym zapomnieć.

Przejdźmy teraz do programowania. pogo z wygenerowało dla nas następujące informacje:

Sterowanie tangiem

Będziemy zainteresowani NEO6M.cpp i NEO6M.h. Weźmy przykład konstruktora klasy:

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
}

Co tam jest i co jest tutaj ważne? Funkcja init_device() przydziela pamięć dla naszych atrybutów: gps_string & tablica_gps, ale to nie jest ważne. Najważniejsza rzecz tutaj, oto komentarze:

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

Wszystko, co znajduje się w tym bloku komentarza, nie zostanie uwzględnione w pogo podczas kolejnych regeneracji kodu odejść!. Wszystko, czego nie ma w blokach, będzie! To są miejsca, w których możemy programować i wprowadzać własne zmiany.

Jakie są teraz główne funkcje zawarte w klasie? 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);

Gdy chcemy odczytać wartość atrybutu gps_string, funkcje zostaną wywołane w następującej kolejności: zawsze_wykonany_hook, read_attr_hardware и odczyt_gps_string. Read_gps_string wypełni gps_string wartością.

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
}

Kompilacja

Przejdź do folderu źródłowego i:

make

Program zostanie skompilowany do folderu ~/DeviceServers.

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

JIVE

jive

Sterowanie tangiem

W bazie danych znajduje się już kilka urządzeń, stwórzmy teraz własne Edytuj->Utwórz serwer

Sterowanie tangiem

Teraz spróbujmy się z nim połączyć:

Sterowanie tangiem

Nic nie będzie działać, najpierw musimy uruchomić nasz program:

sudo ./NEO6M neo6m -v2

Z portem com mogę się połączyć tylko z uprawnieniami korzeń-a v — poziom logowania.

Teraz możemy się połączyć:

Sterowanie tangiem

Klient

W grafice oglądanie zdjęć jest z pewnością dobre, ale potrzebujesz czegoś bardziej przydatnego. Napiszmy klienta, który połączy się z naszym urządzeniem i pobierze z niego odczyty.

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

Jak skompilować:

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

Wynik:

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

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

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

Wynik otrzymaliśmy jako zwrot polecenia, pobierając atrybuty ciągu i tablicę znaków.

referencje

Artykuł napisałam dla siebie, bo po pewnym czasie zaczynam zapominać jak i co robić.

Dziękuję za uwagę.

Źródło: www.habr.com

Dodaj komentarz