Używamy plików cookies (tzw. ciasteczka) by spersonalizować treść i ogłoszenia oraz by analizować ruch na stronie.  W sposób automatyczny dzielimy się informacjami o Twoim użyciu tego portalu z dostawcami ogłoszeń, którzy mogą połączyć te informacje z informacjami, które im udzieliłaś/łeś lub, które sami zebrali. Korzystanie z witryny bez zmiany ustawień dotyczących cookies oznacza, że będą one zamieszczane w Państwa urządzeniu końcowym.  Możecie Państwo dokonać w każdym czasie zmiany ustawień dotyczących cookies zmieniając opcje przeglądarki.

Kontrolowanie Rolet - biblioteki OSCAT

Biblioteka Building_common.lib udostępniania przez WAGO umożliwia proste i szybkie podłączenie i kontrolowanie rolet.  Stworzenie w oparciu o nią funkcji bardziej złożonych jest jednakże bardzo karkołomne i wymaga wiele 'manualnej' pracy.  

Alternatywnym rozwiązaniem jest sięgnięcie po biblioteki OSCAT udostępnianie nieodpłatnie na www.oscat.de. Pozwolę sobie w tym miejscu ostrzec osoby, które nigdy wcześniej nie dotykały ww. bibliotek.  Są olbrzymie, szczegółowe, poprzeplatane funkcjami i... ze skromną dokumentacją.  Jest to jednak projekt open-source, trzeba więc być wyrozumiałym, ale też wdzięcznym wszystkim, którzy biblioteki te stworzyli.

Pierwszą trudnością po dodaniu do projektu bibliotek oscat-basic i oscat-building może być pojawieniu się przy kompilacji błędu o przekroczeniu dozwolonej liczby POUs.  Rozwiązanie podpowiedział kamiKAC na naszym forum:

  1. Po dodaniu www. bibliotek do projektu i przed kompilacją (która zakończyłaby się błędem), należy w Target Settings w zakładce Memory Layout, w polu "Maximum number of POUs:" wpisać większą niż domyślną ilość dozwolonych POUs (np. 2000). Następnym krokiem jest skompilowanie projektu.  Po kompilacji nie będzie można wgrać projektu na sterownik, ale będzie możliwe automatyczne usunięcie z niego niewykorzystywanych bloków poprzez Project->Options->Build->Exclude objects... i naciśnięcie przycisku na dole "Exclude unused".  Przycisk jest dostępny tylko jeśli projekt był poprawny i został skompilowany.
  2. Gdy powyższe się uda, w Target Settings należy wpisać pierwotną, domyślną dla sterownika liczbę dozwolonych POUs, skompilować projekt i wgrać na sterownik.

Wielkie dzięki dla kamiKAC za podpowiedź!

 

W bibliotece oscat-building dostępnych jest wiele bloków funkcyjnych, z których do sterowania rolet najważniejsze wg mnie są:

BLIND_INPUT - do podłączenia przycisków i sygnałów wejścia,

BLIND_CONTROL(_S) - do podłączenia wyjść DO sterujących silnikiem rolety.

Najprostszą funkcjonalność możemy więc osiągnąć łącząc bloki BLIND_INPUT i BLIND_CONTROL w następujący sposób:

VAR
	Input_Blind1: BLIND_INPUT;
	Control_Blind1:BLIND_CONTROL_S;
END_VAR

* * *

Input_Blind1(
	S1:=Button1 OR VIS_Blind1_UP , S2:=Button2 OR VIS_Blind1DN,  POS:=Control_Blind1.POS
	);

Control_Blind1(
	UP:=Input_Blind1.QU, DN:=Input_Blind1.QD,
	S_IN:=Input_Blind1.STATUS, pi:=Input_Blind1.PO\
	);

OUT1:=Control_Blind1.MU;
OUT1:=Control_Blind1.MD;

Gdzie:

  • Button1, Button2 - wejścia DI z przycisków ściennych,
  • VIS_ ... - zmienne do sterowania z wizualizacji,
  • OUT1, OUT2 - wyjścia DI sterujące silnikiem rolety.

 

Powiązanie bloków BLIND_INPUT i BLIND_CONTROL_S najlepiej oddaje schemat zaczerpnięty przeze mnie z dokumentacji biblioteki oscat-building

Blind Input Oscat

Całe 'piękno' struktury, jaką oferuje biblioteka oscat-building, polega na tym, iż pomiędzy ww. bloki możemy wkładać inne, specyficzne, odpowiedzialne za wybrany obszar funkcyjny tj. sterowanie pozycją 'zrób cień', sterowanie pozycją w nocy (wg słońca lub czasu), sterowanie wg zdarzeń nadzwyczajnych (np. pożar, włamanie, wiatr), ustalanie scen, itd. Całość przypomina więc pojedyncze klocki lego, które można ustawiać jeden na drugim, budując wieżę.

Oto przykład żywcem wzięty z mojej instalacji - sterowanie 1 roletą w salonie:

VAR
	Clicker_IN1 : Fb_ShortLong:=(uiTS_10tel_s:=1, uiTL_10tel_s:=1, uiT_10tel_s :=5);
END_VAR

VAR RETAIN PERSISTENT
	Input_B_1S1 :BLIND_INPUT:=(PI:=120, MAX_RUNTIME:=T#25s, MANUAL_TIMEOUT:=t#60m, MASTER_MODE:=TRUE);
	Shade_B_1S1 :BLIND_SHADE_S:=(HORZ1:=70, HORZ2:=150, SHADE_POS:=150, SHADE_DELAY:=T#60s);
	Control_B_1S1 :BLIND_CONTROL_S:=(T_UP:=T#20s, T_DN:=T#18s);
END_VAR

* * *

Clicker_IN1(xSwitch:=IN1);
Input_B_1S1(
	S1:=Clicker_IN1.xShort OR VIS_B_1S1_UP, 
	S2:=Clicker_IN1.xLong OR VIS_B_1S1_DOWN, 
	IN:=VIS_B_1S1_SpecPos, 
	POS:=Control_B_1S1.POS
	);
Shade_B_1S1(
	UP:=Input_B_1S1.QU, 
	DN:=Input_B_1S1.QD, 
	S_IN:=Input_B_1S1.STATUS, 
	pi:=Input_B_1S1.PO, 
	ENABLE:=ShadeFlag_B_1S, 
	SUN:=SunSignal_1S,
	CX:=ReadClock.Calendar
	);
Control_B_1S1(
	UP:=Shade_B_1S1.QU, 
	DN:=Shade_B_1S1.QD, 
	S_IN:=Shade_B_1S1.STATUS, 
	pi:=Shade_B_1S1.PO
	);

OUT1:=Control_B_1S1.MU;
OUT2:=Control_B_1S1.MD;

Gdzie, w definicjach:

Clicker_IN1 - blok funkcyjny z biblioteki WAGO Building_common.lib rozpoznający długie i krótkie przyciśnięcie klawisza.  Blok z OSCATa o tej funkcjonalności działa wg mnie dużo gorzej.  

Input_B_1S1:

  • PI - pozycja, w której rolety mają się ustawić, gdy IN=TRUE (czyli ręczne ustalenie jakiejś konkretnej pozycji),
  • MAX_RUNTIME - maksymalny czas ruchu - przez tyle czasu pojawi się napięcie w silniku,
  • MANUAL_TIMEOUT - naciśnięcie przycisku ręcznego sterowania rolet wyłączy wszystkie inne programy (shade, night) na 60m,
  • MASTER_MODE - musi być TRUE, by poprawnie działały wszystkie funkcje dodatkowe (shade, night)

Shade_B_1S1:

  • HORZ1 - w stopniach, pozycja słońca, po przekroczeniu której roleta ma zająć pozycję SHADE,
  • HORZ2 - pozycja słońca, po przekroczeniu której roleta ma wrócić do pierwotnej pozycji,
  • SHADE_POS - pozycja rolety, gdy działa tryb SHADE,
  • SHADE_DELAY - opóźnienie z jakim blok ma reagować na zmiany wejścia SUN tj, by rolety nie latały w górę i w dół, gdy słońce schowa się za chmurą,

Control_B_1S1:

  • T_UP, T_DN - czas potrzebny na podniesienie i opuszczenie rolety (dobrze zmierzyć stoperem), użyty do wyliczania pozycji rolety.

 W kodzie programu:

Input_B_1S1:

  • S1 - wejście do sterowania 'w górę', tu sygnał krótkiego przyciśnięcia z wejścia IN1
  • S2 - wejście do sterowania 'w dół', tu sygnał długiego przyciśnięcia z wejścia IN1
  • IN - wejście do komendy 'zajmij pozycję określoną w PI', tu zmienna z wizualizacji,
  • POS - otrzymująca pozycję z bloku Control_B_1S1,

Shade_B_1S1

  • UP, DN, S_IN, pi - do podłączenia z bloku Input_B_1S1,
  • ENABLE - do podłączenia zmiennej, która decyduje, czy blok w ogóle ma być brany pod uwagę,
  • SUN - wejście czujnika słońca,
  • CX - do podłączenia zmiennej typu CALENDAR, tu zmienna Calendar zdefiniowana jest w odrębnym programie ReadClock.

Control_B_1S1

  • UP, DN, S_IN, pi - do podłączenia z bloku Shade_B_1S1

W osobnym programie ReadClock (wykonywanym co 1s: Task configuration, Append Task itd.):

VAR
	Calendar_Updater : CALENDAR_CALC:=(SPE:=TRUE);
	Calendar : CALENDAR:=(LATITUDE:=51.0, LONGITUDE:=16.0, OFFSET:=120);
	Holidays :ARRAY [0..29] OF HOLIDAY_DATA;
END_VAR

* * *

Calendar_Updater(XCAL:=Calendar, HOLIDAYS:=Holidays);
Calendar.Utc:=SysRtcGetTime(TRUE); (*make sure your system runs at UTC time, otherwise - correct it with for example +/- T#2h*)

Gdzie:

  • Calendar_Updater to blok funkcyjny CALENDAR_CALC, aktualizujący dane kalendarzowe,
  • Calendar - zmienna typu CALENDAR, przechowująca informacje o godzinie, pozycji słońca itd (super wynalazek!), OFFSET określa różnicę między czasem lokalnym a UTC,
  • Holidays - tablica, która powinna przechowywać dane o świętach, u mnie pusta, bez niej Calendar_Updater nie chciał działać

 

Jak to wszystko działa?

Krótkie przyciśnięcie przycisku pod IN1 podnosi roletę, długie (>0.5s) opuszcza, krótkie naciśnięcie w trakcie ruchu zatrzymuje roletę.  Gdy słońce przekroczy pozycję 70 (wschód na 90) roleta zjedzie do pozycji 150 (255 otwarta, 0 zamknięta), po przekroczeniu przez słońce pozycji 150 roleta wróci do pozycji sprzed opuszczenia, tap'nięcie zmiennej VIS_B_1S1_SpecPos w wizualizacji spowoduje ustawienie rolety w pozycji 120.  Jako że w salonie mam rolety od wschodu, południa i zachodu, zamykają się i otwierają kolejno zgodnie z pozycją słońca.

UWAGI:

  1. Wszystkie ww bloki funkcyjne posiadają jeszcze inne parametry, które można konfigurować.  Szczegóły są w dokumentacji,
  2. Bloki funkcyjne przechowywane w VAR RETAIN PERSISTENT nie są resetowane przy wgrywaniu całego programu tj., zmiana wartości ustalanych w momencie definiowania zmiennych będzie nieskuteczna.  Modyfikuję je przez wizualizację.
  3. Na dzisiaj (2012.07.11) blok BLIND_NIGHT w wersji 1.0 biblioteki oscat-building jest niezgodny z dokumentacją, tak jakby autorzy umieścili w bibliotece wersję testową, niekompletną.

Uffff.... powodzenia...