'Inteligenty' dom ze sterownikiem PLC

 Language:
Szukanie zaawansowane  

Aktualności:

Powrót do strony głównej: www.edom-plc.pl

Pokaż wiadomości

Ta sekcja pozwala Ci zobaczyć wszystkie wiadomości wysłane przez tego użytkownika. Zwróć uwagę, że możesz widzieć tylko wiadomości wysłane w działach do których masz aktualnie dostęp.

Pokaż wątki - krwi

Strony: [1]
1
Programowanie / Powiadomienia push
« dnia: Listopad 02, 2019, 09:17:10 pm »
Dzisiaj chciałem się podzielić zastosowaną przeze mnie implementacją powiadomień push na sterowniku PLC Wago.
Powiadomienia są wysyłane za pośrednictwem serwisu pushover.net oczywiście takich usług jest wiele ja akurat wybrałem tę.
W Pushover mamy 7 dniowy okres darmowy potem licencja kosztuje $5 i tu uwaga jednorazowo na platformę (android, iOS lub desktop), więc płacąc jednorazowo $5 na androida dożywotnio możemy odbierać powiadomienia na urządzeniach z androidem.

Komunikacja z API Pushover odbywa się za pośrednictwem protokołu HTTPS więc koniczne jest włączenie do projektu biblioteki WagoLibHttps_01.lib, którą można pobrać ze strony Wago. Na wstępie warto sprawdzić wymaganą wersję firmwaru sterownika w dokumentacji biblioteki bo może okazać się konieczna aktualizacja (tak było w moim przypadku).

Zdefiniowałem blok funkcyjny postaci:

FUNCTION_BLOCK PUSHSEND
VAR_INPUT
xDoit : BOOL;
sMessage : STRING;
sPriority : STRING(2) := '0';
END_VAR
VAR
wState : WORD;
oHttpsPost : HTTPS_POST;
xHttpsSend : BOOL;
diError : DINT;
sStatus : STRING;
sReqData : STRING(200);
sHeaderData : STRING(105) := 'token=TOKEN&user=USER_KEY&retry=300&expire=3600&message=';
abResponse : ARRAY [0..gcHTTPS_dwRxBufferSize] OF BYTE;
END_VAR

sReqData := CONCAT (sHeaderData, sMessage);
sReqData := CONCAT (sReqData, '&priority=');
sReqData := CONCAT (sReqData, sPriority);

oHttpsPost(sServerName:='api.pushover.net',
sMethod:='/1/messages.json',
sContentType:='application/x-www-form-urlencoded',
pabReqData:=ADR(sReqData),
uiReqDataCount:=LEN(sReqData),
xSend:=xHttpsSend,
diError=> diError,
sStatus=> sStatus,
tTimeOut:= t#5s,
abContentData:=abResponse);

CASE wState OF
0: (* IDLE - wait for something to do *)
IF xDoIt THEN
xHttpsSend := TRUE; (* Send HTTPS-POST request *)
wState := 10;
END_IF

10: (* Wait for HTTPS-POST response data *)
IF NOT xHttpsSend THEN
wState := 999;
END_IF

999: (* *)
xDoIt := FALSE;
wState := 0;

END_CASE

Wartości dla TOKEN i USER_KEY należy wprowadzić zgodne z podanymi na koncie Pushover.
Blok przyjmuje 3 zmienne wejściowe, xDoit aktywuje wysłanie powiadomienia, sMessage to string z wiadomością, którą zobaczymy w powiadomieniu oraz sPriority opcjonalny priorytet jaki będzie nadany powiadomieniu push (dostępne wartości to -2, -1, 0, 1, 2 , uwaga wartości przekazujemy jako string).
Powyższy blok dopinam do każdego zdarzenia, które ma wysłać powiadomienie push, np. otwarcie bramy garażowej, włączenie alarmu, jakieś zdarzenie ze stacji pogodowej itp.

Działa to naprawdę wyśmienicie, powiadomienia dochodzą niemal natychmiast. Oprócz treści wiadomości i priorytetu można także opcjonalnie przekazać tytuł wiadomości, określony dźwięk jaki ma zostać odtworzony na urządzeniu, określić urządzenie lub grupę urządzeń na które ma zostać wysłane powiadomienie i inne rzeczy opisane w dokumentacji API Pushover.

Do powyższego bloku funkcyjnego warto dodać jeszcze funkcje ograniczającą ilość wysyłanych powiadomień w jednostce czasu aby po pierwsze nie zostać zaspamowanym powtarzającymi się powiadomieniami a po drugie żeby nie dostać bana z pushover.net.

Mam nadzieję, że ten opis będzie pomocny dla każdego szukającego sposobu implementacji powiadomień push na sterowniku Wago. Uwagi mile widziane.

2
Tematy ogólne / Pomiar zanieczyszczenia powietrza i warunków meteo
« dnia: Styczeń 09, 2015, 06:43:06 pm »
Cel i motywacja

Wreszcie udało mi się uruchomić stację pomiaru zanieczyszczenia powietrza i warunków meteorologicznych więc postanowiłem podzielić się z Wami tym pomysłem.
Na początku co mnie zmotywowało:
Po pierwsze mieszkam w okolicy (15 km) Krakowa, mieście o najbardziej zanieczyszczonym powietrzu w Polsce (a ponoć nawet w europie), po drugie mam czterech sąsiadów ogrzewających swoje domy węglem (żeby tylko). Dlatego od początku poszukiwałem metody pomiaru stanu powietrza i sterowania rekuperatorem w zależności od stopnia zanieczyszczenia.
Chodzi o to, że jak sąsiad akurat dorzuci do pieca to rekuperator się sam wyłącza dopóki poziom zapylenia nie spadnie poniżej ustalonego poziomu. Oczywiście rekuperator ma swoje filtry (na wejściu F7) ale zapychają się szybko (w sezonie grzewczym muszę wymieniać min. raz na miesiąc) po drugie ich skuteczność też nie jest 100%.
Oprócz monitorowania stanu zanieczyszczenia powietrza od razu chciałem system rozszerzyć o pomiar podstawowych parametrów meteo;  obecnie dodatkowo mierzę temperaturę, wilgotność i ciśnienie. Natomiast w przyszłości mam zamiar rozbudować stację o pomiar prędkości i kierunku wiatru, opadów itp.

Dobór urządzeń i konstrukcja

Rozwiązanie oparłem na czujniku pyłu DSM501A nabytym na eBayu za 9.5 $, do tego czujnik temperatury i wilgotności DHT22 za 24 zł oraz czujnik ciśnienia BMP180 za 13 zł.
Układ sterujący zbudowałem w oparciu o mikrokontroler (μC) Arduino Uno (a dokładnie jego tańszy klon Funduino) za 41 zł do tego moduł ethernet za 37 zł i zasilacz 9V/2A za 30 zł. Po złożeniu kontrolera odkryłem, że wybór modelu Uno był błędem ponieważ łącząc go z modułem ethernet tracimy aż 5 wejść teraz wiem, że trzeba było wybrać model Leonardo, który nie ma tej wady. Do Arduino również podłączyłem sieć czujników 1-Wire mierzących temperaturę wewnątrz pomieszczeń.



μC umieściłem w uniwersalnej obudowie na szynę DIN i zamontowałem w szafie obok sterownika PLC, natomiast czujniki znalazły miejsce w obudowie zbudowanej z sześciu białych miseczek melaminowych (nie wiem czy to cecha melaminy czy akurat tych miseczek ale okazały się bardzo kruche także cudem udało mi się powiercić wymagane otwory bez całkowitego ich zniszczenia) skręconych na trzech prętach gwintowanych tworząc coś na kształt tzw. osłony radiacyjnej, którą zamontowałem bezpośrednio przy czerpni rekuperatora.
Obudowa składa się z dwóch oddzielnych komór; dolnej w której znajduje się czujnik DHT22 oraz większej górnej gdzie umieściłem czujniki DSM501A, BMP180 oraz pozostałą elektronikę (dlaczego tak - wyjaśnię poniżej). Do obudowy czujników doprowadziłem skrętkę UTP kat 5e (ok 10 m).



Problemy

Aby nie wchodzić zbytnio w szczegóły poniżej opiszę główne problemy z którymi musiałem się zmierzyć:
  • Stabilizacja napięcia.
    Czujnik  DSM501A zwraca sygnał w postaci PWM, okazało się że zasilając wszystkie czujniki z wyjścia μC dostawałem bardzo silne zakłócenia sygnału. W końcu zdecydowałem się na umieszczenie w obudowie czujników modułu zasilania AMS1117 (9 zł), który z linii 9V doprowadzonej do obudowy podaje stabilizowane napięcie 5V do czujników. Wewnętrzne czujniki 1-Wire pozostawiłem zasilane z wyjścia 5V Arduino.
  • Ogrzewanie czujnika.
    Czujnik DSM501A ma dość wąskie parametry otoczenia, w których może pracować w szczególności temperatura nie powinna być niższa niż -10 ºC a wilgotność większa niż 95 %. Oczywiście zależało mi aby czujnik pracował również przy niższych temperaturach (im zimniej tym więcej dymu z kominów) dlatego zlutowałem z 6 rezystorów 75 Ω prostą grzałkę „drabinkową”, którą otoczyłem czujnik (teraz widzę, że grzałka mogłaby być trochę mocniejsza).
    Grzałka załączana jest przez przekaźnik (6.4 zł) umieszczony w obudowie razem z czujnikami i podłączony do linii zasilającej 9V (sam przekaźnik musi być również zasilany napięciem 5V więc jest również podłączony do modułu AMS1117). Przekaźnik jest załączany przez μC na podstawie odczytów z czujnika DHT22.
    Teraz jest jasne dlaczego obudowa czujników musi mieć dwie komory, dzięki temu włączona grzałka nie będzie zakłócać odczytów z DHT22. Tak się składa, że umieszczony w górnej komorze czujnik ciśnienia BMP180 posiada również wbudowany sensor temperatury dzięki temu mogę na bieżąco odczytać skuteczność grzania grzałki.
  • Wzmacniacz sygnału I2C.
    Czujnik BMP180 komunikuje się za pomocą magistrali I2C, niestety okazało się, że taka komunikacja sprawnie działa jedynie na kablu maks kilkadziesiąt centymetrów. Żeby móc podłączyć czujnik na 10 m skrętce konieczne okazało się zlutowanie układu wzmacniającego. Do tego były potrzebne dwa układy P82B715PN (na eBay łącznie z przesyłką 9 $) oraz 4 rezystory 4.7 kΩ i 4 rezystory 470 Ω.
    Wzmacniacz składa się z dwóch identycznych modułów każdy umieszczony na jednym końcu kabla sygnałowego. Rezystory pull-up 4.7 kΩ lutujemy na obu liniach sygnałowych od strony urządzenia odbiorczego/nadawczego a rezystory 470 Ω od strony długiej skrętki (w dokumentacji P82B715PN są odpowiednie schematy).
  • Problem ze switchem ethernet.
    Po podłączenie Arduino z modułem ethernetowym do mojego switcha DLink (jakiś tani 5 portowy model), który tymczasowo miałem w szafie okazało się, że komunikacja ma straty na poziomie 50 % pakietów.
    Długo nie mogłem znaleźć przyczyny problemów, w końcu kupiłem nowy switch TP-Link 8 portów i problem znikł. Dlaczego Arduino nie dogaduje się z DLinkiem nie mam pojęcia, tym bardziej, że ten DLink działa poprawnie ze wszystkimi innymi moimi urządzeniami.
  • 85 ºC na czujnikach 1-Wire.
    Na biurku wszystko działało jak należy (również na długim kablu), natomiast jak to zwykle bywa bo wlutowaniu czujników na swoje miejsce i podłączeniu μC zamiast temperatury w moich pomieszczeniach dostają wartość 85. Zmniejszenie rezystora pull-up do 1 kΩ nieco pomogło ale nie rozwiązało problemu do końca (co jakiś czas nadal dostaję takie odczyty).
  • Zwis μC po zaniku zasilania.
    Po zaniku zasilania z niejasnych przyczyn moje Arduino nie chce wystartować, jakby się zawiesza przy starcie. Softwarowy watchdog problemu nie rozwiązuje, jedynie pomaga twardy reset lub wyjęcie i włożenie wtyczki zasilania (przy włączonym zasilaczu). Podejrzewam niską jakość mojego zasilacza, który w momencie startu podaje niewłaściwe napięcie powodując zwis μC.
    Problem na razie pozostaje nierozwiązany.

Przetwarzanie danych

Jak już wspomniałem dane z czujników zbiera μC Arduino Uno, który serwuje prostą stronę HTML z aktualnymi odczytami. Również z tego miejsca dane pobiera i parsuje sterownik PLC (z wykorzystaniem biblioteki WagoLibHttp_02.lib) .
Oprócz tego μC po każdej aktualizacji odczytów wysyła nowe wartości na serwer (metodą POST PHP) gdzie są zapisywane do bazy danych typu RRD. Na serwerze znajduje się również strona HTML (na razie jeszcze w budowie), która na podstawie danych z bazy RRD tworzy ładne wykresy, statystyki i co tam nam do głowy przyjdzie.



Tutaj pojawił się mały problem, żadna z firm hostingowych (sprawdziłem chyba z 10) nie udostępnia na swoich hostingach PHP z modułem RRD. Więc pozostaje VPS (poniżej 10 zł/m nie znalazłem a to i tak trochę zbyt dużo) lub hostowanie serwisu u siebie przy czym, póki co pozostałem.

Sterowanie rekuperatorem

Mając już aktualne dane w sterowniku PLC można na ich podstawie sterować rekuperatorem. Niestety w czasie kiedy wybierałem rekuperator do swojego domu moja wizja automatyki domowej dopiero raczkowała więc nie zwróciłem uwagi na możliwość skomunikowania automatyki rekuperatora ze sterownikiem. Skutkiem tego mam rekuperator, który nie posiada żadnego interfacu do komunikacji a wymiana modułu automatyki na wersję z interfacem MODBUS kosztuje 1140 zł netto, jak dla mnie zbyt dużo.
Ostatecznie sterowanie rekuperatorem w moim przypadku sprowadza się do brutalnego włącz/wyłącz przekaźnikiem na zasilaniu rekuperatora. Gdy stan powietrza przekracza ustalony poziom (np sąsiad właśnie dorzucił do pieca) rekuperator się wyłącza do czasu aż koncentracja pyłów znowu spadnie poniżej ustalonego progu.

Podsumowanie

W powyższym i tak przydługim wpisie opisałem ogólną konstrukcję stacji pomiaru zanieczyszczenia powietrza oraz warunków meteo pomijając mniej istotne szczegóły.
Stację taką udało mi się skonstruować i działa zgodnie z oczekiwaniami. W następnym etapie mam zamiar rozbudować układ o pomiar prędkości i kierunku wiatru oraz opadów, niestety czujniki wiatru nie są już takie tanie.
Jeśli kogoś zainspirowałem tym wpisem i chciałby poznać więcej szczegółów proszę pytajcie, w wolnej chwili odpowiem.

3
Tematy ogólne / WAGO - zachowanie zmiennych po aktualizacji softu
« dnia: Maj 25, 2013, 10:48:15 pm »
Cześć,
czy istnieje jakiś sposób aby wartości zmiennych globalnych zostały zachowane po wgraniu nowej wersji oprogramowania do sterownika WAGO? Mam szereg zmiennych zliczających np. ilość włączeń światła, czas świecenia itp., niestety po każdej zmianie w programie i wgraniu nowej wersji zmienne ulegają wyzerowaniu :(

4
Tematy ogólne / Zasilanie łączników
« dnia: Październik 19, 2011, 09:11:01 pm »
Chciałbym jeszcze zapytać jak zrealizowałeś rozszycie zasilania do łączników. W każdej skrętce biegnącej do łącznika przynajmniej jedna żyła musi być podłączona do zasilania 24V. Z tego co widzę skrętki rozszyłeś na patchpanelu natomiast jak spiąłeś zasilanie tych wszystkich żył?

5
Tematy ogólne / Szafa rozdzielcza
« dnia: Sierpień 21, 2011, 12:55:31 pm »
Jaką szafę rozdzielczą zastosowałeś? O ile wiem w typowych rozdzielnicach mieszczą się 24 moduły w rzędzie a u Ciebie jest znacznie więcej. Wybacz jeśli ta informacja gdzieś była a ja jej nie znalazłem.

6
Tematy ogólne / Topologia gwiazdy to jedyna możliwość?
« dnia: Sierpień 14, 2011, 08:30:11 pm »
Witam.
Na różnych forach poświęconych instalacjom opartym o sterownik PLC pojawiają się głosy krytyki prowadzenia kabli w topologii gwiazdy, czyli sprowadzania wszystkich obwodów do jednej rozdzielni. Mówi się, że to dużo kabli, drogo, nie ekonomicznie, awaryjnie itp. Natomiast nigdzie nie natrafiłem na propozycję innego rozwiązania. Czy w związku z tym ktoś zna inny sposób położenia kabli przy instalacji opartej o sterownik PLC? Sam rozważałem użycie przekaźników podtynkowych, niestety nie udało mi się znaleźć takich działających na 24V.

7
Tematy ogólne / Przekaźniki i moduły wej-wyj
« dnia: Sierpień 14, 2011, 05:11:57 pm »
Cześć.
Mógłbyś podać jakie dokładnie moduły wej-wyj zastosowałeś, czy był jakiś powód, że wziąłeś 8 kanałowe zamiast 16? A jaki rodzaj przekaźników, czy to też Wago?

8
Sterowanie i Wizualizacje / Łączniki
« dnia: Sierpień 11, 2011, 10:11:00 pm »
Witam.
Możesz podać dokładnie jakie rodzaje łączników zastosowałeś?

Strony: [1]