Элементы "умного дома" на Beckhoff

Обсуждение статей, технологий домашней автоматизации, программных и аппаратных решений
Ali
Сообщения: 263
Зарегистрирован: 23 мар 2011, 16:14

8. Небольшая ложка дегтя...

Сообщение Ali » 14 июн 2012, 16:24

"... а так хорошо все началось - "приглашаем в Москву"...
...и так закончилось - "на смотр художественной самодеятельности"...
тов.Бывалов, кинофильм "Волга, Волга", 1938 год


Когда я приступил к задаче подключения фасадного освещения, то наткнулся на проблему, которую совсем не ожидал получить - контроллер Beckhoff BC9000 не имеет RTC (часы реального времени)! То есть никак не спросить "А вы не скажете, который час?". Данная проблема, честно говоря меня подкосила, так как такой подлости я не ожидал. Конечно, у меня есть компьютер-сервер, который работает круглосуточно и через ADS я могу в нужное мне время дать команду контроллеру на включение нужного выхода... Но ведь неаккуратненько как-то!! Я уже начал подумывать о покупке более совершенного контроллера и перечитывая документацию на новый контроллер на сайте Beckhoff наткнулся случайно на такую фразу ".. так как обращение к внутренним системным часам RTC достаточно медленное, то мы не рекомендуем обращаться к ним каждый раз в программном цикле. Используйте программную реализацию RTC в TwinCat с помощью соотвествующих библиотек.."

Ага! то есть в TwinCat реализованы программные часы! Работают они достаточно просто - надо в начале работы их один раз запустить и потом можно пользоваться. Для того, чтобы использовать программные часы в контроллере BC9000, нужно подключить к проекту библиотеку TcPlcUtilitiesBC.Lb6 (копируется на диск при инсталяции TwinCat). После этого, в переменных нашей программы создаем функциональный блок типа RTC

Код: Выделить всё

PROGRAM MAIN
VAR
	BUTT_H2_R1	:	SM_BUTT; (*ГОСТЕВОЙ ДОМ - КНОПКА -СПАЛЬНЯ 1*)
                .......
	INT_RTC		:	RTC;  (* ПРОГРАММНЫЕ ЧАСЫ*)
END_VAR 
Теперь в теле программы мы пишем следующее

Код: Выделить всё

INT_RTC (EN:=INT_CLOCK_INITFLAG, PDT:=INT_CLOCK_INITTIME); (* согласно документации вызываем блок в каждом цикле *)
IF INT_CLOCK_INITFLAG THEN                     (* после разовой инициализации, сбрасываем флаг *)
	INT_CLOCK_INITFLAG := FALSE;
END_IF
INT_CLOCK_STATUS := INT_RTC.Q;              (* если часы запущены, то статус будет TRUE.... *)
INT_CLOCK_CURR := INT_RTC.CDT;              (* ... и получаем текущеее время для дальнейшей работы *)
Теперь подробно. Согласно документации на сайте мы должны дергать функциональный блок в каждом программном цикле. На входе две переменные. Первая - это флажок (INT_CLOCK_INITFLAG), указывающий надо ли инициализировать часы. Если этот флажок выставлен как TRUE, то функция ожидает, что во второй переменной типа DATE_AND_TIME (INT_CLOCK_INITTIME) находится дата и время, которое надо поставить как текущее. Если же флажок поставлен как FALSE, то функция игнорирует вторую переменную и пересчитывает текущее время. На выходе мы имеем также два значения
- флажок статуса (INT_CLOCK_STATUS) который сигнализирует, что часы были инициализированы, в настоящий момент работают и ими можно пользоваться
- непосредственно само текущее время (INT_CLOCK_CURR), которое мы дальше можем использовать в своих целях.

Ну что же, неплохо... Теперь для запуска надо как-то дать контроллеру текущее время. Это можно сделать двумя способами:

1. Передача текущего времени от компьютера-сервера по ADS

Объявляем в фиксированной области памяти (чтобы они были доступны извне) следующие переменные

Код: Выделить всё

INT_CLOCK_CURR	      AT %MB10:          DATE_AND_TIME;
INT_CLOCK_INITTIME      AT %MB14:          DATE_AND_TIME;
INT_CLOCK_INITFLAG      AT %MX18.0: 	BOOL := FALSE;
INT_CLOCK_STATUS	      AT %MX18.1:	BOOL := FALSE;
Тип данных DATE_AND_TIME занимает 4 байта, и согласно стандарта МЭК представляет собой целое число выраженное в секундах начиная с 1 января 1970 г.

Теперь нам нужно написать на компьютере-сервере программку, которая будет по ADS передавать текущее стартовое время. Так как сервер у меня на Windows XP то для простоты воспользуемся встроенным Windows Scripting Host. Создаем текстовый файл с расширением *.VBS и пишем в нем следующее

Код: Выделить всё

Dim TcPLC                         ' переменная для объекта подключения
Dim INT_CLOCK_INITFLAG  ' флаг инициализации на контроллере
Dim INT_CLOCK_INITTIME   ' время инициализации на контроллере
Dim INT_CLOCK_CURR        ' текущее время на контроллере
Dim COMP_CLOCK_CURR     ' текущее время на компьютере

'создаем объект и подключаемся к контроллеру
Set TcPLC = CreateObject("TCSCRIPT.TcScriptSync")
Call TcPLC.ConnectTo("192.168.208.20.1.1", 800)

If (TcPLC.ReadAdsState() <> 5) Then 
 	WScript.echo("Контроллер не найден или не работает!")   
Else 
                'расчитываем текущее время на компьютере
	COMP_CLOCK_CURR = DateDiff ("S", "01/01/1970", Date()+Time()) 
                'считываем время на контроллере 
	INT_CLOCK_CURR = TcPLC.ReadInt32(&H4020, 10)
                'если разница во времени больше 5 секунд, то обновляем время на контроллере 
                If Abs(COMP_CLOCK_CURR-INT_CLOCK_CURR)>5 Then
                                'для этого записываем в контроллер правильное время
		Call TcPLC.WriteInt32(&H4020, 14, COMP_CLOCK_CURR)
                                'и взводим флаг чтобы контроллер понял, что надо обновить время
		Call TcPLC.WriteBool(&H4021, 18*8, 1)	
	End If
 	WScript.echo("Время на контроллере актуально.")
End If
Собственно суть скрипта понятна по комментариям. Сохраняем файл, запускаем его и получаем актуальное время на контроллере. Теперь этот скрипт можно поставить в стандартный Scheduler и с нужным периодом дергать его проверяя время на контроллере.
ЗАМЕЧАНИЕ. Согласно документации от Beckhoff программные часы могут врать. По их заявлениям ошибка может набегать до 1 минуты за 24 часа работы. По опыту подтверждаю, что ошибка действительно накапливается в указанных пределах и контроллер начинает отставать по времени. Надо перодически запускать скрипт, чтобы подправить время. В моем скрипте выше проверяется наличие расхождения в 5 секунд.

2. Текущее время по SNTP
На нашем форуме появляются все новые Beckhoff-последователи. Участник форума под ником Sunseich нашел еще один способ решения вопроса актуализации времени на контроллере. На сайте Beckhoff бесплатно представлена библиотека, которая содержит функицональный блок FB_SNTP. Данный функциональных блок позволяет получить точное время у сервера по стандарту SNTP. Тоже достаточно красивый метод. Однако к нему пришлось идти с определенными трудностями. Библиотека SNTP работает только на прошивке контроллера BB и выше. У меня и у Sunseich прошивка контроллера была ниже. Как я писал год назад, я остался доволен оперативностью службой поддержки Beckhoff в Москве. Однако в этот раз нас ждало разочарование. Служба поддержки долго мурыжила Sunseich, пыталась сказать, что новые прошивки теперь могут установить только сотрудники компании, и в итоге отказали дать прошивку, так как контроллер был куплен не у них стандартно сославшись на "политику компании". Логично, когда политика любой компании направлена на популяризацию собственных продуктов, так как основная цель - продавать много. Многие бренды давно поняли это, предоставляя общемировой сервис... Но да ладно, это не моего ума дело. В конце концов я не имею акций компании Beckhoff и ее продажи меня мало волнуют. Мне нужна была прошивка :) В итоге было написано письмо немцам, с которыми я познакомился покупая модули для контроллера. Они занимаются альтернативной энергетикой и являются хорошим партнером Beckhoff-a. Через день я уже получил самую свежую прошивку контроллера с кодом BE и благополучно поставил ее в течение 1 минуты (спасибо немцы!! Рот фронт!!).

Ну собственно переходим к коду. Объявляем переменные:

Код: Выделить всё

PROGRAM MAIN
VAR
	INT_RTC		:	RTC;  (* ПРОГРАММНЫЕ ЧАСЫ*)
	INT_CLOCK_CURR	AT %MB10:          DATE_AND_TIME;  (* ЗДЕСЬ БУДЕМ ХРАНИТЬ ТЕКУЩЕЕ ВРЕМЯ *)
	INT_CLOCK_INITTIME      AT %MB14:          DATE_AND_TIME;
	INT_CLOCK_INITFLAG      AT %MX18.0: 	BOOL := FALSE;
	INT_CLOCK_STATUS	      AT %MX18.1:	BOOL := FALSE;

	SNTP	:	FB_SNTP;   (*ФУНКЦИОНАЛЬНЫЙ БЛОК ДЛЯ ОБЩЕНИЯ С СЕРВЕРОМ *)
	SNTP_FLAG:	BOOL := TRUE;  (* ФЛАГ ПОДКЛЮЧЕНИЯ К СЕРВЕРУ *)
	SNTP_TIMER:	TON;          (* ТАЙМЕР ДЛЯ ПЕРИОДИЧЕСКОГО ОПРОСА SNTP *)
	sServer	:	STRING(15):='77.41.132.50'; (* ОДИН ИЗ ПУБЛИЧНЫХ SNTP СЕРВЕРОВ В ЗОНЕ RU *)
END_VAR
и пишем следующий код программы

Код: Выделить всё

SNTP_TIMER (IN := TRUE, PT := t#60s); (*будем сверять время каждую минута*)
IF SNTP_TIMER .Q  THEN
	SNTP_TIMER  (IN := FALSE);
	SNTP_FLAG := TRUE; (* пора сверить часы *)

END_IF

IF SNTP_FLAG  THEN
	(* стучимся к SNTP серверу не дольше чем 5 секунд *)
	SNTP (bStart := TRUE, sSntpServer := sServer,  tTimeOut := t#5s);
	IF SNTP.bBusy = FALSE THEN
		INT_CLOCK_INITFLAG := TRUE;
		INT_CLOCK_INITTIME := SNTP.tTime;  (* если достучались то имеем точное время *)
		SNTP (bStart := FALSE);
		SNTP_FLAG := FALSE;
	END_IF
END_IF

INT_RTC (EN:=INT_CLOCK_INITFLAG, PDT:=INT_CLOCK_INITTIME); (* согласно документации вызываем блок в каждом цикле*)
INT_CLOCK_INITFLAG := FALSE;                   (* после инициализации сбрасываем флаг *)
INT_CLOCK_STATUS := INT_RTC.Q;              (* если часы запущены то статус будет TRUE.... *)
INT_CLOCK_CURR := INT_RTC.CDT;              (* ... и получаем текущее время для дальнейшей работы *)
Таким образом, если имеем устойчивый доступ в Интернет, то у нас на контроллере будет всегда точное время.

3. А какой способ выбрать?
Я испробовал оба способа у себя на контроллере и остановился на первом способе.
Синхронизация времени с SNTP сервером имеет как плюсы:
- контроллер синхронизируется сам, наличие компьютера-сервера не обязательно
- время на контроллере сбрасывается при обновлении программы или обесточивании. Первое совсем не критично, а во-втором случае ситуация следующая - первым при включении питания оживает контроллер (ему надо на загрузку не более 10-15 секунд), вторым оживает роутер, который дает доступ в Интернет (40-50 секунд), ну и самым последним просыпается компьютер (на загрузку Windows с основными сервисами требуется 2-3 минуты). Таким образом, как только появляется доступ в Интернет контроллер имеет точное время.

... так и минусы...
- Интернет у нас в деревушке только на уровне полудохлого 3G, много неудач при подключении
- мне не столько важно, чтобы на контроллере было точное время. Мне важно, чтобы оно было одинаковым с компьютером-сервером на котором происходит запись в базу данных всех событий.

В итоге, минусы перевесили и я пока остановился на первом способе. Хотя можно будет потом придумать и что-то комбинированное.

Решив вопрос с часами я без проблем подключил фасадное освещение, о чем будет следующий пост.

Theridiidiae
Сообщения: 9
Зарегистрирован: 13 окт 2011, 16:36

Re: Элементы "умного дома" на Beckhoff

Сообщение Theridiidiae » 12 сен 2012, 18:14

Спасибо за статьи.
Вопрос, как съездили на Wago?

И по поводу NTP вы разные сервера пробовали?
Просто там настолько мизерная информация, что практически теряться нечему.
То-есть возможно проблема непосредственно с самим сервером.
http://www.vniiftri.ru/index.php/ru/services/22-ntp вот тут можно взять несколько проверенных адресов.
И вопрос, а что мешает и компьютер синхронизировать с этим же NTP сервером (это возможно как в Win OS так и NIX подобных) если нужно могу подсказать?

Прочитал несколько топиков, родился вопрос.
Как ваша система поведет себя при выходе из строя контроллера (можно ли будет вкл/выкл свет с кнопки если да то как реализовано)?
Последний раз редактировалось Theridiidiae 13 сен 2012, 12:44, всего редактировалось 1 раз.

Ali
Сообщения: 263
Зарегистрирован: 23 мар 2011, 16:14

Re: Элементы "умного дома" на Beckhoff

Сообщение Ali » 14 сен 2012, 15:11

Theridiidiae писал(а):Вопрос, как съездили на Wago?
Я на Wago не ездил, про это писал один из читателей моей ветки. Но я уверен, что съездил он хорошо.
Theridiidiae писал(а):И по поводу NTP вы разные сервера пробовали?
В реальных условиях вполне достаточно синхронизировать с компьютером, работает все без проблем.
Theridiidiae писал(а):Прочитал несколько топиков, родился вопрос.
Как ваша система поведет себя при выходе из строя контроллера (можно ли будет вкл/выкл свет с кнопки если да то как реализовано)?
Я бы разделил это вопрос на два
1) Если просто сломался контроллер. Я уже на эту тему писал, что так как контроллер стоит около 100 евро, то я просто купил запасной. Я считаю что 100 евро не такая большая сумма для собственного спокойствия. К тому же, пока я в самом начале игрался на столе с контроллером, то как я только по-началу его не пытался сжеть по глупости он так и не сгорел.. Вообщем контроллер Beckhoff (и его брат Wago) очень надежная вешь.
2) Если я по каким-то причинам захотел отказаться от контроллера и от умного дома вообще. Например, решил продать свои владения и наличие умного дома у покупателя воспринимается как минус, а не плюс. В этом варианте, как я уже тоже писал, я просто делаю следующие шаги:
- меняю все выключатели-кнопки на стандартные выключатели
- вынимаю контроллер
- вместо него обычными клеммами коммутирую провода от выключателей на соотвествующие провода от лампочек. Именно для этого я вел к выключателям провода сечением 0,75. Можно было пустить и дешевые тоненькие, но по 0,75 можно пустить 220 и этого сечения предостаточно, чтобы справиться с нагрузкой на лампочки.

d_i_m99
Сообщения: 1
Зарегистрирован: 16 сен 2012, 09:47

Управление контроллером с КПК на Android и Ipad

Сообщение d_i_m99 » 16 сен 2012, 10:18

Здравствуйте.
Появилась задача сделать управление Умным домом (beckhoff) с помощью тел. на базе Android.
Как было описано выше, что можно сделать при помощи Visual Basic 2010 НО опыты работы с VB не было и при первом же запуске возникли вопросы.
Какой выбрать проект (стандартный Exe, activX. exe и.т.д) :?:
Что делать и с чего начать :?:
Как нарисовать визуализацию :?:

Возможно, у кого нибудь есть пример работающей реализации любого масштаба от 1-3х выключателей (посмотреть одним глазком хотя бы)

Сам давно программирую PLC и beckhoff проблем с алгоритмами нет, так же опыт визуализации разных панелей управления.

А тех задание в принципе простое.
1) Управление светом в коттедже
2) Розетки
3) Бойлер
4) Датчики протечки, клапан
5) Охранные датчики (окна двери)
6) Освещенность авт. вкл. во дворе
7) Смс о событиях на тел. хозяина
8) Видеонаблюдение периметр
9) 2 сенсорные панели 1-й 2-й этаж
10) Ну и УПРАВЛЕНИЯ С ТЕЛ. планшетника Android и Ipad

Если кто-то сталкивался, дайте совет и подскажите путь.

xace
Сообщения: 56
Зарегистрирован: 12 май 2011, 18:07

Re: Элементы "умного дома" на Beckhoff

Сообщение xace » 16 сен 2012, 12:18

Тема наверное из оффтопа, но что скажете про OWEN проще достать все таки... ?

Ali
Сообщения: 263
Зарегистрирован: 23 мар 2011, 16:14

Re: Элементы "умного дома" на Beckhoff

Сообщение Ali » 17 сен 2012, 13:52

xace писал(а):Тема наверное из оффтопа, но что скажете про OWEN проще достать все таки... ?
Xace, по тем задачам, которые мы решаем, подойдет любой контроллер. Owen в том числе. Его программирование будет точно таким же почти как и у Beckhoff/ Единственно связь с внешнем миром будет немного другая. Скорее всего через Modbus протокол.
Эдинственный момент на который нужно обратить внимание - кроме контроллера надо порты входа-выхода, возможно аналоговые порты... Здесь тоже надо считать, так как в доме портов надо много и в итоге все в копейку тоже выходит.

Ali
Сообщения: 263
Зарегистрирован: 23 мар 2011, 16:14

Re: Управление контроллером с КПК на Android и Ipad

Сообщение Ali » 17 сен 2012, 15:11

d_i_m99 писал(а): Появилась задача сделать управление Умным домом (beckhoff) с помощью тел. на базе Android.
Как было описано выше, что можно сделать при помощи Visual Basic 2010 .
DIM99, хотел уточнить - про VB я упоминал как про язык программирования. Мне просто было проще на нем примеры делать. И я использую VB только в виде VBScript сейчас, который встроен в Винды как Windows Host. Там можно писать и на JavaScript. Эти скрипты я использую для обмена данными с контроллером, без интерфейса, на нем интерфейс не сделать.

Теперь собственно по поводу визуализации, так как вопрос достаточно серьезный.

1) Как уже на этом форуме не раз писалось и обсуждалось, самый правильный путь движения - это web-интерфейс. VB 2010 вам не поможет, так как он делает программы только под Windows. И она естественно под Android не заработает. Поэтому, после долгих проб, попыток и опытов я могу уверенно сказать - чтобы можно было отовсюду коннектиться к умному дому - нужен WEB-интерфейс.

2) Куда двигаться поняли, теперь надо понять как двигаться. Первая мысль была - написать на том, на чем умею писать - на том же VBScript для web (это технология ASP и ASP.NET). И я даже начал это делать, однако потом я понял следующие вещи
- я достаточно уже стар, чтобы вспоминать свои навыки программирования. Я этим не занимался профессионально уже лет 10, поэтому то что называется "мысль на кончиках пальцев" у меня уже нет. И то что я бы раньше сделал вечерами за 2-3 месяца, сейчас могут занять годы
- даже если я и напишу в конце концов эту систему, то это будет решение только для меня, и на просьбы из форума ничем помочь не смогу. Наглядный пример мы видим в ветке, где Андрей выложил web-интерфейс своей системы. Он честно с самого начала сказал, что самописная система - продукт достаточно интимный и подходит под его контретную задачу... Вот вам куски кода - и развлекайтесь дальше сами. Есть конечно энтузиасты, которые готовы покопаться в чужих исходниках, но все-таки наша цель, чтобы быстро заработал умный дом и можно было думать о великом, а не о ловле блох в исходниках... Наш форум именно тем и хорош, чтобы совместно решать задачи и делиться опытом. Различие технологий - это конечно минус. Кому-то нравится windows, кому то LiNUX. Кто-то программирует на ASP, кто то на PHP. Кому-то язык С беда, а кому-то мать родная. Наличие какой-то общей системы дает возможность всем сконцетрироваться на решении главной цели и не скатываться в специфическое программирование. Конечно такую замечательную систему надо еще найти!
- технологии меняются достаточно быстро, и не факт, что мне через 3 года вообще захочется что-то программировать. Хочется свести задачу к каким-то менее трудоемким вещам, чтобы на решение требовалось 10-20 вечеров максимум.

3) Вывод из 2 - надо искать что-то готовое. Это что-то должно лично для меня удовлетворять следующим требованиям:
- система должны быть web-ориентированной, но при этом использовать только стандартные технологии, которые будут работать на всех браузерах и не должны быть тяжеловесеными. Никаких ActiveX, никаких Java аплетов. В идеале только HTML5 с AJAX
- система должна уметь работать с базами данных, должна уметь работать с контроллерами через стандартные протоколы (Modbus, OPC), наличие блока работы с 1-wire будет плюсом
- система должна быть с одной стороны простой, с другой стороны гибкой с возможностью программировать как серверную часть, так и добавлять собственные страницы в web-интерфейс
- система должна быть либо open-source, либо недорогой (за хорошую вешь и заплатить не жалко.. немножко..).

4) После поисков я понял, что надо гуглить и яндексить словосочетание "web scada". Это именно то, что мне нужно. Поиски меня привели на две системы
- Mango M2M - http://mango.serotoninsoftware.com/features.jsp
судя по описанию эта система полностью покрывает мои потребности!!! Они работает и под Windows и под Linux. Базируется на сервере Apache Tomcat. Серверные модули написаны на Java. Минусы данной системы - практически отсутствие документации!! Правда говорят есть хорошо документированный бразильский клон системы на испанском :ugeek: Ну второй минус - мне не удалось его заставить работать под Windows :) Так и остался он для меня темной лошадкой с хорошими задекларированными возможностями. Хотя я обязательно еще раз попробую его заставить заработать.
- коммерческая Web-SCADA IntegraXor. http://www.integraxor.com/ - работате только на Виндах. Очень мне понравилась! Лично для меня очень логична и понятна. в качестве WebInterface использует SVG + AJAX. Соотвественно позволяет рисовать интерактивные картинки, которые работают на всех браузерах. До конца года есть акция бесплатно лицензия на 128 внешних Modbus тэга. Это для наших задач предостаточно. Нелицензированная версия полностью рабочая, но работает только 2 часа, потом надо перезагружать. Для тестированя тоже хорошо. За деньги с саппортом стоит около 250 евро. Конечно не дешево, но если у меня не заработает бесплатный Манго, и я мой сайт который на нем я сейчас делаю нормально заработает в тестовом режиме, то я навернео все-таки соглашусь заплатить эти 250 евро как компенсацию за годы сидения с исходниками ... Подключение контроллера Beckhoff BC9000 с лампочками а также к базе с данными от погодной станции и датчики температуры в каждой комнате у меня заняло 2 вечера. Львиная доля из них занимало нарисовать красиво план помещений и пикторгаммы в SVG редакторе...

Вот как то так. Готов более подробно написать про IntegraXor пока как раз я в процессе... Надеюсь, что кто нибудь заинтересуетсясистемой Манго и порпорбует ее поставить, мне поможет и мы бы совместно смогли бы ее распотрошить и понять, так ли все шоколадно как написано в документации..

xace
Сообщения: 56
Зарегистрирован: 12 май 2011, 18:07

Re: Элементы "умного дома" на Beckhoff

Сообщение xace » 17 сен 2012, 21:10

Очень ждем результата что получится из этого!

xboct
Сообщения: 73
Зарегистрирован: 17 ноя 2011, 01:09

Re: Управление контроллером с КПК на Android и Ipad

Сообщение xboct » 17 сен 2012, 21:31

Ali писал(а): 3) Вывод из 2 - надо искать что-то готовое. Это что-то должно лично для меня удовлетворять следующим требованиям:
- система должны быть web-ориентированной, но при этом использовать только стандартные технологии, которые будут работать на всех браузерах и не должны быть тяжеловесеными. Никаких ActiveX, никаких Java аплетов. В идеале только HTML5 с AJAX
- система должна уметь работать с базами данных, должна уметь работать с контроллерами через стандартные протоколы (Modbus, OPC), наличие блока работы с 1-wire будет плюсом
- система должна быть с одной стороны простой, с другой стороны гибкой с возможностью программировать как серверную часть, так и добавлять собственные страницы в web-интерфейс
- система должна быть либо open-source, либо недорогой (за хорошую вешь и заплатить не жалко.. немножко..).
http://www.domogik.org/en/
- почти полностью удовлетворяет условиям. Маленько неприятно - для контроллера надо будет писать свой плагин на Питоне
Из минусов - документация почти полностью состоит из слов ToDO
Из плюсов - установилась без танцев с бубном :D

Ali
Сообщения: 263
Зарегистрирован: 23 мар 2011, 16:14

Re: Управление контроллером с КПК на Android и Ipad

Сообщение Ali » 18 сен 2012, 13:09

xboct писал(а):http://www.domogik.org/en/
- почти полностью удовлетворяет условиям. Маленько неприятно - для контроллера надо будет писать свой плагин на Питоне
Маленько неприятно - это когда документации нет. А писать на Питоне подключение к контроллеру! не... Не хочу :) Хочу на все готовенькое!
На и версия продукта 0.1.0 звучит жизнеутверждающе! :)

Ладно, про опыты с IntegraXor напишу чуть позже. Также попытаюсь поработать с Mango M2M и тоже расскажу если получится.

xboct
Сообщения: 73
Зарегистрирован: 17 ноя 2011, 01:09

Re: Управление контроллером с КПК на Android и Ipad

Сообщение xboct » 18 сен 2012, 13:48

Ali писал(а): На и версия продукта 0.1.0 звучит жизнеутверждающе! :)
Жизнеутверждающе выглядит вот это - { Major update for python-openzwave compatibility... 13 hours and 56 minutes ago} :D
и вот эта страница http://wiki.domogik.org/Download
а плугин на Питоне - это мелочи.... всего то программка-шлюз между протоколами

Ali
Сообщения: 263
Зарегистрирован: 23 мар 2011, 16:14

9. Уличное освещение на Beckhoff

Сообщение Ali » 19 сен 2012, 23:11

Решил, пока есть время, описать то что уже накопилось у меня и чем готов поделиться. Давно надо было написать про автоматическое включение уличного освещения через BECKHOFF.
Андрей уже достаточно подробно раскрывал эту тему на сайте
здесь http://www.ab-log.ru/smart-house/video_ ... ght-sensor
здесь http://www.ab-log.ru/smart-house/linux/sunset
.. и здесь http://www.ab-log.ru/smart-house/ethernet/light-sensor
Я хочу добавить только свои пять копеек в эту тему.

1. Как определять когда включать (выключать) свет
Несомненно, я соглашусь с Андреем, что момент, когда "стало темно" лучше всего определять какими-то аппаратными средствами - датчиками освещенности. Однако, с датчиками также есть определенные проблемы, а именно:
- качество, а соотвественно чувствительность, датчиков бывает разное. Нужно выбирать качественный датчик
- очень важно поставить датчик в правильное место. Он должен быль устойчив к тяжелым погодным условиям, не заливаться дождем, не засыпаться снегом. Также наши дома находятся не в чистом поле, и соотвественно, на датчик не должен падать свет о нашего наружнего освещения, от освещения, установленного у соседей, от общедеревенского уличного освещения
- после того как нам наконец удалось выбрать ПРАВИЛЬНОЕ место для датчика необходимо, чтобы прокладка кабеля (или другого канала связи) от него до контроллера требовало разумных усилий и затрат. Никому не хочется ради этого разворотить стену дома или пустить по фасаду и участку длинные провода.

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

Вообщем, я свой выбор сделал.

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

Заход солнца (и восход) - это момент времени когда верхний край солнечного диска находится точно по уровню горизонта. Имеено этот момент и считают многие готовые функции, которые можно найти в интернете. За горизонт принимается 0 градусов. Однако, здесь нужно учитывать два момента
1) Поскольку солнце частично преломляется в атмосфере, по факту в солнечный день мы его видим даже когда фактически оно скрылось за горизонт. А именно, -0.83333 градуса. Этот угол считается официальным углом захода солнца
2) Горизонт 0 градусов - может быть не всегда. Например с востока у нас может быть море (0 градусов), а с запада горы (зависит от высоты). То есть для заката и для восхода надо брать разные градусы. Ну и зимой я тоже думаю, что из-за снега горизонт чуть поднимается :)

Все это я пишу к тому, что большинство готовых функций выглядят так:

Код: Выделить всё

Function SunSet (широта, долгота, дата) as Time
То есть берут широту-долготу точки, дату и расчитывают на указанную дату время захода солнца для указанной точки земного шара считая горизонт 0 градусов. Однако в хозяйстве для большей педантичности необходимо иметь функцию такого вида

Код: Выделить всё

Function SunSet (широта, долгота, дата, угол_горизонта_запад) as Time
Тогда для точного вычисления времени захода Солнца считая что у нас с запада море нужно писать

Код: Выделить всё

SunSetTime = SunSet (55.72, 37.63, Now(), -0.83333)
Следующий мысль - в момент захода солнца еще достаточно светло, так как солнце отражаясь от неба освещает землю. Для этого человечество уже придумало следующие определения.

Гражданские сумерки - время когда центр солнца находится от 0 до 6 градусов ниже горизонта.
Навигационные сумерки - время когда солнце находится от 6 до 12 градусов ниже горизонта.
Астрономические сумерки - время когда солнце находится от 12 до 18 градусов ниже горизонта.

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

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

Код: Выделить всё

SunRiseTime = SunRise (55.72, 37.63, Now(), -6)
SunSetTime = SunSet (55.72, 37.63, Now(), -6)
3. Постановка задачи
Задача автоматического включения уличного освещения мной была поставлена следующим образом:
- уличное освещение нужно включать два раза в сутки - утром и вечером
- утренней включение с 7:00 когда начинаю будить детей и до момента "стало светло"
- вечернее включение с момента "стало темно" до 0:00
- фиксированные границы нужно иметь возможность по необходимости менять, например в случае если у папаши случился бзик поднимать детей как в армии в 6:00
- нужно иметь возможность принудительно включить-выключить освещение в любой момент, например на случай вечеринки

Набросаем рисунок
SunTime1.jpg
SunTime1.jpg (21.3 КБ) 28793 просмотра
Объявляем переменные

Код: Выделить всё

(*ПЕРЕМЕННЫЕ ДЛЯ УЛИЧНОГО ОСВЕЩЕНИЯ *)
EVENING_START 	AT %MB38:TIME_OF_DAY ;                          (* НАЧАЛО ВЕЧЕРНЕГО ВКЛЮЧЕНИЯ *)
EVENING_END	AT %MB42:TIME_OF_DAY := TOD#00:00:00; (* КОНЕЦ ВЕЧЕРНЕГО ВКЛЮЧЕНИЯ *)
MORNING_START	AT %MB46:TIME_OF_DAY := TOD#07:00:00; (* НАЧАЛО УТРЕННЕГО ВКЛЮЧЕНИЯ *)
MORNING_END	AT %MB50:TIME_OF_DAY ;                          (* КОНЕЦ УТРЕННЕГО ВКЛЮЧЕНИЯ *)
Переменным EVENING_START и MORNING_END ежедневно в 13:00 контроллер присваивает значения SunSetTime и SunRiseTime соотвественно (как обсуждали раньше).

Теперь только необходимо написать функцию, которая определеяет, попадает ли текущее время на контроллере в один из промежутков. Если да, то включаем уличное освещение.
Также на рисунке видно, что летом SunSetTime может наступать позже полуночи, а SunRiseTime раньше 7:00. Функция должна учитывать это, и не включать свет при таких условиях.
Изменять фиксированные границы также не представляет труда. Через ADS у нас есть доступ извне ко всем переменным, и мы можем поменять фиксированные границы в контроллере с компьютера.

Теперь о возможности принудительно включить/выключить освещение. Сценарии, при которых это необходимо обычно такие:
- пришли гости летом, сидим на улице, в полночь освещение вырубилось, но хочется продолжения банкета. Нужно включить освещение. НО! Не просто так включить, а например, включить еще на 2 часа, а потом чтобы он его выключил сам и чтобы я мог спокойно спать под яблонькой после вечерины не задумываясь о потраченных киловатах.
- пришли гости зимой, сидим дома, далеко после полуночи наконец удалось уговорить гостей ехать в конце концов домой. надо включить освещение пока целуемся у входа и пока гости бредут к своим машинам. Потом надо выключить.
- рано утром в 5 утра надо ехать на утренний самолет в аэропорт. Надо включить освещение, чтобы дойти до машины. Но чтобы потом он сам его выключил.

Когда наконец у меня будет веб-интерфейс умного дома это можно будет сделать изящно и красиво (покрасоваться перед гостями) потыкав пальцев в своем iPad. Но пока это все в стадии разработки, поэтому нужны более простой и дубовый способ, который можно использовать даже в стадии сильного алкогольного опъянения.

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

Код: Выделить всё

UNUSUAL_START	AT %MB54:TIME_OF_DAY := TOD#00:00:00; (* НАЧАЛО ВНЕПЛАНОВОГО ВКЛЮЧЕНИЯ *)
UNUSUAL_END	AT %MB58:TIME_OF_DAY := TOD#00:00:00; (* КОНЕЦ ВНЕПЛАНОВОГО ВКЛЮЧЕНИЯ *)
То есть я объявил еще один промежуток времени, в который может быть включено уличное освещение (см рисунок - синим цветом внеплановый промежуток).
SunTime2.jpg
SunTime2.jpg (11.21 КБ) 28793 просмотра
Теперь на выбранный кнопку-выключатель была повешана следующая логика:
- двойной клик по кнопке присваивает переменной UNUSUAL_START текущее время, а переменной UNUSUAL_END текущее время плюс один час. Таким образом, двойным кликом мы включаем свет на часок
- если дополнительный промежуток активирован и освещение горит, то при этом условии еще один двойной клик добавляет к UNUSUAL_END еще один час
- если нажать и держать кнопку в течение 1 секунды, то UNUSUAL_START И UNUSUAL_END обнуляются, и освещение гаснет.

Также дополнительно было введено условие, что в 13:00 UNUSUAL_START И UNUSUAL_END обнуляются, и введено ограничение, что дополнительный промежуток не может пересекаться с утренним и вечерним включением света, чтобы не нащелкать лишнего.

То есть теперь я подхожу к кнопке, делаю дабл-клик - свет включается и будет включенным в течение часа. Если сделать еще дабл-клик, то свет будет включенным два часа. Если надоело и хочу выключить освещение, то нажимаю кнопку и держу секунду.

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

Cifrovik
Сообщения: 6
Зарегистрирован: 19 окт 2012, 12:44

Re: Элементы "умного дома" на Beckhoff

Сообщение Cifrovik » 19 окт 2012, 12:51

Выполняю операции "Generate mappings", "Check configuration", "Activate configuration".
После выполнения "Activate configuration" Выдает ошибку (рисунок прилагаю).
Изображение

Ali
Сообщения: 263
Зарегистрирован: 23 мар 2011, 16:14

Re: Элементы "умного дома" на Beckhoff

Сообщение Ali » 19 окт 2012, 14:53

Cifrovik писал(а):Выдает ошибку (рисунок прилагаю).
Напишите пожалуйста, какой у вас контроллер? CX или BC?

Cifrovik
Сообщения: 6
Зарегистрирован: 19 окт 2012, 12:44

Re: Элементы "умного дома" на Beckhoff

Сообщение Cifrovik » 19 окт 2012, 15:28

BC9000

Ali
Сообщения: 263
Зарегистрирован: 23 мар 2011, 16:14

Re: Элементы "умного дома" на Beckhoff

Сообщение Ali » 19 окт 2012, 16:12

Cifrovik писал(а):BC9000
Все манипуляции, которые вы описали применимы к CX серии контроллеров. В BC9000 гораздо все проще.
Пошаговую инструкцию на английском читаем здесь
http://ru.scribd.com/doc/55096552/BECKHOFF-NA03-v1-1

Cifrovik
Сообщения: 6
Зарегистрирован: 19 окт 2012, 12:44

Re: Элементы "умного дома" на Beckhoff

Сообщение Cifrovik » 19 окт 2012, 21:36

Делаю по инструкции выдает следующую ошибку:
PLC: Error (1804 (0x70c)) loading boot project of run time system 1. Run time started without boot project

Ali
Сообщения: 263
Зарегистрирован: 23 мар 2011, 16:14

Re: Элементы "умного дома" на Beckhoff

Сообщение Ali » 19 окт 2012, 22:19

Cifrovik писал(а):Делаю по инструкции выдает следующую ошибку:
PLC: Error (1804 (0x70c)) loading boot project of run time system 1. Run time started without boot project
Редкий случай, предлагаю перенести в личку чтобы не забивать тему. У кого будет похожее тот спросит...

Alexca
Сообщения: 27
Зарегистрирован: 11 окт 2012, 08:20

Re: Элементы "умного дома" на Beckhoff

Сообщение Alexca » 22 окт 2012, 06:22

прочитал всю тему, попутно роя ebay и офф сайты.. и Beckhoff и WAGO на ебае завались каких хочеш.. смущает такой вопрос, ибо когда месяц назад думал над использованием PLC, то так и не нашел нормального понятного ответа.
Понравилось как автор тут все подробно раписывает. Практически пособие для слаборазвитых типа меня. Спасибо.
Как термодатчики к нему прицепить?

PS оказывается не совсем завались и не совсем каких хочеш. Выглядят они одинаково почти, а вот буквы в маркировке все переворачивают с ног на голову. В частности нужно различать Bus Coupler и Bus Terminal Controller... хех а счастье было так возможно..
жду наглядного урока как к нему прицепить термодатчик. :ugeek:

Ali
Сообщения: 263
Зарегистрирован: 23 мар 2011, 16:14

Re: Элементы "умного дома" на Beckhoff

Сообщение Ali » 22 окт 2012, 11:09

Alexca писал(а):хех а счастье было так возможно..:
Счастье возможно всегда. главное захотеть :)
Alexca писал(а):жду наглядного урока как к нему прицепить термодатчик. :ugeek:
Ну чтож садитесь по лавкам и слушайте... Беру с полки гусли и начинаю былину :)

Итак, способов прицепить к Beckhoff термодатчики несколько

ВАРИАНТ 1.
Если хочется дорогой, но по производственному надежный способ подключения датчика, но для этих целей у BECKHOFF есть специальные модули:
- KL3312, KL3314 - модули подключения термопары соответственно на 2 и 4 датчика
- KL3202, KL3204 - модули подключения термометров типа Pt100, Pt1000 также на 2 и 4 датчика
Покупаем модули, покупаем соотвествующие датчики, подключаем согласно документации и используем показания в своей программе.
Плюсы данного решения - надежность и скорость реакции на малейшее изменение температуры.
Минусы также очевидны:
- цена вопроса. Покупка модуля + сам датчик обойдется где-то по минимуму 30 долларов за одну точку
- есть ограничения по длине проводов от контроллера до датчика

Учитывая, что наш дом это все-таки не производстводственный цех, и нам не надо замерять температуру каждые 10 милисекунд, а также имея замечательное и недорогое решение на базе 1-wire, совершенно логично использовать 1-wire для мониторинга температуры в доме. Встает только вопрос - как подцепить 1-wire к Beckhoff. К сожалению, стандартного модуля подключения 1-wire к Beckhoff нет.

Здесь также возможны варианты.

ВАРИАНТ 2.
Данный вариант в настоящий момент используется у меня в системе. Он предусматривает, что у нас есть компьютер-сервер. Далее делаем следующие шаги:
1) Объявляем в области памяти контроллера Beckhoff переменные, где у нас будет храниться температура, например вот так

Код: Выделить всё

TEMP1	AT %MB50: REAL; (* температура в спальне *)
TEMP2	AT %MB54: REAL; (* температура в гостинной *)
.......
TEMP_OUT	AT %MB80: REAL; (* температура на улице *)
2) К серверу, через стандартные COM или USB адаптеры мы подключаем 1-wire. Делаем простейшую програмку, которая раз в минуту опрашивает все датчики, записывает данные в базу данных для истории, а также через ADS записывает показания температуры в соответствующие переменные на контроллере, а также пишет в контроллер время обновления.
3) Контроллер имея показания температуры производить необходимые нам действия.

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

Если нам хочется отказаться от компьютера, и связать контроллер Beckhoff напрямую к 1-wire, то возможны следующие варианты

ВАРИАНТ 3.
Можно купить модуль Beckhoff KL6001. Это модуль добавляет контроллеру порт RS232. К данному порту подключаем адаптер сети 1-wire и контроллер может опрашивать сеть 1-wire самостоятельно.
У такого решения один главный минус - придется писать самому для контроллера библиотеку общения с 1-wire, что возможно, но гиморройно. Для WAGO есть самописная готовая библиотека для такого решения. Она даже open source, однако давно не обновляется и исходников не дают :(

ВАРИАНТ 4.
Поставить небольшой Etherner контроллер который будет шлюзом между Ethernet и 1-wire.
Изначально, в качестве такого шлюза я планировал использовать контроллер от Dallas под названием TINI-board. У меня есть одна такая в загашниках. Она собственно для таких целей и делалась. У нее на борту с одной стороны 1-wire мастер, а с другой Ethernet. Внутри стоит JAVA runtime со всеми необходимыми библиотеками для работы с 1-wire и с Ethernet. Есть готовый open source проект под названием JMODBUS для этой платы. Он с одной стороны опрашивает все датчики через определенное время, а с другой стороны через Ethernet, как Mobdus TCP slave по запросу может отдавать данные о температуре. В контроллер Beckhoff BC9000 встроен протокол Modbus, поэтому он может запрашивать с TINI все нобходимые данные.
ОДНАКО!! два года назад Dallas прекратил производство TINI board, поэтому данное решение именно с TINI тупиковое.
Поэтому, если идти таким путем, то имеет смысл идти в соседнюю ветку 1-WIRE ПО ETHERNET, просить уважаемого ТНК спаять плату, найти исходники для MODBUS (уверен что они есть) и сделать шлюз.

Все, гусли кладу на полку, былина закончена...

Ответить