Pull to refresh

Нелегкий путь от идеи до коммерческой системы промышленного мониторинга

Reading time15 min
Views19K
В этой заметке я хочу поделиться опытом и рассказать о пути, который мы прошли, разрабатывая промышленный программно-аппаратный комплекс WebHMI для мониторинга инженерных систем. Под катом много фотографий.



История WebHMI началась весной 2013 года. Тогда я загорелся идеей умного дома и на досуге делал всякие игрушки для автоматического включения света в туалете, сбора показаний со счетчиков воды и т.п. Однажды мой друг посмотрев на получившуюся систему и подумал что это можно продавать, и мы начали обдумывать – как и кому. Но получалось все как-то не элегантно. Чуть позже он пришел с другой идеей – нащупал пустующую нишу на рынке систем промышленной автоматизации. И мы реализовали ее.

Пролог


Ситуация была такой, что существующие решения на рынке автоматизации хорошо подходили для больших заводов с многомиллионными бюджетами, но в виду громоздкости и высокой стоимости были совершенно неприемлемы для среднего и малого бизнеса. Классические решения для мониторинга технологических процессов, SCADA системы, стоят много денег, требуют мощный промышленный ПК, лицензии на ОС и БД, требуют многих и многих часов работы квалифицированного инженера по настройке ПО и созданию проекта. Если у вас, например, небольшая теплица, то вкладывать десятки тысяч долларов в систему мониторинга нескольких десятков параметров вы, вероятно, не станете. А если таких теплиц, скажем, 10-20? А если они разнесены территориально? Стоимость таких систем сразу взлетает до небес, но они при этом все-равно плохо решают «небольшие» задачи. И совершенно не подходят для распределенных систем.

На другой чаше весов были HMI-панели. Они обладают относительно небольшой стоимостью (от нескольких сотен евро) и позволяют создать локальный интерфейс оператора для какой-либо небольшой системы. Как правило – одной установки. Однако такие панели обладают очень ограниченным функционалом и не удовлетворяют потребностей современных заказчиков.

На нишу между большими SCADA-системами и HMI-панелями мы и нацелились. Начали искать варианты того, что можно использовать в качестве ПО и аппаратной платформы. Очень быстро стало очевидно, что все прийдется делать самим, иначе заработать на решении не получится. Готовый промышленный ПК либо сделает решение слишком дорогим и неинтересным клиенту, либо не даст заработать. Готового ПО также не было.


Промышленный ПК, который мы не стали использовать

Забегая вперед, скажу, что у нас получилось создать продукт, который сравним по стоимости с HMI-панелью, но обладает несравнимо большим функционалом. Фактически, получилась полноценная SCADA-система. Причем, для разработки проектов на его базе не требуется никакое дополнительное ПО – разработка, а точнее конфигурирование, выполняется непосредственно в браузере. Весь необходимый софт идет в комплекте и работает на борту.

Процесс разработки любого устройства, а тем более промышленного, кардинально отличается от разработки ПО. Здесь цена ошибки несравнимо выше. Цикл «внесения изменения – проверка результата» длится неделями т.к. модификация платы требует заказа ее на производстве, сборки, наладки. А это — большие сроки изготовления, сроки доставки (из Китая), деньги на логистику, сборку, монтаж, отладку. Но, к счастью, в начале нашего пути мы этого не знали. А иначе не знаю решились бы играть в эту игру или нет.

Первые шаги


Разрабатывать свой ПК мы не взялись. Для этого банально не было ни опыта, ни денег, ни подходящих кадров. К тому же классические ПК слабо подходят для нашего применения. Мы представляли себе наш прибор как небольшую коробочку, которую можно разместить в шкафу автоматизации на DIN-рейку и запитать от имеющихся уже в шкафу 24В. Для этого решили взять подходящий готовый System-On-Module (SOM) и собирать «материнскую плату» с источником питания и всей необходимой для нас периферией. Задача казалась совсем несложной и реализуемой за несколько недель, максимум – месяцев.

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

Для первой версии ПО поставили себе задачу минимум – работа с протоколами Siemens PPI и Modbus ASCII/RTU. Т.к. у меня был большой опыт в веб-разработке, то интерфейс был изначально основан на веб-технологиях. В последствии это стало ключевой особенностью продукта.

Почему именно эти протоколы? Мы нашли потенциального заказчика – достаточно лояльного нам клиента, который был готов опробовать наш продукт для мониторинга своей установки по упаковке продукции. У него в парке оборудования были ПЛК семейств Siemens S7 200 и Delta DVP. Сейчас, конечно, список поддерживаемых протоколов намного шире. Можно, если нужно, даже писать свои протоколы на языке Lua. Но тогда об этом мы и не мечтали.

Итак, заручившись поддержкой потенциального клиента, мы начали разработку нашего продукта. Я считаю, что у нас получился правильный старт – мы решали конкретную задачу (отслеживание количества произведенной продукции), а не изобретали универсальное решение абстрактной проблемы. Иначе бы мы обязательно повязли в бесконечных желаниях добавить «еще одну» очень важную киллер-фичу, которая непонятно пригодилась ли бы хоть кому-то в реальной жизни.

В дальнейшем, все новые «фичи» добавлялись только по мере реальной необходимости. Когда уже очень припекало. Причем, если фича нужна только одному конкретному клиенту и ее никак нельзя сделать полезной другим клиентам – мы ее не добавляем. Делаем только то, что можно «продать» еще кому-то.

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

Софт писался параллельно с разработкой первой ревизией платы. Подробно рассказывать о процессе разработки ПО, я пожалуй, в этой заметке не буду т.к. многие читатели Гиктаймза хорошо знакомы с этим процессом. Скажу лишь то, что мне пришлось:

  • пересмотреть очень многие подходы к созданию ПО
  • переосмыслить С/С++ и подружиться с ним
  • освоить отладку самых мистических багов, которые возникают раз в месяц в случайное время на удаленных системах и приводят к краху системы
  • научиться очень экономно потреблять ресурсы системы
  • оптимизировать все что только можно и даже больше
  • научится писать софт, работающий месяцами без перезагрузки

Это связано, прежде всего, с весьма ограниченными ресурсами выбранного SOM – 400MHz CPU, 64MB ОЗУ, 16 MB Flash-памяти. Делать web-сайты, которые бы хостились на таком «сервере» – ой как непросто. Но тем не менее, у нас на борту есть и PHP, и база данных, и Nginx, и много других «плюшек». И при этом система может работать с потрясающей отзывчивостью – например, можно рисовать тренды, которые обновляются 20 раз в секунду.

Первая версия ПО была, скажем так, лишь проверкой идеи. Мы больше проверяли, что на этой платформе вообще можно реализовать то, на что мы замахнулись. Через 3-4 месяца разработки, худо-бедно, но софт «ожил». У нас появился веб-интерфейс, где можно было самому создавать экраны для отображения и визуализации данных с ПЛК. Данные читались в фоне и браузер постоянно обновлял информацию на экране компьютера, планшета или телефона в режиме реального времени. Ориентированность на веб стала краеугольным камнем нашего продукта – это позволяет использовать почти любую операционную системы и любое устройство для отображения интерфейса оператора, от телефона до Smart TV. Также это позволяет гибко интегрироваться в сетевую инфраструктуру, работать удаленно через интернет и т.п.

Первый наш проект состоял из двух десятков регистров (переменных, читаемых из ПЛК). Тогда мы планировали, что WebHMI будет применяться как раз для мониторинга небольших обособленных систем. Как же мы были скромны и неуверенны в себе тогда! Сейчас у наших клиентов есть проекты автоматизации магазинов и спортивных комплексов, где по две тысячи регистров. Но между первой альфой и текущей версией софта было более трех лет кропотливой разработки, отладки и оптимизаций.

Примерно тогда, когда была готова первая альфа-версия софта, наш хардварный инженер спроектировал и изготовил первую версию печатной платы устройства. Мы были счастливы наконец-то подержать в руках свое детище в первый раз! Это непередаваемые ощущения. Нас распирала гордость от того, что это именно мы сделали это устройство. Оно тогда было все еще как гадкий утенок – страшное. Но свое, родное.


Первая плата. Изготовлена в домашних условиях. Сейчас трудится у нас в офисе.

После сборки – обработать напильником


Корпус делать с нуля мы не стали. Это дорого, долго и сложно. Мы решили использовать один из имеющихся на рынке стандартных корпусов. Плата изначально проектировалась под конкретный корпус. Корпус выбрали «покрасивее» – итальянский. Ох, как же мы потом намучались с этой Италией! Но об этом чуть позже.

Корпус самого первого «изделия», фактически прототипа, мы фрезеровали вручную дремелем, доводили напильником. Получилось, конечно, не очень аккуратно. И шаг отверстий под светодиоды «поплыл», и прямоугольные отверстия оказались совсем не ровными. Но понять, как оно будет выглядеть, и, самое главне, поместить плату в корпус у нас вышло.


Первый корпус

Мы боялись, что разъемы не попадут куда нужно, что где-то напортачим. В целом, без ошибок не обошлось, но на удивление ничего фатального не было. Тут и там нужно было передвинуть разъемы на 1-2 мм и все. Разъемы, светодиоды и отверстия в корпусе мы двигали последующие, наверное, ревизий 10-15. Все время было что улучшить. Сходу сделать идеально все не выходило. Разъем Wi-Fi вообще пришлось заменить на нестандартный, более длинный. Т.к. некоторые антенны не хотели накручиваться на короткую резьбу.

Продажи


Что делать, когда готов первый прототип? Сразу его продавать! Но как просто показать клиенту промышленное устройство, которое взаимодействует с другими устройствами? Мы собрали демо-чемодан, в котором разместили минимальный джентельменский набор – ПЛК, блок питания, HMI-панель, и конечно же WebHMI.


Демо-чемодан

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

После презентации прототипа клиенту и получения одобрения с его стороны мы решили изготовить первую партию – 5-10 устройств. Как же это непросто и неоправданно дорого в нашей стране!

Идем в серию


Плата для прототипа была изготовлена в домашних условиях. А вот изготовление 12 простых двухслойных плат в Гальванотехнике обошлось в какие-то дурные по тем временам деньги (больше $100, кажется). Но качество плат и особенно шелковки заставляло плакать – почти кустарщина. Потом еще пробовали заказывать на заводе Этал. Также были разочарованы.


Слева – плата производства завода Этал. Справа – Китай.

Намного позже, когда мы заказали платы уже в Китае, мы снова прослезились. Качество было по сравнению с отечественными как небо и земля! Четкая шелковка, отверстия точно в центре падов, плотная и равномерная паяльная маска. Качество на два порядка выше местного производства при цене в три раза меньшей… Ну и кто после этого будет поддерживать отечественного производителя?


Платы из Китая. Aurix – кодовое имя проекта.

Комплектующие были куплены. Платы собраны, проверены. А вот с корпусами была беда.

У нас на руках было штук 5 образцов корпусов, которые мы хотели отфрезеровать на ЧПУ и нанести на них надписи. Но т.к. тираж у нас маленький, а изделие намного сложнее, чем привычная рекламщикам сувернирка, то найти желающих выполнить наш заказ было сложно. Практически, нереально. Корпус у нас сложной формы, для печати на нем нужно использовать тампонную печать. А она хороша когда есть большой тираж т.к. пристрелка и наладка процесса – дело сложное и неприятное. У нас получалось очень много оттисков на всего 5 корпусах. Никто не хотел браться за такую неблагодарную работу ведь на ней не заработаешь. С ЧПУ история аналогичная.

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


Первые коммерческие изделия в корпусе.

Но пока длилась эпопея с корпусами, мы смогли уже продать первое устройство! Срочно нужно было что-то ставить клиенту на объект. Корпусов готовых не было. Так что первое коммерческое устройство тоже фрезеровалось вручную на балконе и было без надписей. Корпус в наличии оставался только экстравагантно–зеленого цвета. Но это все было не важно. Важно что нам заплатили – значит, мы делаем то, что нужно людям.


Боевое «крещение»

Работа в промышленной среде


На этом объекте мы впервые столкнулись с тем, что называется Industrial – шум, пыль, наводки. Организовать устойчивую связь по шине RS-485 «на столе» не в пример проще, чем на реальном объекте. У нас постоянно глючила связь. Сколько мы намучались с этой шиной! Но, как потом оказалось, виной была… наводка на кабеле. Между землей и сигнальными линиями А и Б возникала разность потенциалов до 40В, импульсно и хаотично. И это на кабеле длиной 50 см! Причем наводку было видно только на осциллографе. На вольтметре все было в пределах нормы. Устранив причину наводок, мы стабилизировали связь и получили работающую систему. Смогли сдать работу и получить следующий заказ.

Почти сразу мы поняли, что продавать устройство самим – это непосильная задача. Нужно знать клиента, иметь с ним отношения, понимать его потребности. Так просто с улицы зайти и продать новый и уникальный продукт не выйдет. Много так мы не продадим. Многие люди до сих пор не сразу понимают что такое WebHMI когда мы им пытаемся рассказывать о системе. Поэтому мы решили делать продажи через дилеров-интеграторов – так продукт будет предлагать непосредственно интегратор. А он уже знает своих клиентов, у него есть большая база наработанных контактов, он сможет не только продать оборудование, но и выполнить проект на его базе. И клиента удовлетворит и сам заработает.

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

На этом проекте мы словили целую уйму проблем. Причем таких, о которых и не подозревали. Софт пришлось сильно доработать для оптимизации работы системы. Прочувствовали что такое утечки памяти, что такое отладка системы в другом городе. Аппаратную платформу также пришлось переделать почти с нуля! Изначально, мы предполагали что WebHMI будет питаться от хорошего и качественного промышленного блока питания 24В. Поэтому о помехозащищенности питания особо не переживали. Но в промышленных условиях все работает совсем не так, как в быту.

Один из проданных туда WebHMI зависал буквально через несколько минут работы. Что мы только не пробовали, и разные БП и фильтры, и ферритовые кольца, экранировали и заземляли все что могли. Ничего не помогало. Причем, второй WebHMI на другой печи работал стабильно. В итоге, мы полностью переделали схемотехнику WebHMI, добавив очень мощные фильтры от входных помех по питанию.

Второе поколение


Также, заменили много других компонент, много других – добавили. Память стала не в виде USB-модуля, а в виде SD-карты. Появился Li-Po аккумулятор для возможности правильно завершить работу и, при желании, иметь возможность работать до двух часов автономно. Это позволяет пережить короткие пропадания питания без выключения и перезагрузок. Также, можно подать сигнал «бедствия» в системы верхнего уровня. Добавили возможность отключить питание на внешнем USB-разъеме для сброса внешних 3G-модемов, которые любят периодически зависать. Перепробовали разные хабы, формирователи шины RS-485.

С шиной RS-485 было много сложностей. Обычно, они были связаны с тем, что интеграторы очень не любят покупать специальный кабель для RS-485. Вместо дорогого специального кабеля они используют обычную витую пару, считая это равноправной заменой. Смятения вносит и непонимание с их стороны основ работы этой шины. Распространен миф, что для работы этой шины достаточно всего двух проводов – А и Б. Но это не так. При работе в промышленных условиях, на длинной шине и при питании всех устройств от разных блоков питания или даже фаз, возникают разности потенциалов и третий, общий, провод крайне необходим для выравнивания потенциалов. Также, крайне желателен экран. Теперь у нас используется гальванически развязанный формирователь RS-485. Это повышает надежность.

После выпуска обновленной версии «железа» мы заменили все ранее установленные приборы на новые версии для собственного спокойствия.

Надежность


WebHMI может пережить многие ошибки монтажа «малой кровью». Но некоторые из них требуют обращения к нашему сервисному инженеру. Любимое развлечение интеграторов – подать 230В на RS-485. Кстати, это единственные причины обращения по поводу ремонтов! Если не насиловать наше оборудование неправильным монтажем, то все работает как часы вот уже много лет.


Последствия подключения 230В на шину RS-485.

С флеш-накопителями мы также имели много разных проблем. Он используется для хранения изображений и базы данных с журналами, графиками и всеми другими накопленными данными. USB DOM (Disk-On-Module), которые мы использовали изначально, были редкими, нестабильного качества и скорости, малого объема, непредсказуемой доступности. В итоге мы перешли на промышленные карты памяти. С картами памяти была отдельная эпопея.

WebHMI сейчас поставляется без карты памяти, т.к. всем нужен разный объем. Промышленные карты стоят существенно дороже, чем коммерческие. Поэтому выбор карты мы оставляем за клиентом – слишком уж большая вилка в цене и объемах карты. Кому-то хватит и 1GB, а кому-то подавай 32GB.

Мы всем рекомендуем использовать промышленные карты. Но новые клиенты, видимо желая сэкономить, пытаются использовать коммерческие карты из соседнего ларька. Для них нет разницы – если написано что это SD-карта, значит она должна работать. Логично? Нет. Такие карты живут недолго. И пока клиент не потеряет свои данные, он не хочет верить в то, что не все карты одинаковые. Коммерческие карты могут «умереть» буквально за несколько недель.

В поисках решения мы пришли к тому, что предлагаем вместе с прибором покупать сразу и промышленную карту у нас, так сказать «из одних рук». Что бы предлагать товар, в котором мы уверенны, пришлось провести большую исследовательскую работу. Сравнить много разных карт разных производителей, протестировать скорость записи, погонять их в промышленных условиях длинный срок. Опробовать разных поставщиков.


Представители Transcend у нас в офисе. Обсуждаем их продукцию.

Поиграем в тетрис?


Новая ревизия платы требовала место для установки дополнительных крупногабаритных компонентов. Т.к. места в корпусе не стало больше, то пришлось думать, как все это разместить внутри отведенного места. Мы придумали слепить бутерброд из трех плат. Это позволило использовать весь объем корпуса. Но это и привнесло дополнительные хлопоты в логистику и комплектацию.

Необходимо было найти стойки редкой длины, придумать как передавать уйму сигналов между платами (стандартные 2,54 мм пинхедеры занимают слишком много места). Придумать как передать еще одну уйму сигналов на переднюю панель, на которой добавились дополнительные светодиоды индикации наличия интернета и VPN-соединения, кнопки сброса сетевых настроек. Все это требовало поиска различных компонент, их поставщиков, согласования макетов, замеров всех габаритов со штангенциркулем и примерок в корпусе, производства пробных партий и повторных переделок. Платы стали многослойными. Этот процесс занял очень много сил, нервов и времени. Наверное, пол года.





Здесь виден внутренний номер ревизии платы V05.34L4. Расшифровывается он просто – 5-е поколение дизайна, 34-ая ревизия. Вдумайтесь, мы нарисовали, произвели и проверили 34 модификации плат, прежде чем дошли до этого этапа! Это большой путь. К слову сказать, после этого было всего две небольшие модификации.


Внешний вид устройства

Внешне WebHMI тогда тоже облагородился. Цвет надписей стал серым, надписи мы научились наносить сами. Решить проблему с фрезеровкой в нашей стране небольшими партиями за адекватные деньги мы смогли лишь временно. Нам отфрезеровали штук 50 корпусов, затем лавочка закрылась. Сейчас корпуса нам фрезеруют в Италии производитель корпусов. А вот надписи мы научились делать сами. Купили станок для тампонной печати, освоили технологию печати. Получается очень хорошо, даже лучше, чем у итальянцев. Оно и понятно — мы можем себе позволить вылизать до идеала печатный процесс на нашем корпусе т.к. изделие у нас одно. Мы модифицировали печатный станок, сделали свои приладки — в общем, заморочились. Но оно того стоило. Встречают — по одежке.


Наш станок во время покупки

Вообще, с итальянцами работать нам очень сложно. Они медлительны, соображают туго, выполняют требования через раз. Постоянно где-то да напакостят. У нас накопилась уже целая гора бракованных корпусов.

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

После доработки «железа» для стабильной работы в условиях металлургического цеха мы спим спокойно. Теперь все остальные применения нам кажутся детским садом – WebHMI выживет почти везде. Сейчас он используется в самых разных и неожиданных местах – от хлебо-булочных предприятий до пивзаводов, от металлургических заводов до железной дороги и портов, от магазинов до спортивных комплексов. И, конечно же, распределенные объекты – теплицы, газовые и электрические котельни, насосные станции, станции подкачки, поливные системы. Единственное существенное ограничение – это температурный диапазон от 0 до +50°С. Он ограничен наличием Li-Po батареи и параметрами её эксплуатации.

Упаковка


Интересной задачей было создание упаковки. Т.к. изделие у нас производилось не очень большими партиями, то заказать сразу несколько тысяч упаковок мы не хотели — это замороженные деньги и мертвое место для хранения в офисе. Поэтому упаковку делали сами. Заказывали резку поролона на лазере и клеили ложемент по мере продаж. Вкладываем его в подходящие картонные коробки стандартного размера. Изображение на коробки нам наносит шелковкой знакомый мастер. Получается красиво и практично. Хотя резка поролона — противное занятие. Он все время норовит воспламениться, коптит, воняет. Получается дорого, много брака. Но зато конечный результат — классный. Выглядит дорого. Встречают, ведь, по одежке. Да и прибор при транспортировке надежно защищен.


Внешний вид упаковки

Затем мы нашли еще несколько хороших дилеров и интеграторов, со многими сотрудничаем и до сих пор. Прямыми продажами мы не занимаемся, зато работаем над развитием дилерской сети. Помогаем при необходимости дилерам, участвуем с ними в семинарах, выставках, обучаем их персонал работе с WebHMI. Развивать дилерскую сеть — это, как оказалось, тоже интересная и увлекательная задача. Дилеры постоянно норовят увести клиента друг у друга, ссорятся. И нам необходимо отстроить систему так, что бы и дилерам было интересно работать и клиенты были довольны.


Семинар по WebHMI

На семинарах задают много интересных вопросов. Некоторые из них приводят к улучшению прошивки. Но бывают и курьезы. Запомнился один мужчина, который на каком-то семинаре все пытался выяснить откуда мы «слизали» прибор. Пытался докопаться до любой мелочи что бы уличить нас в плагиате. Самым сильным его аргументом было то, что у нас тогда был только английский язык в интерфейсе – мол это потому, что мы взяли какой-то чужой софт и выдаем его за свой. Это сейчас у нас есть несколько языков интерфейса, включая английский и русский. А тогда мы даже немного опешили от его напора и недоверия.

В качестве эксперимента пару лет назад мы подарили демо-стенд с WebHMI на кафедру автоматизации в Национальных горный университет. Особых плодов это пока не принесло, но мы не расстраиваемся – вдруг это «выстрелит» позже?

Стенд для университета

Эпилог


Подводя итоги, хочу сказать что путь разработки промышленного устройства увлекателен, тернист и непредсказуем. Собрать прототип — дело нескольких недель. А вот создать коммерческое стабильно работающее сложное устройство — дело даже не одного года. Если вы чувствуете в себе силы идти по нему — смелее. Дорогу осилит идущий. Но наберитесь терпения — не все так просто, как кажется на первый взгляд.

Решайте реальные проблемы – тогда намного легче продавать ваши продукты. Сейчас мы разработали несколько дополнительных продуктов-сателитов, которые удачно дополняют WebHMI и решают некоторые актуальные проблемы при построении систем мониторинга и диспетчеризации. Прототипы были проданы очень быстро даже без надписей и в технологических корпусах. И за первыми партиями уже выстроилась небольшая, но тем не менее очередь, желающих их приобрести.
Tags:
Hubs:
Total votes 47: ↑47 and ↓0+47
Comments63

Articles