Tango Controls / Хабр |
您所在的位置:网站首页 › neo6m › Tango Controls / Хабр |
![]() Это система для управления различным оборудованием и программным обеспечением. TANGO поддерживает 4 платформы на данный момент: Linux, Windows NT, Solaris и HP-UX. Здесь будет описана работа с Linux(Ubuntu 18.04) Для чего нужно?Упрощает работу с различным оборудованием и софтом. Вам не нужно думать о том как хранить данные в БД, это уже сделано за Вас. Нужно только описать механизм опроса датчиков. Сводит весь Ваш код к одному стандарту. Где взять? исходники инструкция по установке образ TangoBox на базе UbuntuИз исходников не смог ее запустить, для работы использовал готовый образ TangoBox 9.3. В инструкции описано как ставить из пакетов. Из чего она состоит? JIVE — служит для просмотра и редактирования базы данных TANGO. POGO — генератор кода для серверов устройств TANGO. Astor — программный менеджер для системы TANGO.Нас будут интересовать только первые два компонента. Поддерживаемые языки программирования C C++ Java JavaScript Python Matlab LabVIEWЯ работал с ней на python & c++. Здесь в качестве примера будет использоваться c++. Теперь перейдем к описанию как подключить устройство к TANGO и как с ним работать. В качестве примера будет взята плата GPS neo-6m-0-001: Как видно на картинке плату к ПК подключаем через UART CP2102. При подключении к ПК появляется устройство /dev/ttyUSB[0-N], обычно /dev/ttyUSB0. POGOТеперь запустим pogo, и с генерируем скелет код для работы с нашей платой. pogoУ меня уже был создан код, создадим его заново File->New. Получаем следующее: Наше устройство(под устройством в дальнейшем будет иметься ввиду программная часть) пустое и имеет две команды управления: State & Status. Его нужно заполнить необходимыми атрибутами: Device Property — значения по умолчанию которые передаем в устройство для его инициализации, для платы GPS нужно передать имя платы в системе com="/dev/ttyUSB0" и скорость com порта baudrade=9600 Commands — команды управления нашим устройством, им можно задать аргументы и возвращаемое значение. STATE — возвращает текущее состояние, из States STATUS — возвращает текущий статус, это строковое дополнение к STATE GPSArray — возвращает gps строку в виде DevVarCharArrayДалее задаются атрибуты устройства которые можно читать/писать в/из него. Scalar Attributes — простые атрибуты (char, string, long и т.п.) Spectrum Attributes — одномерные массивы Image Attributes — двумерные массивы States — состояния в котором находится наше устройство. OPEN — устройство открыто. CLOSE — устройство закрыто. FAILT — ошибка. ON — принимаем данные с устройства. OFF — нет данных с устройства.Пример добавления атрибута gps_string: Polling period время в мс, как часто будет обновляться значение gps_string. Если время обновления не задать, то атрибут будет обновляться только по запросу. Получилось: Теперь нужно с генерировать код File->Generate По умолчанию Makefile не генерируется, в 1-ый раз нужно поставить галочку что бы его создать. Это сделано для того что бы внесенные в него правки не удалялись при новой генерации. Создав его единожды и настроив под свой проект(прописать ключи компиляции, доп. файлы) можно забыть про него. Теперь переходим непосредственно к программированию. 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_string & gps_array, но это не важно. Самое важное здесь, это комментарии: /*----- 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 &attr_list); void read_gps_string(Tango::Attribute &attr); void read_gps_array(Tango::Attribute &attr);Когда мы захотим прочитать значение атрибута gps_string, будут вызваны функции в следующем порядке: always_executed_hook, read_attr_hardware и read_gps_string. В read_gps_string произойдет заполнение gps_string значением. void NEO6M::read_gps_string(Tango::Attribute &attr) { DEBUG_STREAM 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 jiveВ БД уже есть какие-то устройства, создадим теперь наше Edit->Create Server Теперь попробуем подключиться к нему: Ни чего не выйдет, сначала надо запустить нашу программу: sudo ./NEO6M neo6m -v2Подключиться к com порту у меня можно только с правами root-а. v — уровень логирования. Как запустить несколько устройств.Для того что бы запустить несколько таких устройств, необходимо создать нужное количество Devices в Jive:
Для каждого задать свои Properties. Адрес устройства и скорость подключения. Теперь запускаем: sudo ./NEO6M neo6m -v2У нас запуститься два устройства сразу. Теперь можем подключиться: В графике смотреть на картинки конечно хорошо, но нужно что-то более полезное. Напишем клиент который будет подключаться к нашему устройству и забирать с него показания. #include 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 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 write_attribute(value); // // Пример записи абстрактного spectrum атрибута доступного на запись. // vector array(5); DeviceAttribute attr_in; attr_in.set_name("attr_array"); attr_in write_attribute(attr_in); } catch (DevFailed &e) { Except::print_exception(e); exit(-1); } }Как компилировать: g++ gps.cpp -I/usr/local/include/tango -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Получили результат в качестве возврата команды, взятия атрибутов строки и массива символов. Ссылки Исходные кодыСтатью писал для себя, потому что спустя некоторое время начинаю забывать как и что делать. Спасибо за внимание. |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |