Управление освещением при помощи контроллера Siemens S7-1200
При написании статьи об удаленном доступе к контроллеру Siemens S7-1200 я упомянул, что у меня он используется для управления освещением. Немного усовершенствую данное управление.
Первоначально управление было сделано предельно просто: в комнатах вместо обычных выключателей установлены выключатели типа «Звонок», т.е. без фиксации положения, работает как кнопка. Нажал — свет включился, нажал — свет выключился.
Однако дом я строил в первый раз и конечно же не учёл всех нюансов при размещении выключателей.
Первые две проблемы, с которыми я столкнулся:
1. Выключатель света в гараже оказался за дверью, и при входе в гараж из дома необходимо обогнуть дверь и в темноте нащупать выключатель.
2. В спальне есть две группы освещения на потолке, но к прикроватным выключателям подведено 3 провода: одна пара управляет прикроватным бра, вторая одной группой освещения на потолке. Получается для выключения второй группы освещения на потолке необходимо воспользоваться веб-приложением или встать с кровати и подойти к выключателю у двери.
Первую проблему можно решить, задействовав выключатель лестничной клетки, которая находится перед входом в гараж. Однако к нему подведена всего одна пара проводом и клавиша там одна.
Вторую проблему также можно решить, повесив на единственный выключатель у кровати функцию выключения обеих групп освещения на потолке.
Самое очевидное решение данной проблемы: добавить длинные нажатия на выключатель. Т.е. кратковременные нажатия контроллер обрабатывает как обычно, а вот длинные нажатия для каждого выключателя индивидуальны как по действию, так и по времени нажатия.
Для реализации данной идеи необходимо изменить логику работы контроллера.
Хотелось бы выразить благодарность моему другу, Краснопёрову Всеволоду, за помощь в написании программы.
В default tag table у меня для каждого выхода есть соответствующий тэг:
в FBшке поменяются переменные:
Сам код тоже изменился:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
// Долгие нажатия для 3х выключателей IF #timer_count[1,0]=15 THEN "Q4.3":=NOT "Q4.3"; END_IF; IF #timer_count[3,7]=15 THEN "Q4.0":=NOT "Q4.0"; END_IF; IF #timer_count[4,0]=15 THEN "Q3.7":=NOT "Q3.7"; END_IF; // Выключение всего света в доме IF #timer_count[1,1]=30 THEN "QW0":=16#0; "QW2":=16#0; "QW4":=16#0; END_IF; // Основной цикл FOR #i:=0 TO 5 DO FOR #j:=0 TO 7 DO #bit_in:=PEEK_BOOL(area:=16#81,dbNumber:=0,byteOffset:=#i,bitOffset:=#j); #bit_out:=PEEK_BOOL(area:=16#82,dbNumber:=0,byteOffset:=#i,bitOffset:=#j); IF #bit_in THEN #timer_count[#i,#j]:=#timer_count[#i,#j]+1; END_IF; IF NOT #bit_in AND #bit_in_buffer[#i,#j] THEN IF #timer_count[#i,#j]<=5 THEN POKE_BOOL(area:=16#82,dbNumber:=0,byteOffset:=#i,bitOffset:=#j,value:=NOT #bit_out); END_IF; #timer_count[#i,#j]:=0; END_IF; #bit_in_buffer[#i,#j]:=#bit_in; END_FOR; END_FOR; |
В целом логика осталась такой же простой. Так как время одного цикла у меня равно 100 мс (правой кнопкой по Cyclic interrupt->Properties…->Cyclic time (ms)), то мы считаем количество циклов пока кнопка удерживается нажатой. Если количество циклов меньше 5 — считаем, что это короткое нажатие. Длинные нажатия для каждого выключателя описаны вначале, как я и говорил, они могут быть разные по времени (у первых трех время 15 циклов, у четвертого 30 циклов), и по действию.
Теперь прикроватный выключатель при коротком нажатии переключатель одну группу света на потолке, при длинном другую.
No Comments