Gdy działało już sterowanie wszystkimi obwodami oświetlenia, zająłem się kontrolą temperatury w pomieszczeniach i rozdziałem wody z kotła c.o.
Od początku projektowania chciałem, by system sterował ogrzewaniem osobno w każdym z pomieszczeń. W rozdzielni wody z pieca, z której rozchodzą się rurki zasilające każdy z kaloryferów, zamontowane zostały termozawory działające na 24 VDC. Dodanie zaworów zwiększyło koszt rozdzielni o 500 złotych. Gdy odjąłem od tej kwoty koszt zaworów, które zazwyczaj umieszcza się na grzejnikach, różnica nie przerażała.
Pozostał problem pomiaru temperatury w pokojach. Długie godziny poszukiwania czujników opartych o element PT1000 nie przyniosły zadawalających rezultatów. Dostępne są czujniki Moellera i Siemensa, kosztują ponad 100 złotych. Czujniki firmy PIAST, choć tańsze, wyglądają wg mnie nieestetycznie. Na pewno nie chciałbym ich umieszczać na ścianach salonu i pokoi. Znalazłem jeszcze ofertę firmy Sensit z Czech, jednakże koszt czujników wraz z przesyłką przekraczał znacznie mój budżet.
Udało mi się jednak kupić na allegro jeden używany czujnik Siemensa za skromne 20 PLN. Gdy znalazł się na moim biurku wyjąłem śrubokręt i rozłożyłem go na części pierwsze. W środku luksusowej, arystokratycznej obudowy firmowanej logo Siemensa, które tłumaczy koszt na poziomie 150 PLN, znalazłem małą miedzianą blaszkę i… mikroskopijnych rozmiarów czujnik. W sklepie www.tme.eu znalazłem podobne za 7 PLN/sztuka, złożyłem zamówienie i tydzień później miałem ich 5 sztuk w cenie dużej pizzy. (dodatkowo w www.tme.eu kupiłem kilka brakujących elementów – wtyczki RJ45, zaciski na kable… wszystko w super cenie, szybko i sprawnie).
Wystarczyło następnie kupić w Castoramie lutownicę za 20 PLN, przeczytać instrukcję i przystąpić do pracy. Po 20 próbach i 1 przypaleniu palca pierwszy czujnik przymocowany do żył skrętki był gotowy do montażu. Po wpięciu go do modułu wejść analogowych w systemie bez problemu odczytałem temperaturę!
Myślałem długo nad znalezieniem odpowiedniej obudowy, jednakże ostatecznie zdecydowałem się umieścić czujniki w ramkach łączników ściennych. Specjaliści być może skrzywią się, że to niezgodnie ze sztuką, że nie ma przepływu powietrza… Pewnie gdybym miał więcej wiedzy i pieniędzy, zrobiłbym coś lepszego. Tymczasem jednak czujniki wystawiają główki przez małe dziurki w ramkach, są niewidoczne i… doskonale mierzą temperaturę. W kilka minut po tym, jak dzieci zaczynają skakać w swoim pokoju, na wykresie system rejestruje wzrost temperatury o 4 dziesiętne stopnia ;)
Przed zimą muszę jeszcze podłączyć termozawory w rozdzielni wody c.o. do systemu i oprogramować ich dzialanie. O ile to pierwszse powinno być proste, o tyle programowanie zachowania siłowników jest jeszcze wielką niewiadomą. W bibliotekach CoDeSys są bloki funkcyjne pozwalające ustawić poziomy brzegowe temperatur, określić bezwladność... czeka mnie jednak sporo testów i prób by wyważyć częstotliwość otwierania zaworów i komfort użytkowników.
(Aktualizacja 05.01.2013)
Zajęło mi 3 lata by 'dostroić' sterowanie ogrzewaniem tak, by nie sprawiało kłopotów. Ostatecznie:
1. Doborem temperatury wody zajmuje się automatyka pogodowa pieca. Doświadczalnie ustawilem pochylenie i poziom krzywej i nic więcej nie ruszam. Piec pilnuje się sam.
2. Sterowanie poszczególnymi obwodami odbywa się przez blok funkcyjny dostarczony przez WAGO w building_common.lib; Fb_Weather. Działanie najlepiej opisuje poniższy rysunek:
Źródło: Opis biblioteki building_common.lib firmy WAGO
Aby blok funkcyjny działał wystarczy określić wymaganą temperaturę w danym pomieszczeniu.
W moim przypadku Najlepiej sprawdza się ustalenie parametru wHyst1 = 4, czyli opóźnienie włączenia/wyłączenia obwodu ogrzewania, gdy temperatura będzie o +/- 0.2 stopnia różna od zadanej. Gdy początkowo testowałem z większymi wartościami, użytkownich narzekali, że bywa zbyt ciepło lub zbyt zimno.
Jeśli chodzi o program: w częsci definicji zmiennych:
VAR RETAIN PERSISTENT HEATER_0PL : Fb_Weather:=(dwTon_10tel_s:=10, dwToff_10tel_s:=3000, wHyst1:=4); TEMP_H0PL: INT; WINTER : BOOL; END_VAR;
Gdzie:
HEATER_0PL(iInput_Signal:=SensorReader.TEMPERATURE_4, iLimit1:=TEMP_H0PL*10, dwTon_10tel_s:=10, dwToff_10tel_s:=3000); OUT86:= WINTER AND (NOT HEATER_0PL.xActorLimit1);
Gdzie: