Сказ о том, как построить SCADA дом
Часть первая. Лирическая.
Создайте систему, которой сможет
пользоваться даже дурак, и только
дурак захочет ею пользоваться.
Всё началось после переезда в новую квартиру. Кабальный договор подписан. Ключи в руках. Но первая же зима показала, что квартира жутко холодная. И это несмотря на уверения бывших хозяев в обратном. К тому же практически полностью отсутствовала вентиляция. Выражалось это в повышенной влажности, благодаря чему на окнах был конденсат и со временем мог появиться грибок.
Данное положение дел, конечно же, меня не устраивало и с этим надо было что-то делать.
Кое-как пережив зиму, я покончил с этим, заменив батареи отопления и наладив систему вентиляции. По мере погружения в бесконечную пучину ремонта, я попутно формировал концепцию автоматизации квартиры и прикидывал в уме ценник на всю эту красоту. Выбор цвета штор, обоев и т.д. я отдал на откуп жене, а сам сосредоточился на техническом воплощении своей идеи.
FLProg_SCADA урок#1
Само словосочетание «умный дом» далеко не новое. В Интернете эта тема затерта до дыр. Поисковик предлагает огромное количество вариантов на любой вкус и кошелек. Однако если копнуть глубже, то всё не так уж и радужно. Как правило, эти системы ориентированы именно на дом, а не на квартиру.
В них присутствуют такие компоненты как управление котлом, открытие/закрытие въездных ворот и прочие плюшки, преимущества которых сложно оценить простому обывателю панельной пятиэтажки. К тому же все они подразумевают капитальную переделку всей проводки. А ценники и вовсе достигают заоблачных высот.
Если же говорить о любительском подходе к реализации подобной задачи, то все найденные проекты, это как правило рассуждения о том как это должно быть. Примеров конкретных реализаций доступных для повторения практически нет. Очень многое так и остается в виде обсуждений на форумах. Многие делают управляемые через Bluetooth реле на Arduino или подобных платформах.
Неделю играются с ними и потом, как правило, убирают в дальний ящик. Это всё не то.
Не найдя того что бы меня устроило, я решил создать такую систему сам. На производстве это называется SCADA.
Часть вторая. Практическая.
Всякое решение плодит новые проблемы.
Если говорить простыми словами, то SCADA (от англ. supervisory control and data acquisition, диспетчерское управление и сбор данных) предоставляет вам возможность через Интернет браузер и WEB интерфейс управлять любыми исполнительными механизмами и наблюдать за их работой. Чтобы было понятно о чем идет речь — привожу пример реальной системы автоматизации котельной:

Обобщив свои требования, я составил для себя техническое задание:
Разработать систему позволяющую:
— Дистанционно управлять включением и выключением освещения в квартире с любого устройства, на котором можно запустить web браузер;
— Отображать текущее состояния выключателей;
— Включать и выключать освещение в комнатах вручную;
— С выключателя в прихожей выключать всё освещение в квартире (кнопка «выключить всё»);
— Измерять и отображать температуру в каждой комнате;
— Измерять и отображать влажность в каждой комнате.
Система должна работать в режиме 24/7, иметь дружественный интерфейс, быть максимально бюджетной не в ущерб качеству и работоспособности.
Осталось всё это реализовать!
Решение этой задачи я видел так:

Сервер опрашивает отдельновзятые модули по шине RS485 и предоставляет web интерфейс управления по статическому IP адресу. Сервер подключается к домашнему роутеру, который в свою очередь «раздает» этот интерфейс на все устройства домашней сети.

Первое что мне понадобилось это исполнительные устройства. Нужен был настенный выключатель с клавишами без фиксации. Это первая сложность. Не у каждого производителя они представлены в каталогах. После долгих скитаний мой выбор пал на такие:
Не сочтите за рекламу, но найти подобные выключатели по приемлемой цене действительно проблема. Сайт производителя: https://www.lk60.ru/lk-45-button-b-one.html
Они имеют модульную конструкцию, неплохо сделаны и позволяют выбрать как цвет кнопок, так и цвет рамки. Ну и, конечно же, самое вкусное это цена. За всё я отдал около 1300 руб. При детальном осмотре выяснилось, что кнопки имеют очень удачное углубление, куда прекрасно может поместиться небольшое реле:
Правда, пришлось их немного доработать, а именно выкусить перегородки:
Двухстороннюю печатную плату я разрабатывал с тем расчетом, чтобы реле были полностью утоплены внутрь выключателя:
Всё подошло просто идеально. По одному реле на каждый выключатель:
На плате присутствует микроконтроллер ATMega8, драйвер шины RS485 MAX485, 2 реле, датчик температуры и влажности DHT22 и обвязка по питанию. Схема:
Изначально я планировал применить микроконтроллер STM32F030, но драйвер RS485 с питанием от 3,3В довольно дорогой и его сложно купить. А MAX485 не может работать от 3,3 вольта. Поэтому чтобы сэкономить место на плате и не делать два преобразователя на 3,3В и на 5В выбор пал на связку AVR + Max485. Выбирая между симистором и реле, я отдал предпочтение последнему. Никакого нагрева, всё просто, надежно.
Да и мерцать не будет при включении, например, болгарки.
Данный модуль представляет собой законченную автономную конструкцию. И даже если сервер зависнет, то светом в комнате можно будет управлять вручную.
Далее. Нам надо как-то общаться с этим модулем, читать данные или передавать ему команды. Для этого нужен протокол. Поскольку я одно время довольно долго занимался протоколами диагностики автомобильных блоков управления двигателями, то чтобы не изобретать велосипед и не применять Modbus я взял за основу один из этих протоколов и разработал свой.
Запрос всегда отправляет только сервер. Модули лишь отвечают.

KC – двоичное дополнение до 1 (суммируем все байты, инвертируем полученное число, прибавляем 1, берем младший байт от полученного)
Казалось бы просто: читаем данные с датчика DHT22 и отправляем их в USART, но в ходе написания прошивки выяснились детали, над которыми по началу не задумываешься. Во-первых, согласно даташиту, датчик надо опрашивать не чаще 1 раза в 2 секунды. Опрос же самих модулей по RS485 происходит гораздо быстрее.
Поэтому если сервер 10 раз запросит параметры за эти 2 секунды, то модуль ответит ему 10 раз одинаковым значением. Во-вторых, процедуру приема запросов от сервера пришлось немного усложнить. Поскольку все устройства сидят на одной шине и слушают эфир, то ответ какого либо модуля на запрос от сервера слышат все. Это копится у всех в приемном буфере.
Поэтому пришлось ввести процедуру определения начала запроса (преамбула AB CD). Чтобы в этом огромном потоке информации на шине выделять запросы от сервера к конкретному устройству. Чтение данных с датчика DHT22 производится таймером в режиме захвата.
На стене модуль выглядит так:
Витая пара к каждому выключателю была заложена ещё на этапе ремонта:
Обращаю ваше внимание на то, что штробы в стене необходимо делать только ВЕРТИКАЛЬНЫЕ. Если вы делаете горизонтальную штробу, то тем самым вы уменьшаете несущую способность стены! Она может просто сломаться пополам. Маленький горизонтальный кусок я сделал лишь от безысходности. Нарисовал поясняющую картинку того, что происходит когда вы делаете горизонтальную штробу:
Поэтому если вы планируете установить боковые светильники у себя над диваном, то только так:
Чтобы проверить собранный модуль, не включая его в общую систему, я написал на Delphi вот такую программу:
Т.е. используя простой переходник USB-COM или USB-RS485, можно посмотреть текущие параметры модуля и поуправлять состоянием реле. Адрес модуля на шине RS485 задается в прошивке. Это не удобно, но места на плате под переключатель выбора адреса не было. Адрес может быть от 1 до 16. Для подключения модуля потребуется 4 провода (2 витые пары).
Первая пара это питание, вторая это шина RS485. Подключаются модули к шине так:
С исполнительными устройствами разобрались. Теперь дело за сервером. Изначально я хотел применить в качестве сервера перепрошитый Wi-Fi роутер. Для этого был приобретен роутер TP-Link MR 3020. Воодушевившись описаниями того как люди лихо подключают к нему свои ардуины, чтобы пощелкать реле из браузера, я начал активно его ковырять.
Но тут же всплыла масса трудностей. Во-первых, чтобы достучаться до USART роутера необходимо задействовать php скрипт. Этот скрипт при каждом запросе открывает USART порт, отправляет данные и закрывает порт. Это всё прекрасно работает когда вам нужно включить одно реле или лампочку.
Но когда нужно 10 раз в секунду отправлять запрос, проверять ответ и считать контрольную сумму этот вариант не подходит ну никак! Много вопросов есть на форумах где люди слезно спрашивают, как сделать, чтобы порт не закрывался после каждого запроса. Но в ответ идут сплошные костыли. Нормального решения нет т.к. php исполняется на сервере и если сервер будет держать порт открытым он просто будет висеть. И не будет обрабатывать другие запросы.
Советовался с людьми на форумах, но ничего хорошего такая затея не представляла. Многие вообще не понимали о чем я говорю и упорно ссылались на то, что вот, дескать, у них всё работает и реле щелкает. Те, кто понимал, говорили, что нужно писать своё приложение для роутера (под Linux) которое будет выполнять задачу управления модулями. Что для меня было непреодолимой преградой.
В общем, вдоволь наигравшись с этим роутером, я перепрошил его на родную прошивку и отложил в сторону. В голове кружила только одна мысль – никаких роутеров, никаких линуксов и прочих SOFTWARE. Мне нужно только HARDWARE.
Я заказал на Aliexpress модуль Ethernet на базе чипа Wiznet W5500. Это продвинутая версия известного чипа W5100. Достал из закромов микроконтроллер STM32F103VET6 с 512 кБ флеша, прикупил часы на базе чипа DS3231 и стал думать, как увязать всё это дело вместе.
И даже уместил в корпусе:
Убогий web интерфейс который приходится часто видеть на просторах Интернета, меня категорически не устраивал, поэтому я сделал свой:
Написание прошивки для такого сервера задача далеко не тривиальная, как мне показалось на первый взгляд. Нужно хранить названия всех переменных и динамически подставлять их в ответ, когда запрашивает браузер. При конфигурации сервера возникает необходимость добавлять новые модули, указывать их адрес, название и т.д. и т.п. А потом ещё эту конфигурацию как-то сохранить.
При этом нужно ещё и опрашивать модули по заданным адресам. Прошивку писал в CooCox.
Работает всё следующим образом: сервер подключается LAN кабелем к домашнему роутеру. Далее на любом устройстве (телефон, планшет, ноутбук) нужно перейти в браузере по адресу 192.168.1.25 и мы попадаем на страницу web интерфейса. Где можем наблюдать текущие параметры и управлять освещением. Страница раз в секунду делает AJAX запрос на сервер, который отвечает на запрос и передает параметры в формате JSON. Обновление параметров происходит без перезагрузки страницы.
Видео на этапе отладки:
Вэб страница автоматически масштабируется под размер экрана любого мобильного устройства благодаря мета тэгу viewport в HTML коде страницы:
Как это выглядит на экране планшета видно на видео. А на экране ноутбука это выглядит так:
Для проверки сервера после сборки я написал ещё одну программу, эмулирующую настенный выключатель. Т.е можно подключиться к серверу при помощи обычного USB-COM преобразователя до MAX485 и, меняя значения температуры или влажности, наблюдать за их изменением в вэб интерфейсе:
Собирать настенный модуль в железе для этого не требуется. Что очень удобно на этапе сборки непосредственно сервера.
По сути получившаяся система это не умный дом. Она же сама ничего не делает. Это централизованное управление освещением и считывание показаний. Преимущество такого модульного подхода в том, что не надо менять штатную проводку в стенах. Достаточно подвести к каждому выключателю витую пару.
И в случае переезда или выхода из строя какого либо модуля – достаточно просто заменить его на самый обычный выключатель.
В системах, построенных на промышленных ПЛК (программируемый логический контроллер) Siemens, Beckhoff концепция иная. Там ставится огромный шкаф автоматики с кучей реле и уже от них тянутся провода к каждому светильнику и к каждому выключателю. При этом требуется капитальная переделка всей проводки.
По поводу витой пары к каждому выключателю: она должна быть. Построить умный дом и вообще ничего не переделывать не получится. Приступать к строительству подобной системы желательно во время ремонта. Беспроводную связь между модулями я не рассматривал в принципе. Всё должно быть надежно. К тому же даже в беспроводном случае надо как-то обеспечивать питание для модуля.
А менять батарейки я не хочу.
Система запитывается через понижающий трансформатор 220В/9В. Это обеспечивает гальваническую развязку. И в первичной и во вторичной обмотке трансформатора установлены предохранители.
Всю конструкцию я собрал на отдельном листе ДСП и интегрировал в шкаф-купе в прихожей т.к. другого места не нашлось.
Что я не успел ещё реализовать:
— модуль для управления RGB светодиодной лентой;
— модуль для измерения напряжения в сети 220В.
Подводя итог, хочу сказать, что поставленной цели я достиг. Система работает. Конструкция доступна для повторения. Любой желающий может её собрать, сделать это очень бюджетно и гордо именовать эту систему «умный дом». В исходниках доступен шаблон сервера на основе которого можно сконфигурировать свои «комнаты».
Разработка потребовала не малых знаний во многих областях: схемотехника, программирование, интерфейсы взаимодействия между устройствами и протоколы по которым происходит это взаимодействие, знание вэб технологий, AJAX, языка HTML, JavaScript и PHP. Ну и, конечно же, рук, растущих из нужного места.
На этом позвольте откланяться. И помните, что главное не позволять вашему дому стать умнее вас.
Источник: www.radiokot.ru
Начало тестирования SCADA-системы, интегрированной в программу FLProg

Добрый день. Очень долго программе FLProg не было новостей. Это обоснованно тем, что я был занят большой задачей, по созданию интегрированной в программу системы Scada. И вот вышла первая, бета версия этой системы.
В процессе разработки я время от времени рассказывал на сайте программы о состоянии дел по работе.
История развития системы
Первый отчет о состоянии проекта от 29 июн. 2017 г.
Второй отчет о состоянии проекта от 6 сент. 2017 г.
Сначала расскажу об идеологии системы.
В настоящее время я не нашёл ни одной Скада системы которая устроила бы меня по уровню вхождения, и удобству создания проектов. Практически все они представляют собой монстров, рассчитанных на промышленное применение, и для того что бы начать ими пользоваться требуется пройти серьёзное обучение.
Да и после обучения (я например сертифицированный разработчик на WinCC), начало работы на них требует значительного времени. К тому же цены на них начинаются от десятка тысяч рублей. Есть, конечно, бесплатные версии, но чаще всего они ограничены либо очень маленьким количеством тэгов, либо временем работы. Есть FreeScada. Но я так и не разобрался, как с ней работать.
И если этого не смог сделать я, то люди не знакомые с программированием (какими является большинство пользователей программы) тем более не справятся.
Кроме того во всех скадах которые я рассматривал для создания логики поведения самой скады используются те или иные текстовые языки программирования. То есть встаёт необходимость изучать их синтаксис, правила написания, набор команд. Это так же противоречит девизу проекта FLProg –«Программирование для непрограммистов».
В общем, хотелось чего-то лёгонького, с низким порогом вхождения, и возможностью программирования внутренней логики с помощью визуального программирования. Ну и конечно бесплатное. Ничего подходящего не нашлось, значит, будем изобретать свой велосипед.

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

В качестве образца я взял очень любимую мной программу WinCC от Сименса, встроенную в пакет TiaPortal. Убрал то, что мне в ней не нравится, добавил то, что как мне кажется, ей не хватает, взял немного из виндового паинта, немного из CorelDraw, немного от себя. Во всех остальных скадах, которые я видел, меня больше всего напрягала жесткое задание размеров экрана.
При отображении этих экранов на мониторах с другим разрешением получались либо черные рамки, либо часть элементов уходило за пределы экрана, и была просто невидимо. Это в полной мере касается, например той же WinCC. Вижу это на работе каждый день. В моей скаде размер экрана то же задается, но при проигрывании проекта в плеере можно изменять размеры окна программы, при этом элементы будут автоматически подстраиваться под новый размер. Что-то типа масштабирования, но умного, без потери качества (все виджеты скады — векторные).
В первой бета-версии программы виджетов пока немного. Это прямоугольник, круг, ломаная линия, текст. Кроме этого есть контролы. Это поле ввода – вывода, простая кнопка, круглый индикатор.
Все виджеты имеют анимацию. С помощью привязанных переменных они могут динамически изменять своё положение, видимость, цвет контура (у кого есть контур), цвет заливки (у кого заливка возможна). Виджет текста может изменять свой текст, а виджеты прямоугольник и поле ввода могут, имеют режим динамической заливки (уровень заливки меняется в зависимости от значения привязанной переменной).
Так же к любому виджету возможно привязать события. Это наведение курсора на виджет, уход курсора с виджета, нажатие кнопки мыши, отпускание кнопки мыши, клик, двойной клик. Возможные реакции на события – изменение значения переменной, инвертирование значения переменной типа Boolean, переход на другой экран, открытие служебного диалога.
Это конечно не густо, но для первой версии пока хватит. Далее количество виджетов и их возможности будут расти.
Небольшая демонстрация
Редактор схемы

Тут я конечно за основу взял редактор FBD, который используется при программировании контроллера в программе FLProg. Интерфейс редактора практически не изменился, что позволит пользователям программы легко работать и в редакторе схемы скады. Но вот начинка изменилась кардинально.
За время работы над программой FLProg (уже пошёл пятый год) у меня возникло достаточно много идей по оптимизации работы редактора и компилятора программы. Все эти идеи я применил в редакторе схемы скады, и после обкатки на ней, перенесу их так же и в основную программу. Насчет поддержки языка LAD в скаде я ещё не принял решение, если будет достаточно много заинтересованных в этом пользователей, то сделаю.
Небольшая демонстрация
Коммуникации

Ну и конечно коммуникации, какая же скада без них.
- Внутренний протокол FLProg. Это обмен переменными любого типа через ComPort (для компьютера) с UART портом микроконтроллера. Работает быстро, но возможно только для прошивок контроллеров созданных в программе FLProg.
- Modbus RTU, Modbus TCP, Modbus RTU over TCP. Можно создавать неограниченное количество соединений по этим протоколам. Поддерживаются функции 1, 2, 3, 5, 6, 15, 16. Драйвер протокола самописный, внешние библиотеки не используются. Старался максимально соответствовать стандарту Modbas. Тестирование покажет, насколько это мне удалось. Работает в среде Windows и Linux. Впрочем, для Linux есть некоторые ограничения от меня не зависящие. Дело в том, что Modbus TCP Slave подымает TCP сервер на определённом порту. Для Modbus стандартный порт -502. Но в линуксе порты меньше 1024-го обычный пользователь не имеет права открывать. Поэтому надо либо создавать слейва на порту с более старшим номером, либо запускать плеер от рута (что не есть хорошо). С мастером, поскольку он клиент, таких проблем нет.
В любой момент разработки проекта можно открыть этот проект на исполнение, и посмотреть, как он будет работать. Для проигрывания в плеере создаётся Runtime файл.
Небольшая демонстрация
Приём — передача переменных через UART
Источник: habr.com
«Домашняя» SCADA для Arduino

Arduino больше предназначено для использования бытовых и рутинных задач. В основном эти контроллеры рассматривают для создания различных игрушечных прототипов. Всё таки можно найти действительно стоящее применение данных девайсов. SCADA для arduino — это одно из решений, позволяющее вести полный контроль за каким-либо процессом в любой точке мира.
Это решение ещё называют «Интернет вещей». Существует великое множество сложных и неподъёмных SCADA — систем для различных проектов. Давайте рассмотрим некоторые из них.
Из этой статьи вы узнаете:
Всем привет друзья, с вами Гридин Семён. В этой статье я хотел поделиться с вами своими мыслями по поводу применения SCADA систем вкупе с Arduino.
Кстати, недавно мы с моей невестой выезжали на природу. Было очень тепло и светло, почти как летом. Правда, к сожалению до шашлыков дело не дошло :- (. А как вы отдыхаете, дорогие читатели, выезжали вы на природу??


Теперь давайте вернёмся к нашему диалогу. Теоретически можно подключить любую SCADA — систему к любому оборудованию, лишь бы был OPC — сервер и нужный протокол для передачи тех или иных данных…