Использование OpenCPN для автоматизации производства

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.
Экран OpenCPN до модификации
Экран OpenCPN до модификации

Предыдущая статья

15 января 2020 года я опубликовал статью: "IT техническая сторона яхтинга"

IT техническая сторона яхтинга / Хабр (habr.com)

Которая вызвала интерес у читателей. В этой статье я продолжаю тему автоматизации яхты. И на конкретном примере рассказываю о развитии популряной программы OpenCPN/OpenCPN: A concise ChartPlotter/Navigator. A cross-platform ship-borne GUI application supporting * GPS/GPDS Postition Input * BSB Raster Chart Display * S57 Vector ENChart Display * AIS Input Decoding * Waypoint Autopilot Navigation (github.com), которая по сути является индустриальной программой написанной в хорошем стиле. Кроме того в силу использования wxWidget весть код нативный и может собираться на нескольких целевых платформах. Таких, как Linux, Windows, Android, macOS.

Задача

На производстве используются электронные весы для подсчета количества отгруженных мелких деталек. Нужно было усовершенствовать эти весы, чтобы они отображали в реальном режиме времени прогресс диалог на основе веса детальки, числовое значение веса которой достаётся из базы данных.

Или другими словами задача замены ордера на производство его электронной версией с функциями контроля отгрузки и распечатки этикеток с QR кодами.

Подход к решению на основе OpenCPN

Вспомнив, что популярная и лёгкая программа OpenCPN уже имеет реализацию для настройки гибкого и быстрого окружения пользователя. Что она подходит для работы на непроизводительном железе. И самое главное имеет реализацию протокола работы с COM->USB интерфейсом для GPS, который во многом схож с протоколом электронных китайских весов.

Так как я интересуюсь яхтингом и у меня есть задача создания навигационной системы с тачэкраном. И для весов также был нужно управление путем тыканья одним пальцем по экрану. То я и выбрал OpenCPN для этой задачи.

Особенности проекта

Для прототипа были использованы компоненты компании Olimex.
A20-OLinuXino-Micro.pdf (olimex.com)

Микрокомпьютер Olimex
Микрокомпьютер Olimex

В частности ARM компьютер на базе процессора AllWiner. Я использовал A20, так как у меня был один в запасе. Позже я приобрел наиболее продвинутую плату A20-MICRO с индустриальным диапазоном температур на основ процессора T2, который в точности соответствует по геометрии и функционалу процессору A20. Плата имеет emmc память, поэтому прошивка устройства загружается и работает прямо с микросхемы, без посредсва микро SD карты.

Так же была заказана LCD панель (LCD-OLinuXino-15.6FHD - Open Source Hardware Board (olimex.com)) максимального размера и разрешения и ультразвуковой тачскрин (LCD-TS15.6 (olimex.com)), который может работать в неблагоприятных условиях. Например во время сильного дождя. Или под ударами волн, в случае надежной изоляции от воды всей электронной начинки. Это кусок стекла, с прикрепленными по 3 углам 4 пьезоэлементами и специально рассчитанными лазерными рисками по периметру. Риски служат для отражения ультразвуковой волны и их плотность связана с вкладом в частоту конечного сигнала.

Ультразвуковой тачскрин
Ультразвуковой тачскрин

LCD панель подключается кабелем аналогичным IDE-40. Подобные шлейфы-кабели использовались для подключения флоппи драйва, DVD и жестких дисков предыдущего до SATA стандарта.

Так же был куплен металлический бокс и жесткий диск на 2 террабайта для хранения различных имиджей. Так как прошивок за более 5 лет производства Olinuxino накопилось довольно много. Не на всех прошивках все устройства поддерживаются, так как болгарская компания Olimex и её владелец Цветан и его брат не вкладывают деньги в подготовку и тестирование фирменных прошивок непосредственно. Но проводит несколько конференций для разработчиков в направлении Опен Соурсе Софтваре и Опен Соурсе Хардваре.

Изготовление корпуса устройства и подбор подходящего блока питания -- это отдельная задача. Дело в том что устройству необходимо 3 источника питания в диапазоне от 5 до 12 вольт. Скорее всего подойдёт, по возможности узкий, блок питания для компьютера.

Водостойкий корпус чартплотера

Так как наш завод выпускает окна для безрамного остекления (claroflex.ru), то корпус монитора решено было сделать из профиля, который используется для одного из наших продуктов.

Примерка тач-панели внутрь корпуса из профиля.
Примерка тач-панели внутрь корпуса из профиля.

Если следовать документации на ультразвуковой тачскрин и экран, то заступы могут быть до полутора сантиметров с каждой стороны экрана. Соответственно сама LCD панель меньшего размера.
Внутри профиля остается запас места для кабеля сенсоров и прочности достаточно для крепления корпуса самого микрокомпьютрера Olimex.

Работа над кодом

Первым делом была изучена часть кода, которая отвечала за разбор GPS протокола. И по аналогии был создан разбор протокола от автоматических весов.

uw · Ignat99/OpenCPN@3364ddf (github.com)

В результате нескольких итераций, распознавание было настроено с первого символа, а парсинг осуществлялся по пробелу. Для автоматических весов конкретной марки этого достаточно.

space · Ignat99/OpenCPN@112db20 (github.com)

Далее была выбрана библиотека для поддержки MySQL в C++ и все необходимые файлы были добавлены к коду OpenCPN.

DB work · Ignat99/OpenCPN@1e32d96 (github.com)

Давно хотел добавить базу данных к OpenCPN для хранения треков и прокладок курсов для яхты, а так же для хранения конфигурации оборудования и помощи в управлении. Можно использовать Базу данных и для бортового журнала и для автоматического заполнения данных о погоде взятых с погодной станции.

Элементы интерфейса готовой программы
Элементы интерфейса готовой программы

Оставшиеся коммиты были созданы для создания отдельной панели для доступа к базе данных и связывания в UI таблиц. Так, например, можно с помощью элементов поиска выбрать необходимые проекты, а уже кликнув на нужный проект найти записи по компонентам данного проекта.

Точно таким же образом в базе данных можно сохранять информацию по внутреннему устройству яхты, особенно всё что связано с электроникой и электрикой.

Плугины в OpenCPN

Это расширение основной программы. По сути каждый плугин это динамическая библиотека с несколькими стандартными вызовами со стороны основной программы OpenCPN.

Весь интерфейс сделан на основе фреймворка компонентов wxWidget (wxWidgets/wxWidgets: Cross-Platform GUI Library - Report issues here: https://trac.wxwidgets.org/ (github.com) ).

Основная точка входа для плугинов находиться в файле OpenCPN/src/pluginmanager.cpp. Этот класс PlugInManager отвечает за составление списка плугинов, за их инициализацию и передачу потока управления (нажатие на мышку и клавиатуру) в пулгины.

Также в этом файле находятся интерфейсы для передачи данных от устройств по специфическим протоколам. Рассмотрим для примера метод PlugInManager::SendNMEASentenceToAllPlugIns.

OpenCPN/pluginmanager.cpp at master · OpenCPN/OpenCPN (github.com)

Эта функция проходит по списку всех плугинов, проверяет флаги и в случае совпадения типа передает полученную от устройства часть данных в функцию, которая реализована уже внутри динамической библиотеки плугина.

Эта функция хорошая точка для вставки функции для тестирования потока данных от виртуального устройства. Именно в начале этой функции можно задать тестовую посылку, которая может потребоваться на этапе создания плугина.

Код самих плугинов находится в отдельной папке (OpenCPN/plugins at master · OpenCPN/OpenCPN (github.com)). Это связано с тем что плугины создают различные вендоры и по сути это папка платформы OpenCPN в которой располагаются различные плугины. Плугины можно сравнить с приложениями в Android или Windows.

Требования для компилятора плугинов и состава библиотек могут не соответствовать старым версиями OpenCPN, поэтому компиляция отдельных плугинов может оказаться отдельной задачей.

Рассмотрим для примера плугин dashboard_pi. Помимо папки с исходными кодами, есть папка для i18n, где содержатся переводы строк текста на различные языки. В папке src могут находиться дополнительные каталоги для библиотек различных протоколов и сериализации JSON. Часто эти библиотеки просто копируют из основного кода.

Обратим внимание на файл dashboard_pi.cpp и метод dashboard_pi::SetNMEASentence(OpenCPN/dashboard_pi.cpp at v4.0.0 · OpenCPN/OpenCPN (github.com) ). По образу этого метода можно создать свой метод для поддержки разбора данных от вашего уникального устройства.

Ключевыми являют 2 строчки кода. Первая осуществляет сравнение префикса сообщения с образцом (OpenCPN/dashboard_pi.cpp at v4.0.0 · OpenCPN/OpenCPN (github.com)). И еще одна строчка осуществляет отправку полученной информации в конкретный инструмент (OpenCPN/dashboard_pi.cpp at v4.0.0 · OpenCPN/OpenCPN (github.com)).

Инструменты

Инструменты на яхтенном жаргоне это дисплеи которые выводят параметры. Например скорость, силу и направление ветра, координату, расстояние до цели, наличие преград и опасностей в заданном радиусе и т.д.

Описание основных инструментов для данного плугина нахоиться в файле instrument.cpp (OpenCPN/instrument.cpp at v4.0.0 · OpenCPN/OpenCPN (github.com))

Каждый инструмент содержит несколько стандартных методов. А именно: Инициализатор, Установку размера, Отрисовку и обновление Данных.

Если вы хотите создать свой уникальный инструмент, который выбирается из меню Дашбордов, то необходимо просто поменять содержимое этих функций под ваши задачи. Например тип получаемы данных, фоновое изображение, единицы измерения. Так же можно добавить любые другие методы обработки данных или отрисовки.

Перспективы и планы развития OpenCPN

Естественно для мониторинга параметров был использован механизм плугинов, что позволило создать специальный дашборд с набором инструментов необходимых для поддержания автоматических электронных весов. Так потребовались данные из базы для веса и количества каждого компонента, а так же универсальная формула для расчета индикатора ProgressDialog в процессе взвешивания необходимых элементов.

Аналогичные диалоги можно использовать для вывода показаний ветра и автоматического расчёта оптимального курса на каждый момент времени. Эти данные помогут создать необходимые настройки, уникальные для каждой конкретной яхты и погодных условий, для автопилота.

Автопилоты

Мне известны 4 основных типа автопилота. Причем один из них, я бы назвал его первым, он легендарный. Таким автоконтролем обладала лодка Джошуа Слокам - Спрей. Устойчивость на курсе обеспечивалось симметричностью носовых и кормовых обводов.

Проект яхты для Виктора Языкова Wind M
Проект яхты для Виктора Языкова Wind M

Этим же типом автоконроля обладают современные лодки и проекты Виктора Языкова. Например мой любимый проект WIND M. Обычно такие лодки в состоянии построить очень опытные моряки с навыком самодельного строительства по самым современным технологиям и на лучшем технически современном уровне. Обводы этих яхт, плюс размещение мачт, тип парусного снаряжения, смещенный к корме киль, а так же выдвигаемый шверт или шверты позволяют тонко настраивать яхту на любой курс ветра при любом волнении. По сути эти яхты управляются "по воле мысли" (Конечно, не мыслью, а ручками настаиваешь яхту на прямолинейный ход), без специальных механических устройств. Можно сказать так - "При длительной практике в несколько месяцев руки настраивают яхту на автомате, без особых размышлений -- достаточно только одной мысли о настройке".

Ветрорулевой
Ветрорулевой

Второй тип -- стандартное механическое ветроподруливающе устройство. Такое стоит на моей яхте.Суть устройства простая -- при давлении ветра с одной стороны, специальное дополнительное перо руля поворачивает в противоположную сторону и возвращает лодку на заданный курс относительно ветра. То есть если ветер идёт по дуге, то яхта так же будет двигаться в соответствии с ветром, но в направлении киля, который сдерживает боковой дрейф на курсах галфинд и бакштаг.

Чаще всего выходит из строя сложная механика или механические предохранители снятия нагрузки при порывах ветра. Устройство баллера и пера руля так же более подвержены механическим повреждениям в случае наваливание на препятствие, чем более массивный штатный руль.

Третий тип - электрорулевой. Внутри электромотор, пасики, червячная передача, электрогироскоп. Усилие на руле на этом типе сравнимое с усилием человека на хорошо сбалансированной яхте. Когда сила давления на парус ветра уравновешивается силой давления воды на перо руля. Можно догадаться что в шторм электрорулевые слишком слабые.

Основная поломки это обрыв пасика и\или стачивание пластиковых микросхем из-за черезмерного усилия на румпеле во время порывов ветра. Соответственно для дальних переходов надо иметь запасные части для вашего типа электрорулевого.

Кстати, именно галфинд самый не удобный курс. Именно поэтому большое распространение получил третий тип -- электроподруливающее устройство с гироскопом. На не больших яхтах оно крепится одним концом к корпусу яхты, а другим к румпелю или штурвалу и управляет непосредственно основным пером руля через баллер как заправский вахтенный. На больших яхтах устанавливают автопилот на гидравлике с приводом непосредственно на ось руля. Чаще гидро, но есть и электроприводы на авторулевых. И чаще непосредственно на баллер, но есть и на румпель или штурвал.

Гидроавторулевые хорошо работают в шторм, до момента поломки. Чаще всего это прорыв старых шлангов высокого давления от сильного импульса переданного волной при ударе в перо руля или другие стандартные поломки техники с гидравликой.

К четвертому виду автоподруливающих устройств, я бы отнёс, электронные автопилоты. Внутри схемы находиться микропроцессор, MEMS акселерометр, GPS и т.д. Естественно, сенсоры могут быть вынесены в любое место на яхте и посредством проводов или беспроводной связи по специальным протоколам передают данные в центральный микропроцессор. Такие автопилоты способны менять программу управления в зависимости от проложенного курса, показания GPS, состояния ветра, AIS, зарегистрированных помех радаром (невидимых) или видеокамерой (видимых). Именно такого автопилота можно сделать на основе устройства (OLinuxino A20 Olimex), которое я использовал на своей яхте.

Поломки этого типа оборудования связаны с повреждением солёной водой непосредственно электронные платы внутри корпуса. Поэтому эти устройства либо должны быть защищены водостойкими корпусами, и водостойкими разъёмами, либо находится внутри сухого корпуса яхты, водоизолированного отсека или водонепроницаемого внешнего контейнера. Так как управление непосредственно обеспечивается через электроавтопилот третьего типа, то добавляются еще и характерные поломки связанные с обрывом пасика и снашиванием пластмассовых механических частей внутри электропилота.

SDR

Ещё одно направление это подключение SDR для мониторинга окружающих судов через AIS и коррекция курса в соответствии с полученными данными.

Amazon.com: RTL-SDR Blog V3 R820T2 RTL2832U 1PPM TCXO HF Bias Tee SMA Software Defined Radio with Dipole Antenna Kit: Electronics

Для начала можно сделать софт, который будет давать рекомендации. Если после длительного использования эти программы будут протестированы временем на безопасность, то можно добавить этот код для автоматического маневра посредством автопилота.

BlueTooth

Ещё одно направление -- это интеграция OpenCPN через BT с внешними интеллектуальными устройствами. Вот таким хорошим примером может быть личная радиостанция с функций человек за бортом, которая составляет важный элемент безопасности экипажа. Так как подобные личные радиостанции закреплены физически на каждом участнике перехода, который выходит на вахту.

Amazon.com: Uniden MHS335BT 6W Class D Floating Handheld VHF Marine Radio with Bluetooth, Text Message Directly To Other Vhf Text Message Capable Radios, IPX8 Submersible Design

Благодарности

Благодарю моих коллег по предприятию: Пако за предоставленную возможность выполнить такой проект, Хави за многочисленные консультации по техническим вопросам, опытным сотрудникам предприятия за качественное изготовление корпуса и помощь с дополнительными материалами.

Эдуардо за помошь в установке тяжёлого ветроподруливающего устройства за кормой моей яхты. Так же там надо еще диагональные нержавеющие перехваты в раме приварить.

А также яхтенного капитана Виталия Елагина (oceanschool.ru) за консультации по технической части автопилотов и соавторство по тексту абзацев во время его морского перехода в районе севера: Мурманск - Соловецкие острова.

Источник: https://habr.com/ru/post/572736/


Интересные статьи

Интересные статьи

Контракт между бэкендным сервисом и фронтендным потребителем (или клиентом) обычно является местом соединения двух миров. Такой контракт может принимать форму спецификации REST API, конечной точки G...
Использование гибридного облака: применение CDP Cloud для оценки рисков, связанных с COVID-19 В этой серии статей я продемонстрирую, как использовать мощные возможности г...
Продолжение цикла статей про редактор ассемблера для ARM микроконтроллеров под компилятор GNU ASпредыдущая статья Assembler Editor Plus: Первый проектпод катом будет ско...
Каждые несколько лет в индустрии разработки ПО происходит смена парадигмы. Одним из таких явлений можно признать рост интереса к концепции микросервисов. Хотя микросервисы — это технология не сам...
Два года назад я писал о методике, которую сейчас обычно называют паттерном module/nomodule. Её применение позволяет писать JavaScript-код, используя возможности ES2015+, а потом применять бандле...