Танго контроли

Танго контроли

Какво е TANGO?

Това е система за управление на различен хардуер и софтуер.
В момента TANGO поддържа 4 платформи: Linux, Windows NT, Solaris и HP-UX.
Тук ще опишем работата с Linux (Ubuntu 18.04)

За какво е?

Улеснява работата с различно оборудване и софтуер.

  • Не е нужно да мислите как да съхранявате данни в базата данни, това вече е направено вместо вас.
  • Необходимо е само да се опише механизмът за анкетиране на сензори.
  • Намалява целия ви код до един стандарт.

Къде да го получи?

Не можах да го стартирам от изходния код; използвах готово изображение на TangoBox 9.3, за да работя.
Инструкциите описват как да инсталирате от пакети.

В какво се състои?

  • ДЖИВ — използва се за преглед и редактиране на базата данни TANGO.
  • POGO — генератор на код за сървъри на устройства TANGO.
  • Астор — програмен мениджър на системата TANGO.

Ще ни интересуват само първите два компонента.

Поддържани езици за програмиране

  • C
  • C + +
  • Ява
  • JavaScript
  • Питон
  • MATLAB
  • LabVIEW

Работих с него в python & c++. Тук C++ ще бъде използван като пример.

Сега нека да преминем към описание на това как да свържете устройството към TANGO и как да работите с него. Таксата ще бъде взета като пример GPS нео-6м-0-001:

Танго контроли

Както можете да видите на снимката, свързваме платката към компютъра чрез UART CP2102. При свързване към компютър устройството се появява /dev/ttyUSB[0-N], обикновено /dev/ttyUSB0.

POGO

Сега да стартираме пого, и генериране на скелетен код за работа с нашата дъска.

pogo

Танго контроли

Вече създадох кода, нека го създадем отново Файл->Нов.

Танго контроли

Получаваме следното:

Танго контроли

Нашето устройство (в бъдеще под устройство ще разбираме софтуерната част) е празно и има две команди за управление: Област & Статус.

Той трябва да бъде попълнен с необходимите атрибути:

Свойство на устройството — стойности по подразбиране, които прехвърляме към устройството, за да го инициализираме; за GPS платката трябва да прехвърлите името на платката в системата com="/dev/ttyUSB0" и скорост на com порта бод = 9600

Команди — команди за управление на нашето устройство; могат да им бъдат дадени аргументи и върната стойност.

  • ДЪРЖАВНА - връща текущото състояние, от членки
  • СТАТУТ - връща текущия статус, това е допълнение към низа ДЪРЖАВНА
  • GPSArray - се завръща GPS низ във формата DevVarCharArray

След това задайте атрибутите на устройството, които могат да се четат/записват на/от него.
Скаларни атрибути — прости атрибути (char, string, long и т.н.)
Атрибути на спектъра - едномерни масиви
Атрибути на изображението - двумерни масиви

членки — състоянието, в което се намира нашето устройство.

  • OPEN — устройството е отворено.
  • CLOSE — устройството е затворено.
  • ГРЕШКА - грешка.
  • ON — получаване на данни от устройството.
  • OFF — няма данни от устройството.

Пример за добавяне на атрибут gps_низ:

Танго контроли

Избирателен период време в ms, колко често ще се актуализира стойността на gps_string. Ако времето за актуализиране не е посочено, атрибутът ще се актуализира само при поискване.

Се случи:

Танго контроли

Сега трябва да генерирате кода Файл->Генериране

Танго контроли

По подразбиране Makefile не се генерира; първият път, когато трябва да поставите отметка в квадратчето, за да го създадете. Това се прави, за да не се изтрият направените в него промени при ново поколение. След като го създадете веднъж и го конфигурирате за вашия проект (ключове за компилация на регистър, допълнителни файлове), можете да забравите за него.

Сега да преминем към програмирането. pogo с генерира следното за нас:

Танго контроли

Ще се интересуваме от NEO6M.cpp & NEO6M.h. Нека вземем пример за конструктор на клас:

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
}

Какво има и какво е важно тук? Функцията init_device() заделя памет за нашите атрибути: gps_низ & gps_масив, но не е важно. Най-важното тук, това са коментарите:

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

Всичко, което е вътре в този блок за коментари, няма да бъде включено в pogo по време на следващите регенерации на кода Махни се!. Всичко, което не е в блокове, ще бъде! Това са местата, където можем да програмираме и правим собствени редакции.

Сега какви са основните функции, които съдържа класът? 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);

Когато искаме да прочетем стойността на атрибута gps_низ, функциите ще бъдат извикани в следния ред: винаги_изпълнена_кука, read_attr_hardware и read_gps_string. Read_gps_string ще запълни gps_string със стойността.

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
}

компилация

Отидете в папката източник и:

make

Програмата ще бъде компилирана в папката ~/DeviceServers.

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

ДЖИВ

jive

Танго контроли

Вече има някои устройства в базата данни, нека сега създадем нашето Редактиране->Създаване на сървър

Танго контроли

Сега нека се опитаме да се свържем с него:

Танго контроли

Нищо няма да работи, първо трябва да стартираме нашата програма:

sudo ./NEO6M neo6m -v2

Мога да се свържа с com порта само с права корен-и. v — ниво на регистриране.

Сега можем да се свържем:

Танго контроли

клиент

В графиката гледането на картини със сигурност е добро, но имате нужда от нещо по-полезно. Нека напишем клиент, който ще се свърже с нашето устройство и ще вземе показания от него.

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

Как се компилира:

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

Резултати:

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

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

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

Получихме резултата като команда return, като взехме атрибутите на низ и масив от знаци.

Позоваването

Написах статията за себе си, защото след известно време започвам да забравям как и какво да правя.

Благодаря ви за вниманието.

Източник: www.habr.com

Добавяне на нов коментар