'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.

Wiadomości - vakul

Strony: [1] 2 3 ... 5
1
U siebie przez kilka miesięcy miałem taką prowizorkę, która działała wyśmienicie:

1. Od rozdzielnicy do źródła oświetlenia przewód 3x1,5
2. Od włącznika do rozdzielnicy przewód UTP 4x2x0,5
3. Na ścianach przyciski monostabilne (tzw. dzwonkowe)
4. W rozdzielnicy przekaźniki 24V monostabilne, cienkie wago, które aktywowały przekaźniki z cewką 230V bistabilne (montowane na szynę DIN).

Punkt 4. rozbity na dwa przekaźniki z racji tego, że nie mogłem znaleźć w sensownej cenie przekaźników bistabilnych na 12/24V, a te w wersji 230V były za jakieś normalne pieniądze (kupiłem najtańsze). Zasilacz 24V, przekaźniki wago - to wszystko zostało w docelowej instalacji opartej na WAGO 750-880, zdemontowałem tylko przekaźniki 230V. Mam gdzieś jeszcze te przekaźniki, jeśli jesteś zainteresowany. Teraz na allegro widzę za około 25zł/sztuka.

Jeżeli kiedyś ktoś rozmyśli się ze sterowanika w rozdzielnicy, to oparcie instalacji na przekaźnikach bistabilnych jest chyba jedynym rozwiązaniem, który ogarnie każdy domorosły elektryk.

2
Tematy ogólne / Odp: PLC i kontaktron
« dnia: Maja 13, 2021, 12:20:14 pm »
Opcja pierwsza:

OUT_LIGHT_SPIZARNIA := NOT IN_KONTAKTRON_SPIZARNIA;
jeżeli kontaktron spiżarni jest rozwarty (NOT ...) to OUT_LIGHT_SPIZARNIA ma być stanem wysokim. Bez "NOT" działało by na odwrót, kontaktron zwarty, światło się świeci.

Opcja druga:
Inna możliwość, to wychwycenie zbocza narastającego i opadającego, czyli momentów przełączenia stanu.
Musisz dodać dwie definicje nowych zmiennych:

spizarnia_rtrig : R_TRIG;
spizarnia_ftrig : F_TRIG;

Następnie w kodzie przypisać wejście kontaktrona jako sygnał sterujący dla R_TRIG i F_TRIG:

spizarnia_rtrig ( CLK := IN_KONTAKTRON_SPIZARNIA);
spizarnia_ftrig ( CLK := IN_KONTAKTRON_SPIZARNIA);

Dalej w kodzie musisz użyć dwóch warunków do wychwycenia momentów przełączenia kontaktrona:
IF (spizarnia_rtrig.Q) THEN
   (* .... kontaktron przechodzi w stan wysoki *)
END_IF;
IF (spizarnia_ftrig.Q) THEN
   (* .... kontaktron przechodzi w stan niski *)
END_IF;

Zwróć uwagę, że warunki "IF" będą wykonane tylko JEDEN raz w momencie przełączenia stanu.

3
Tematy ogólne / Odp: Zliczanie energii i mocy
« dnia: Kwietnia 11, 2021, 11:11:08 pm »
Do obliczeń tworzona jest tymczasowa kopia zmiennej z nowym typem REAL. Jej wartość jest taka sama ale sposób jej zapisu w pamięci jest inny. Dzięki temu możesz wykonać obliczenia na liczbie zmiennoprzecinkowej, której część dziesiętna nie przepadnie, bo tym razem masz ją gdzie przechować. Zmienna Water_All_Duration pozostaje nietknięta, jej typ się nie zmienia.

4
Tematy ogólne / Odp: Zliczanie energii i mocy
« dnia: Kwietnia 08, 2021, 11:11:42 am »
To zrób tak i będzie dobrze:
Water_All_Consum := 60000/DWORD_TO_REAL(Water_All_Duration);
Water_All_Duration jest WORDem, 60000 jest WORDem, więc wynik też będzie WORDem. Niejawna konwersja wyniku na REAL jest już ze stratą części dziesiętnej. Wymuszając konwersję typu przed wykonaniem działania zaczynasz działać na właściwym typie danych.

5
Tematy ogólne / Odp: Zliczanie energii i mocy
« dnia: Kwietnia 01, 2021, 08:45:14 pm »
Pomyłka, tak miało być:
X := REAL_TO_WORD((T+100)*100);

6
Tematy ogólne / Odp: Zliczanie energii i mocy
« dnia: Kwietnia 01, 2021, 08:32:32 pm »
Zerowanie licznika, przy ustaniu poboru wody:
IF (Water_All_Consum>0 AND TIME_TO_REAL(TIME()-Water_All_Time) > 5000) THEN
   Water_All_Consum := 0;
END_IF;

Musisz dopasować typy zmiennych i czas trwania impulsu do swoich potrzeb. Wg mnie niepotrzebnie używasz tutaj typu REAL, zamień to na DWORD, czas trwania impulsu może być dużą liczbą naturalną (nawet nie całkowitą), więc nie ma potrzeby trzymania tego w REAL.

Co do wysyłania typu REAL przed modbusa, to możesz to zrobić jeszcze np. tak: X := REAL_TO_WORD(T+100)*100; Gdzie T to temperatura.
Czyli temperatura T=-32.55 stopnia zamieni się na 6745. A po drugiej stronie zrobisz odwrotną konwersję T := WORD_TO_REAL(X)/100-100;
Tutaj tak samo, typy zmiennych i parametry do dopracowania.

7
Tematy ogólne / Odp: Zliczanie energii i mocy
« dnia: Kwietnia 01, 2021, 08:33:43 am »
Cytuj
jak przekonwertować wartość REAL na dwa Wordy

Na początek pomyślałem o przesuwania bitów w lewo lub prawo (funkcje SHL i SHR).

Ale znalazłem to:
https://forge.codesys.com/forge/talk/Engineering/thread/029f5a8611/
https://forge.codesys.com/forge/talk/CODESYS-V2/thread/807002cc9e/

Nie wczytywałem się w szczegóły ale masz tam przedstawione ciekawe rozwiązania.

8
Tematy ogólne / Odp: Zliczanie energii i mocy
« dnia: Marca 31, 2021, 03:51:23 pm »
Jest dostęp do zmiennych, użyj NAZWA_POU.zmienna
Zmienna nie musi być globalna.

Dziel na bloki wszystko jak leci, brama, światła, liczniki, itd. wszystkie w osobnych POU.

9
Tematy ogólne / Odp: Zliczanie energii i mocy
« dnia: Marca 31, 2021, 11:57:18 am »
Z nowym eCockpit nie miałem do czynienia, więc nie pomogę. Ale poszperaj po zakładkach, bo gdzieś to powinno być. Ewentualnie szukaj w internecie, jak odczytać statystyki wykonania programów na PLC.

Takie spowolnienia dla sterownika, to mogą powodować jakieś funkcje związane z obsługą sieci (mysql, mqtt lub inne), warto ustalić co jest nie tak.

10
Tematy ogólne / Odp: Zliczanie energii i mocy
« dnia: Marca 29, 2021, 11:44:44 am »
Wrzuć obsługę licznika do osobnego POU i wywołaj to w Task Configuration jako osobne zadanie z większą częstotliwością. Zobacz czy coś pomoże.

Ponadto podejrzyj co się dzieje z taskami, skoro gubisz impulsy. Podłącz się do sterownika i przejdź do PLC-Browser i wpisz "login admin wago" a następnie "tsk" i zobacz co tam ciekawego wypisuje. Być może jakiś program blokuj Ci sterownik na dłuższy czas, to będziesz to tam widział.

70ms to bardzo długi impuls, więc gubienia impulsu z powodów sprzętowych nie podejrzewam.

11
Tematy ogólne / Odp: Zliczanie energii i mocy
« dnia: Marca 28, 2021, 11:44:38 am »
Zerknij w podglądzie, jaki jest odstęp między impulsami Energy_All_Duration. Jeżeli włączysz grzałkę (np. czajnik), to ta wartość powinna być z grubsza stała. Zapewne zobaczysz, że raz masz np. 450ms innym razem 530ms itd.

Przy dużych mocach/częstych impulsach (np. 2kW) pojawia się problem nieregularnego wykonania programu odpowiedzialnego za zliczanie energii. Sterownik obciążony zadaniami raz zajrzy do Twojego programu z opóźnieniem np. 30ms i już masz gotową różnicę w zmiennej Energy_All_Consum. W tym samym czasie wskazanie licznika będzie narastać prawidłowo, bo sterownik nie gubi impulsów tylko nieregularnie wykonuje obliczenia. Przy rzadkich impulsach różnica wskazań w Energy_All_Consum będzie niezauważalna.

W bloku IF dodaj jeszcze Energy_All_Meter := Energy_All_Meter + 0.001; żeby mieć wskazanie liczydła z licznika.

Rozwiązaniem jest wyliczenie zmiennej Energy_All_Consum raz na kilka impulsów i będzie jak należy. Idealnie w zależności od aktualnego poboru energii.

Miałem podobny problem z falownikiem, który bardzo szybko zmieniał wskazania produkcji i chciałem to uśrednić. Poniżej fragment kodu, który nakreśli Ci ogólną koncepcję.

IF ((PV_FroniusLicznik_Total-PV_FroniusLicznik_Total_prev) >= PV_FroniusCounterStep) THEN


PV_FroniusCounterChange := DWORD_TO_INT(PV_FroniusLicznik_Total-PV_FroniusLicznik_Total_prev);
PV_FroniusLicznik_CurrentAvg := REAL_TO_INT(3600000.0/PV_FroniusLicznik_Total_prev_duration * PV_FroniusCounterChange);

PV_FroniusLicznik_Total_prev := PV_FroniusLicznik_Total;
PV_FroniusLicznik_Total_prev_time := TIME();

(* spowolnienie usredniania jezli produkcja jest wysoka, a impulsy zbyt czeste *)
CASE (DWORD_TO_INT(PV_FroniusLicznik_CurrentAvg)) OF
0..800:
PV_FroniusCounterStep := 1;
801..1400:
PV_FroniusCounterStep := 2;
1401..2000:
PV_FroniusCounterStep := 3;
2001..3000:
PV_FroniusCounterStep := 4;
ELSE
PV_FroniusCounterStep := 5;
END_CASE;

END_IF;

W Twoim przypadku byłoby jakoś tak:
Energy_All_Trigger(CLK:=xIN_Licznik_Energii_All);
IF Energy_All_Trigger.Q THEN
Energy_All_Meter := Energy_All_Meter + 0.001;
END_IF;

IF (Energy_All_Meter - Energy_All_Meter_prev >= Energy_All_Meter_step / 1000) THEN
(*
    Energy_All_Meter_prev := Energy_All_Meter;
tutaj wszystkie obliczenia


*)

CASE (DWORD_TO_INT(Energy_All_ConsumAvg)) OF
0..800:
Energy_All_Meter_step := 1;
801..1400:
Energy_All_Meter_step := 2;
1401..2000:
Energy_All_Meter_step := 3;
2001..3000:
Energy_All_Meter_step := 4;
ELSE
Energy_All_Meter_step := 5;
END_CASE;
END_IF;


Zwróć uwagę na typy zmiennych, ja trzymam liczniki w zmiennych REAL. Ponadto zmienna Energy_All_Meter powinna być w bloku VAR RETAIN PERSISTENT, żeby wskazania nie przepadały przy restartach.

12
Tematy ogólne / Odp: Konwerter RS232 <> RS485
« dnia: Marca 04, 2021, 11:09:53 am »
Rozeznaj jeszcze możliwość sterowania bezpotencjałowego, czy sterownik ma możliwość podłączenia karty wej/wyj? Obejrzyj płytkę sterownika i zobacz co można zrobić.

13
Tematy ogólne / Odp: Konwerter RS232 <> RS485
« dnia: Lutego 26, 2021, 02:00:45 pm »
Masz rację, kupy się nie trzyma. Otwórz rekuperator i obejrzyj sobie płytkę sterownika i zobacz, co tam masz wyprowadzone.
Z kolei wymiana manipulatora nie wyprowadzi Ci przecież osobnego złącza RS-485, więc wszystko musiałoby działać na tych samych kabelkach, na tych samych zasadach. Innymi słowy modbus już tam musi być.

Spróbuj do nich zadzwonić i telefonicznie wyciągnąć więcej informacji, musi być jakiś sensowny i bezkosztowy sposób, żeby to ugryźć.

14
Tematy ogólne / Odp: Konwerter RS232 <> RS485
« dnia: Lutego 24, 2021, 09:14:21 am »
Ja mam RC6 komfort ale sterownik jest S3.
I patrząc na tabelkę: https://www.pro-vent.pl/sterowanie/rc6-komfort/ (zakładka funkcje) wychodzi na to, że RC6 mini nie obsługuje modbusa.

Chyba jest tak, że przy sprzedaży konkretnego zestawu dostajesz to za co dopłaciłeś (np. modbus) i wtedy ładują odpowiedni firmware do sterownika. Druga opcja jest taka, że masz niewyprowadzone złącze modbusa na zewnątrz pudła i trzeba się wpiąć do płytki.

Sam sterownik S4 modbusa obsługuje:
https://www.pro-vent.pl/wp-content/uploads/2020/04/instrukcja-modbus-s4.pdf
https://www.pro-vent.pl/wp-content/uploads/2020/04/opis-rejestrow-modbus-s4.pdf

Poczytaj jeszcze to:
https://www.pro-vent.pl/wp-content/uploads/2020/03/instrukcja-obslugi-rekuperatorow-dtr-cz2.pdf
i przemyśl, czy może da się tym sterować bez modbusa (np. terminal wejść-wyjść)

15
Tematy ogólne / Odp: Konwerter RS232 <> RS485
« dnia: Lutego 22, 2021, 08:17:20 pm »
Rejestry masz rozpisane, są dostępne w pdfach na stronie pro-ventu, nie musisz niczego odkrywać na piechotę.
Który model rekuperatora i sterownika masz u siebie? Ja miałem jakąś pierwszą wersję sterownika, w której modbus prawie nie działał i wymienili mi bezpłatnie sterownik i manipulator (Sterownik S3 + RC6 komfort).

Proponuję, żebyś do nich zadzwonił i zapytał jakie masz opcje. Są pomocni, więc warto zacząć od telefonu.

16
Tematy ogólne / Odp: Konwerter RS232 <> RS485
« dnia: Lutego 21, 2021, 08:26:33 pm »
Aha, teraz zrozumiałem, że wpinasz się razem z manipulatorem do linii modbusa. A powinieneś do osobnego portu modbus dla urządzeń zewnętrznych (na rekuperatorze powinny być wyprowadzone 2 osobne porty). Jeśli dobrze pamiętam, to manipulator chyba nie gadał po zwykłym modbusie, tylko mieli jakiś własny protokół.
W razie problemów, zadzwoń do pro-ventu, bo w kwestiach technicznych są pomocni.

17
Tematy ogólne / Odp: Konwerter RS232 <> RS485
« dnia: Lutego 19, 2021, 05:32:26 pm »
Pro-vent ma generalnie schrzanionego modbusa. Odpuściłem sobie komunikację z poziomu PLC, nie działało mi to dobrze, dużo szumów i śmietnik zamiast danych. Ostatnio zrobiłem przystawkę Wemos+konwerter rs485 i to z kolei działa mi bardzo dobrze, choć na razie wisi na pająka, bo nie mam czasu poskładać do kupy.

Głównym problemem było to, że pro-vent nie rozmawiał częściej niż 1000ms i trzeba było pilnować okienek do rozmowy z rekuperatorem.
Dane wyrzucam przez mqtt do openhaba, zrobiłem aktualizację czasu na manipulatorze, bo po każdym restarcie trzeba było go ustawiać na nowo.
Rekuperator jest cyklicznie odpytywany o różne rejestry i wystawia dane dalej.


18
Tematy ogólne / [SPRZEDAM] Sterowniki, moduły, zasilacze, akcesoria
« dnia: Stycznia 18, 2021, 03:31:18 pm »
W razie pytań proszę o prywatną wiadomość.
Przy większym zakupie ceny do lekkiej negocjacji.

Sterowniki z serii 750:
750-301 - [PROFIBUS DP/FMS Fieldbus Coupler] - 1 szt (używane) - 80zł
750-338 - [Fieldbus Coupler CANopen; D-Sub] - 1 szt (używane) - 80zł
750-341 - [ETHERNET TCP/IP fieldbus coupler] - 1 szt (używane) + 1 szt (nowe) - 150zł/200zł szt
750-838 - [Controller CANopen] - 2 szt (używane) - 150zł
750-841 - [Controller ETHERNET] - 1 szt (używane) - 350zł

Moduły z serii 750:
750-402 - [Input Module, Digital, 4 Channel, Positive Switching] - 8 szt (używane) / 22zł
750-430 - [8 DI] - 3 szt (używane) - 90zł/szt
750-454 - [2-Channel Analog Input Module 0/4-20 mA diff inputs] - 2 szt (używane) / 110zł
750-461 - [2-Channel Analog Input Module for RTDs] - 1 szt (używane) / 350zł/szt
750-468 - [4-Channel Analog Input Module 0-10V] - 2 szt (używane) / 350zł
750-506 - [2 DO] - 3 szt (używane) / 10zł/szt
750-514 - [2-Channel Relay Output Module 125 V AC, 30 V DC] - 10 szt (używane) + 2 szt nowe / 35zł (50zł nowe)
750-530 - [8 DO] - 10 szt (używane)  95zł/szt
750-600 - [end module] - 1 szt (używane) + 1 szt (nowe) 20zł/szt
750-630 - [SSI transmitter interface] - 1 szt (używane)
750-638 - [Counter, Up-Down, 2 Channel, 24 Vdc, 500 Hz] - 1 szt (nowe) / 100zł/szt
750-640 - [Real-time clock module] - 1 szt (używane) 65zł/szt
750-652 - [RS-232/485 adjustable] - 4 szt (używane) + 1 szt (nowe) - 400zł/450zł szt
750-653 - [RS-485 Serial Interface] - 32 szt (używane) + 1 szt (nowe) - 350zł/400zł szt
750-1405 - [16 DI] - 3 szt (używane) + 1 szt (nowe) - 200zł/szt
750-1407 - [16 DI, Low-side switching] - 1 szt (używane) - 190zł/szt

4x 100 sztuk 2273-204 złączki WAGO 4x 0,5-2,5mm2 - nowe, 48zł/opakowanie
1x licznik dwukierunkowy LE-03MQ - nowy w opakowaniu - 650zł
52x przekaźnik Finder 24V (przekaźnik 34.51.7.024.0010 + podstawka 93.01.7.024) - nowe w opakowaniach, 35zł/szt
10x przekaźnik impulsowy bistabilny 230V LC-TEC EPN510 (używane) - nowy 21/szt - używane - 13zł/szt
1x 787-912 zasilacz 24V 2A - używany - 120zł
30x 857-304 przekaźniki cienkie WAGO 24V w podstawkach (nowe) - 30zł/szt
3x przetwornica DC/DC TRACO POWER TZL 060-2424, input 18-36VDC, output 24VDC/2.5A (używane) - 70zł/szt

Zestaw sterownik + moduły - (używane) - 200zł/zestaw
IQ Controls Galileo Inoux Mix 
IQ Controls Galileo Inoux B8
IQ Controls Datacom WGL 

19
Jak pamiętam, to bez targetów, wersja demo pozwalała wgrać program do sterownika. Jednak po odcięciu zasilania jego pamięć była czyszczona i nie było w nim ostatnio wgranego programu. Po ponownym ręcznym wgraniu programu, sterownik znowu działał. Jakoś tak to było.

Teoretycznie więc zasilacz buforowy 24V i akumulator załatwią sprawę targetów :)

20
Targety to pliki konfiguracyjne, które należy wgrać do odpowiedniego folderu Codesys.
Instalujesz Codesys pobrany z internetu i dorzucasz ręcznie pliki. To wszystko.

21
(Pod)Systemy i Funkcje / Odp: Monitorowanie mocy, energii i przeplywow...
« dnia: Stycznia 12, 2021, 08:51:11 pm »
Z doświadczenia paroletniego podpowiem, że nie ma potrzeby monitorowania każdej fazy. Wystarczy jeden licznik trójfazowy. Ostatecznie i tak wszystko sumujesz i notujesz/wyświetlasz bieżące zużycie.

U mnie fotowoltaikę zlicza ORNO OR-WE-505, a zużycie domu LE-03MP. Teraz założyłbym 2x ORNO lub podobny, z wyjściem impulsowym bez żadnych RSów, korzyść ta sama a pieniądze dużo mniejsze. Zwyczajnie nie korzystam z informacji, które licznik mi daje. Czasami tylko zerknę na obciążenie faz.

Po montażu fotowoltaiki kupiłem też LE-03MQ (dwukierunkowy i wypaśny) ale nigdy go nie zamontowałem. Rozwiązanie dwulicznikowe okazało się efektywne, a LE-03MQ mam do sprzedania.

Na aliexpress są liczniki SDM120 jednofazowe ale jest też wersja 3fazowa za jakieś normalne pieniądze. Ma to modbusa i jest dobrze udokumentowane.

22
(Pod)Systemy i Funkcje / Odp: Monitorowanie mocy, energii i przeplywow...
« dnia: Stycznia 12, 2021, 09:42:17 am »
Panowie, nie potrzebujecie żadnych specjalnych liczników. Szkoda pieniędzy.

Potrzebne są 2 zwykłe liczniki (trójfazowe z wyjściem impulsowym), a z nich można wszystko wyliczyć.
Licznik A montujemy ZA punktem wpięcia instalacji fotowoltaicznej - będzie mierzył pobór prądu przez dom.
Licznik B montujemy POMIĘDZY falownikiem a punktem wpięcia fotowoltaiki do naszej instalacji - będzie liczył produkcję energii.

Zwykły (nie dwukierunkowy) licznik nie dba o to, w którą stronę płynie prąd będzie liczył czy to produkcję czy zużycie w ten sam sposób.

Dzięki dwóm licznikom na bieżąco można określić produkcję z PV (wartość A), zużycie domu (wartość B), nadprodukcja (A-B), niedobór energii (B-A).
Z kolei przy jednym liczniku dwukierunkowym nie będziecie mieli (!) informacji o bieżącym zużyciu energii w domu, będzie tylko znany bilans produkcja/zużycie, dopiero w połączeniu z danymi z falownika coś więcej można wyliczyć.
Przy dwóch licznikach sprawa jest banalna i sprowadza się do prostych rachunków.

Jak już się zagłębicie w wyliczenia, to tylko jedna rzecz będzie umykać w takiej konfiguracji to pobór prądu przez falownik. Mój falownik (Fronius) działa tak, że niezależnie od tego, czy produkcja jest czy nie, to pobiera z sieci energię na własne "utrzymanie". Kilka watów, nie pamiętam dokładnie. W nocy będzie wyglądało jakby produkcja wciąż trwała. Wystarczy tą wartość kilku watów odjąć w rachunkach i wszystko będzie się zgadzało do drugiego miejsca po przecinku :)

Gdyby ktoś miał falownik Froniusa, to ma on również wejścia impulsowe, gdzie można te liczniki tam wpiąć i oglądać wykresy na solarweb, bez udziału PLC.

23
Zgadzam się z mguc. Zrób osobne (najlepiej 3 rozdzielnice na):
1. energetykę (zugi, przekaźniki, sterownik, osprzęt elektryczny)
2. złączki LSA (rozszycie wszystkich skrętek, nie łącz tego bezpośrednio do sterownika)
3. LAN i inne cuda

Pomiędzy rozdzielnicami kortyka/peszle ale na tyle grube, żebyś się nigdy nie męczył z przekładaniem kabli.
Jak nie jest za późno  to połóż sobie choć jeden peszel (minimum 40-50mm srednicy) od rodzielnicy na zewnątrz budynku na przyszłe pomysły

No i jeszcze takie tam:
- 2-3 skrętki pod meblami w kuchni (zawsze się do czegoś przyda)
- skrętka przy pralce
- skrętka przy napędzie bramy garażowej
- instalacja pod głośniki w suficie (2x1,5mm2 będzie ok)
- czujnik 4-20mA do mierzenia poziomu wody deszczowej. Sprawdza się genialnie, kosztował coś około 100zł na aliexpress. Precyzyjny co do litra. Szukaj pod hasłem "water level sensor 4-20ma". Wygląda to jak torpeda na kablu. Działa nieprzerwanie 3 rok, a wcześniej przerobiłem wszelkie tematy pływaków, które blokowały się od zanieczyszczeń w zbiorniku deszczówki.
- skrętka do skrzynki gazowej na ulicy (przy montażu gazomierza ustal z gazownią, że ma być taki co może działać z impulsometrem)
- skrętki do skrzynki zaworowej do podlewania ogrodu (2-3 sztuki)
- jeżeli planujesz projektor to instalacja pod zasilanie + LAN dla projektora i zasilanie do elektrycznego ekranu
- dużo (4-6) gniazdek LAN za telewizorem/szafką RTV, żebyś nie musiał tam dawać switcha.
- kable na ścianie do montażu access pointów (gorąco polecam Ubiquiti), wcześniej czy później stwierdzisz, że tego potrzebujesz. Idealnie w każdym pomieszczeniu access point, dla super pokrycia. Dom to nie mieszkanie i jednym budżetowym ruterkiem tego nie obskoczysz.
- w sufitach podwieszanych pochowaj skrętki na później (czujniki ruchu, alarmowe, czy co tam sobie wymyślisz)
- przy fotowoltaice skonsultuj ile kabli potrzebujesz. Dla około 6kW wystarczy zostawić 2 kable, przy większej instalacji mogą być już potrzebne 4 (dwa osobne łańcuchy paneli).

A z innych rzeczy przemyśl też temat klimatyzacji, czy nie warto wrzucić w ścianę zaślepionych rurek na przyszłość.

Z doświadczenia podpowiem, że przy takiej instalacji praca się nie kończy i zawsze można coś dodać i usprawnić. Dlatego warto przygotować sobie wszystko dla wygody przyszłych modyfikacji (za rok, dwa czy później).

Generalnie ładuj skrętkę bez opamiętania. W całej instalacji to jest koszt pomijalny, a niesamowicie ułatwia późniejszy rozwój systemu.
Powodzenia.

24
(Pod)Systemy i Funkcje / Odp: Bezprzewodowe sterowanie obwodem elektrycznym
« dnia: Stycznia 04, 2021, 08:40:42 am »
Rozważ wymianę oprogramowania w sonoffie na coś innego (np. Tasmota, Supla).
Może wtedy będziesz w stanie się z tym połączyć.

25
Sterowanie i Wizualizacje / OpenHAB - komunikacja z WAGO bez modbusa
« dnia: Października 09, 2020, 07:40:08 pm »
W innym wątku dotyczącym OpenHABa pisałem o komunikacji z WAGO bez użycia modbusa. Poniżej przedstawiam moje rozwiązanie tego problemu. Być może modbus byłby lepszy ale nigdy go nie sprawdziłem w akcji. To co poniżej działało i działa dobrze od 2 lat.

Środowisko wygląda tak:
- RaspberryPi z uruchomionym serwerem nginx + PHP + MySQL
- Na tym samym urządzeniu RPi działa również OpenHAB

Serwer www zawiera takie skrypty:
/wago/wago_lookup_refresh.php
/wago/wago_get-var-list.php
/wago/wago_set-var.php

Na sterowniku WAGO (750-880) mam dodaną wizualizację o nazwie "openhab", do której dodaję zmienne, które chcę czytać/zapisywać z openhaba. Wystarczy dodać zwykłe pole tekstowe, a w definicji użyć zmiennej, którą chcemy wyświetlić w tym polu. To wystarczy. Sugeruję nie dodawać nic więcej, bo wizualizacja dość szybko rośnie zajmując cenne miejsce na sterowniku.
Wago stworzy z tego plik openhab.xml dostępny przez WWW lub FTP. Plik będzie dostępny pod adresem: http://WAGO_IP/plc/openhab.xml

Zawartość pliku może (ale nie musi) zmieniać się przy kompilacji programu na sterowniku WAGO. To z kolei może powodować, że określone zmienne zmienią swoje adresy. Konieczne jest odświeżanie listy zmiennych (i ich adresów) w sposób cykliczny lub na żądanie (wtedy trzeba to zrobić ręcznie po kompilacji programu na PLC). U mnie dzieje się to cyklicznie co 5 sekund.

W tym celu wywołuję skrypt PHP "wago_lookup_refresh.php":

<?php
/* SETUP */
$log  false;
$wago_ip  '192.168.1.5';


if ($log$time_start microtime(true);

// get a list of visualizations to be parsed
$visu = isset($_GET['visu']) ? $_GET['visu'] : 'plc_visu';
$visu_pages explode (','$visu);
$output = array();

// process each visualization, looking for variable list
foreach ($visu_pages as $xml_page)
{
// get XML description for visu page
$f curl_get('http://'.$wago_ip.'/plc/'.$xml_page.'.xml');
// extract all variable names with memory addresses
preg_match_all("'<variable name=\"(.*?)\">(.*?)</variable>'si"$f$variablelistPREG_SET_ORDER);

// create human readable and serialized output files
foreach ($variablelist as $var)
{
$output[] = $var[1].';'.str_replace(',','|',$var[2].'|'.chr(10));
$serial[$var[1]] = '|'.str_replace(',','|',$var[2].'|');
}
}
// sort the arrays (for quicker lookup)
sort($output);
ksort($serial);

// save the files if different 
if (file_get_contents('wago_variables.csv') != $output)
{
file_put_contents('wago_variables.csv'$output);
file_put_contents('wago_variables.txt'serialize($serial));
}
// if logging enabled - put some data on the screen
if ($log
{
$time_end microtime(true);
$time $time_end $time_start ;
echo "<pre>";
echo 'Execution time : ' $time ' seconds'.chr(10) ;
print_r ($serial);
echo "</pre>";
$f file_put_contents('time.log',file_get_contents ('time.log').chr(10).$time_start);
}

// curl web access
function curl_get($url
{    
    $defaults = array( 
        CURLOPT_URL => $url
        CURLOPT_HEADER => 0
        CURLOPT_RETURNTRANSFER => TRUE
        CURLOPT_TIMEOUT => 
    ); 
    
    $ch curl_init(); 
    curl_setopt_array($ch$defaults); 
    if( ! $result curl_exec($ch)) 
    { 
        trigger_error(curl_error($ch)); 
    } 
    curl_close($ch); 
    return $result

?>


Skrypt tworzy plik tekstowy "wago_variables.txt" i "wago_variables.csv". W pierwszym (TXT) jest zapisana tablica dla PHP do szybkiego wyszukiwania zmiennych dla potrzeb kolejnych skryptów. Natomiast w CSV są wylistowane wszystkie zmienne w czytelnej dla oka postaci (można sobie to wyświetlić w przeglądarce i podejrzeć co tam aktualnie jest).
W obu przypadkach mamy wypisane pary zmienna + adres na sterowniku WAGO. Dobór rozszerzeń TXT/CSV jak widzę jest niefortunny ale tak to mam zrobione, coś pewnie w trakcie modyfikowałem i tak już zostało.

Należy zwrócić uwagę, aby jednorazowo ustawić uprawnienia do plików TXT/CSV, tak aby skrypt php mógł je tworzyć i modyfikować.


Aby lista zmiennych była zawsze aktualna (pliki "wago_variables"), to w OpenHAB ma dodany taki "rule" wywoływany co 5 sekund:
import org.openhab.io.net.actions.HTTP

rule wagorefresh
when
Time cron "0/5 * * * * ?"
then
var String HTTPString = "http://127.0.0.1/wago/wago_lookup_refresh.php?visu=openhab"
sendHttpGetRequest(HTTPString)
end
Podobne wywołanie skryptu może być z CRONa linuxowego, to wcale nie musi być OpenHAB. Może to też być ręczne wejście na link z powyższego skryptu po każdej kompilacji programu na WAGO.

W efekcie mamy 2 lokalne pliki (na serwerze WWW) z zawsze aktualnymi adresami zmiennych na sterowniku WAGO.

Aby pobrać listę wszystkich zmiennych wraz z ich wartościami należy wywołać kolejny skrypt PHP "wago_get-var-list.php"

<?php
$time_start 
microtime(true);

$wago_ip '192.168.1.5';
$output 'json';
$var = isset($_GET['var']) ? $_GET['var'] : 'ALL';

$var_file file_get_contents('wago_variables.txt');
$var_lookup unserialize($var_file);

if (
$var == 'ALL')
$vars array_keys($var_lookup);
else
$vars explode (','$var);

$var_count sizeof($vars);

$post '|0|'.$var_count.'|';

for (
$i=0$i<$var_count$i++)
{
$post .= $i.$var_lookup[$vars[$i]];
}


$wago_response curl_post('http://'.$wago_ip.'/plc/webvisu.htm'$post);
$wago_response explode ('|'$wago_response);

$out '';

if (
$output=='json')
{
$out '{'.chr(10);
for ($i=1$i<=$var_count$i++)
{
// do transformations if needed
if ($vars[$i-1] == '.OH_TEST'$wago_response[$i] = transform_OnOff2Boolean($wago_response[$i]);

// output variables
$out .= '   "'.$vars[$i-1].'": "'.$wago_response[$i].'"';
if ($i<$var_count$out .= ',';

$out .= chr(10);
}
$out .= '}'.chr(10);
}
else
{
for (
$i=1$i<=$var_count$i++)
$out .= $vars[$i-1].'='.$wago_response[$i].chr(10);
}

echo 
$out;

function 
transform_OnOff2Boolean ($val)
{
return ($val==1) ? 'ON' 'OFF';
}
function 
curl_post($url$post

$ch curl_init(); 
curl_setopt($chCURLOPT_URL$url);
curl_setopt($chCURLOPT_POST1);
curl_setopt($chCURLOPT_HEADER0);
curl_setopt($chCURLOPT_RETURNTRANSFER1);
curl_setopt($chCURLOPT_POSTFIELDS$post);

$result curl_exec ($ch);
curl_close ($ch);

return $result


$time_end microtime(true);
$time $time_end $time_start ;

//$f = file_put_contents('time.log',file_get_contents ('time.log').chr(10).$time_start);

//echo chr(10);
//echo 'Execution time : ' . $time . ' seconds' ;
?>

Wywołanie tego skryptu w przeglądarce wyświetli na ekranie plik JSON ze wszystkimi zmiennymi (i wartościami) dostępnymi w wizualizacji openhab.xml (na sterowniku WAGO).

W dalszym kroku mam dodane rozszerzenie (binding) HTTP w OpenHABie, a w http.cfg jest taki wpis:

WagoHttpBinding.url = http://127.0.0.1/wago/wago_get-var-list.php?var=ALL
WagoHttpBinding.updateInterval = 1000

Oznacza to tyle, że mamy do dyspozycji skrót "WagoHttpBinding" z którego możemy korzystać dalej w dowolnym miejscu w OpenHabie. W jego treści będzie zawartość pliku JSON z naszymi zmiennymi. Aby wczytać zmienną do OpenHABa w definicji zmiennych ("items") mam takie wpisy:

Switch Wago_oh_all_lights_off "oh_all_lights_off" <light> {autoupdate="false", http=">[ON:POST:http://127.0.0.1/wago/wago_set-var.php?var=SWIATLA.oh_all_lights_off&val=ON] >[OFF:POST:http://127.0.0.1/wago/wago_set-var.php?var=SWIATLA.oh_all_lights_off&val=OFF] <[WagoHttpBinding:500:JSONPATH($['SWIATLA.oh_all_lights_off'])]" }

Number Wago_oh_light_switch_dol_wiatrolap "oh_light_switch_dol_wiatrolap" <light> {autoupdate="true", http=">[1:POST:http://127.0.0.1/wago/wago_set-var.php?var=SWIATLA.oh_light_switch_dol_wiatrolap&val=1] >[2:POST:http://127.0.0.1/wago/wago_set-var.php?var=SWIATLA.oh_light_switch_dol_wiatrolap&val=2] >[3:POST:http://127.0.0.1/wago/wago_set-var.php?var=SWIATLA.oh_light_switch_dol_wiatrolap&val=3] >[0:POST:http://127.0.0.1/wago/wago_set-var.php?var=SWIATLA.oh_light_switch_dol_wiatrolap&val=0] <[WagoHttpBinding:500:JSONPATH($['SWIATLA.oh_light_switch_dol_wiatrolap'])]" }
Number Wago_oh_light_switch_dol_hol "oh_light_switch_dol_hol" <light> {autoupdate="true", http=">[1:POST:http://127.0.0.1/wago/wago_set-var.php?var=SWIATLA.oh_light_switch_dol_hol&val=1] >[2:POST:http://127.0.0.1/wago/wago_set-var.php?var=SWIATLA.oh_light_switch_dol_hol&val=2] >[3:POST:http://127.0.0.1/wago/wago_set-var.php?var=SWIATLA.oh_light_switch_dol_hol&val=3] >[0:POST:http://127.0.0.1/wago/wago_set-var.php?var=SWIATLA.oh_light_switch_dol_hol&val=0] <[WagoHttpBinding:500:JSONPATH($['SWIATLA.oh_light_switch_dol_hol'])]" }
Number Wago_oh_light_switch_dol_kuchnia "oh_light_switch_dol_kuchnia" <light> {autoupdate="true", http=">[1:POST:http://127.0.0.1/wago/wago_set-var.php?var=SWIATLA.oh_light_switch_dol_kuchnia&val=1] >[2:POST:http://127.0.0.1/wago/wago_set-var.php?var=SWIATLA.oh_light_switch_dol_kuchnia&val=2] >[0:POST:http://127.0.0.1/wago/wago_set-var.php?var=SWIATLA.oh_light_switch_dol_kuchnia&val=0] <[WagoHttpBinding:500:JSONPATH($['SWIATLA.oh_light_switch_dol_kuchnia'])]" }

Ilekroć zawartość zmiennej się zmienia, to OpenHAB wyłuska sobie z pliku JSON odpowiednią wartość i umieści w swoich zmiennych. Dalej możemy sobie robić z nimi co chcemy.

Aby zaktualizować zmienną w sterowniku WAGO należy wywołać skrypt "wago_set-var.php" z odpowiednimi parametrami.
Np.: wago_set-var.php?var=SWIATLA.oh_light_switch_dol_kuchnia&val=2
var to pełna ścieżka do zmiennej widoczna w pliku TXT/CSV, val to wartość jaką chcemy przypisać.

<?php
$time_start 
microtime(true);

$wago_ip '192.168.1.5';
$var = isset($_GET['var']) ? $_GET['var'] : '';
$val = isset($_GET['val']) ? $_GET['val'] : '';
$vars explode (','$var);

$var_file file_get_contents('wago_variables.txt');
$var_lookup unserialize($var_file);
$var_count sizeof($vars);
$var_location = isset($var_lookup[$var]) ? $var_lookup[$var] : '';

if (
$val == 'ON'$val 1// obsługa OpenHab

if ($var_location)
{
// BOOLEAN value, translate ON=>1, OFF=>0
if (substr($var_location,-2) == '0|'$val = ($val>0) ? '1' '0';

$post '|1|1|0'.$var_location.$val.'|';
$wago_response curl_post('http://'.$wago_ip.'/plc/webvisu.htm'$post);
// echo 'Wago response: '.$wago_response;
// echo $post;
}
else
echo 'Unknown variable';


function 
curl_post($url$post

$ch curl_init(); 
curl_setopt($chCURLOPT_URL$url);
curl_setopt($chCURLOPT_POST1);
curl_setopt($chCURLOPT_HEADER0);
curl_setopt($chCURLOPT_RETURNTRANSFER1);
curl_setopt($chCURLOPT_POSTFIELDS$post);

$result curl_exec ($ch);
curl_close ($ch);

return $result


$time_end microtime(true);
$time $time_end $time_start ;
//echo '<br>Execution time : ' . $time . ' seconds' ;
?>

Powyższy kod jest w całości mojego autorstwa, choć pewnych rzeczy już nie pamiętam dlaczego zrobiłem to tak czy inaczej. W każdym razie w obecnej formie działa to dobrze i raczej nie potrzebuję tykać tych fragmentów kodu. Wklejam wszystko tak jak mam, niektóre fragmenty są wykomentowane i służyły do doraźnego debugowania skryptów.

Trochę zabawy na styku OpenHAB/WAGO wymaga ogarnięcie stanów zmiennych OH, które bywają przeróżne np. ON/OFF zamiast 0/1. Trzeba to odpowiednio obsługiwać w skryptach.

Jeszcze słowo odnośnie wydajności. W skryptach widać pozostałości po analizie czasu wykonanywania skryptów. Jak pamiętam udało mi się uzyskać stabilne działanie przy częstotliwości odświeżania wartości zmiennych około 600-700ms (WAGO->OpenHAB). Co było w zupełności wystarczające. Teraz mam to ustawione na 1000ms i szybciej nie potrzeba.
Natomiast wywołanie zmiany OpenHAB->WAGO odbywa się natychmiast bez jakiejkolwiek zauważalnej zwłoki. Kliknięcie przycisku w telefonie natychmiast wyłącza światło, tak samo szybko jak przycisk na ścianie.

Wykorzystanie powyższych skryptów PHP nie ogranicza się oczywiście do OpenHABa, można ich użyć z dowolnym innym narzędziem do wizualizacji. Można pokusić się o dopisanie kodu odpowiedzialnego za aktualizację brokera MQTT i w ten sposób korzystać ze zmiennych w innych aplikacjach. Możliwości nieograniczone.


26
Sterowanie i Wizualizacje / Odp: OpenHab2 - modbus - Wago?
« dnia: Października 09, 2020, 05:49:09 pm »
Openhab jest wyjątkowo toporny w debuggowaniu. Pisanie kodu to wyzwanie. W miarę możliwości wyrzucam logikę poza openhaba i obrabiam zmienne w PHP korzystając z API. Na dość wczesnym etapie poddałem się z pisaniem kodu w OH i doszedłem do autorskiego rozwiązania jak poniżej.

Robię to dodając "rule" w OH, który wywołuje skrypt PHP na tym samym raspberry:

rule "Item updated DOOR"
when
Item Wago_DoorLockState changed from 1 to 9 or
Item Wago_DoorLockState changed from 9 to 1
then
// external PHP script to parse the rule
executeCommandLine("/usr/bin/php /var/www/html/openhab/rule_item_changed.php FRONT_DOOR")
end

po stronie PHP wywołuję skrypt "rule_item_changed.php" w tym przypadku z parametrem FRONT_DOOR (poniżej fragment kodu). Ten skrypt z kolei obsługuje bazę danych MySQL, pushovera i wiele innych trudnych w obsłudze, z poziomu OpenHaba, spraw. W ten sposób "daję znać" do PHP, że coś się dzieje i tam już pobieram z OpenHaba zmienne, obrabiam wartości i zapisuję z powrotem do OH.

<?php
include 
'inc.dbconn.php';
include 'inc.openhab.php';
include 'inc.pushover.php';
dbConnect();

$updated_item = @$argv[1];

if (isset ($_GET['item'])) $updated_item $_GET['item'];

if ($updated_item == 'FRONT_DOOR')
{
if (openhab_GetState('Wago_DoorLockState') == 9)
{
sendPushover ('DOM''Drzwi zamknięte');
save_event ('DRZWI_WEJSCIOWE''zamknięte');
}

if (openhab_GetState('Wago_DoorLockState') == 1)
{
sendPushover ('DOM''Drzwi otwarte');
save_event ('DRZWI_WEJSCIOWE''otwarte');
}

}


Tutaj treść pliku "inc.openhab.php", który służy do obsługi API openhaba.

<?php
function 
doPostRequest($item$data)
{
$url "http://127.0.0.1:8080/rest/items/" $item;

$options = array(
'http' => array(
    'header'  => "Content-type: text/plain\r\n",
    'method'  => 'POST',
    'content' => (string)$data
),
);

$context  stream_context_create($options);
$result file_get_contents($urlfalse$context);

return $result;
}

function openhab_SendCommand($item$data$onlyIfValueHasChanged FALSE)
{
$execute TRUE;
$result '';

if ($onlyIfValueHasChanged)
{
$currentValue openhab_GetState($item);
if ($currentValue == $data$execute FALSE;
}

if ($execute)
{
$url "http://127.0.0.1:8080/rest/items/" $item;

$options = array(
'http' => array(
    'header'  => "Content-type: text/plain\r\n",
    'method'  => 'POST',
    'content' => (string)$data
),
);

$context  stream_context_create($options);
$result file_get_contents($urlfalse$context);
}
return $result;
}

function openhab_GetState($item)
{
$url "http://127.0.0.1:8080/rest/items/"$item."/state";

$result file_get_contents($url);

return $result;
}

function openhab_SetState($item$data)
{
$url "http://127.0.0.1:8080/rest/items/"$item."/state";

$options = array(
'http' => array(
    'header'  => "Content-type: text/plain\r\n",
    'method'  => 'PUT',
    'content' => (string)$data
),
);

$context  stream_context_create($options);
$result file_get_contents($urlfalse$context);

return $result;
}?>

 

Jeżeli masz podstawy PHP, to takie podejście dużo ułatwia, bo masz dostęp do wszystkich narzędzi i metod jakie są dostępne dla PHP bez ograniczeń OpenHaba. Możesz wtedy wysyłać maile, SMSy, powiadomienia push, pisać do/z plików, bazy danych czy co tam sobie wymyślisz. Żadnych limitów.

Co do problemu, o którym pisze kempa007, to proponuję zacząć od podejrzenia logów OH (na żywo) pod adresem http://openhabianpi:9001/ lub wywołanie konsoli Karaf (szukaj w google). Tam z kolei zobaczyć jakie wpisy pojawiają się w trakcie zmiany stanów włącznika z OH i Wago. To z pewnością dużo wyjaśni.

I jeszcze uwaga do OH, jeśli ma to działać stabilnie to Raspberry Pi nie może działać jedynie z karty SD. Trzeba to postawić na dysku SSD podłączonym przez USB (na allegro są takie 16GB za około 40zł). Raspberry PI w wersji 3 (jeśli dobrze pamiętam) może już startować z USB zamiast z SD bez żadnych dodatków. Przedziwne rzeczy dzieją się z OH, kiedy zaczyna szwankować karta SD.

Simeone - napiszę osobny wątek odnośnie READAPI, tylko potrzebuję chwilę żeby do tego usiąść.

27
Sterowanie i Wizualizacje / Odp: OpenHab2 - modbus - Wago?
« dnia: Października 08, 2020, 09:00:41 pm »
Na własne potrzeby napisałem funkcję sterującą przekaźnikami światła. Sterowanie osobnymi zmiennymi z przycisku ściennego (in) lub z wizualizacji (in_visu). Przycisk ścienny wciśnięty jeden raz włącza lampę A, długie przytrzymanie lampy A+B, jeszcze dłuższe A+B+C. Kliknięcie wyłącza to co jest aktualnie włączone. Działanie jest bardzo intuicyjne. Jeżeli działa już A+B i wciśniemy przycisk na odpowiednio długi czas to zapali się A+B+C bez wyłączania tego co już działa. Bloczki z oscata nie miały takich funkcjonalności, stąd pisałem własny.

Osobna zmienna z wizualizacji/openhaba przyjmuje wartości 0-3 i ustawia odpowiedni stan na wyjściach 0,A,A+B lub A+B+C. Zmienna nie jest zerowana. Zmienna wyjściowa (out_visu) przekazuje do openhaba bieżącą wartość włączonego oświetlenia (0-3).

Z openhaba wysyłam konkretną wartość tego co co chcę włączyć, np. wartość 2, co oznacza obie żarówki/lampy włączone (nie mam żadnych ściemniaczy). Bloczek dba o to, żeby odpowiednio wysterować wyjścia (poniżej np: O90_LIGHT_SALON1). Zmienne pisane wielkimi literami to moje fizyczne wejścia/wyjścia sterownika).

Nie korzystam z modbusa tylko ze zmiennych dodanych do wizualizacji i własnego pośrednika w postaci skryptu PHP, który korzysta z READAPI (tak to się chyba nazywało). Rozwiązanie sprawdza się wyśmienicie od ponad 2 lat.

Istotą tego rozwiązania jest to, że nie ma potrzeby wysyłania "impulsów" do sterownika.

W załączniku zrzut ekranu openhaba z telefonu.

W openhabie wygląda to tak:

items:
Number Wago_oh_light_switch_dol_salon "oh_light_switch_dol_salon" <light> {autoupdate="true", http=">[1:POST:http://127.0.0.1/wago/wago_set-var.php?var=SWIATLA.oh_light_switch_dol_salon&val=1] >[2:POST:http://127.0.0.1/wago/wago_set-var.php?var=SWIATLA.oh_light_switch_dol_salon&val=2] >[3:POST:http://127.0.0.1/wago/wago_set-var.php?var=SWIATLA.oh_light_switch_dol_salon&val=3] >[0:POST:http://127.0.0.1/wago/wago_set-var.php?var=SWIATLA.oh_light_switch_dol_salon&val=0] <[WagoHttpBinding:500:JSONPATH($['SWIATLA.oh_light_switch_dol_salon'])]" }

sitemap:
Switch item=Wago_oh_light_switch_dol_salon label="Salon" icon="lightbulb" mappings=[0="WYŁ", 1="20%", 2="60%", 3="100%"] 

Definicja funkcji sterującej światłem (codesys):

FUNCTION_BLOCK LightSwitch
VAR_INPUT
in : BOOL;
in_visu: BYTE;
all_off : BOOL;
in_lamp1 : BOOL;
in_lamp1_ext_status : BOOL;
END_VAR
VAR_OUTPUT
lamp1 : BOOL;
lamp2 : BOOL;
lamp3 : BOOL;
out_visu : BYTE;
is_on : BOOL;
END_VAR
VAR_INPUT CONSTANT
T_short : TIME := t#450ms;
T_long : TIME := t#1100ms;
END_VAR
VAR
short : BOOL;
medium : BOOL;
long : BOOL;
tx : TIME;
tn: TIME;
edge : BOOL;
current_press : BOOL;
in_lamp1_trig, in_lamp2_trig, in_lamp3_trig, all_off_trig : R_TRIG;
END_VAR


tx := DWORD_TO_TIME(T_PLC_MS());
all_off_trig (CLK := all_off);
IF (in_lamp1_ext_status = TRUE) THEN
lamp1 := in_lamp1;
END_IF;

(* pojawil sie nowy stan z wizualizacji *)
IF (in_visu <> out_visu ) THEN
        CASE in_visu OF
0:
lamp1 := lamp2 := lamp3 := FALSE;
1:
lamp1 := TRUE;
lamp2 := lamp3 := FALSE;
2:
lamp1 := lamp2 := TRUE;
lamp3 := FALSE;
3:
lamp1 := lamp2 := lamp3 := TRUE;
END_CASE;
out_visu := in_visu;
END_IF;

IF (all_off_trig.Q) THEN
lamp1 := FALSE;
lamp2 := FALSE;
lamp3 := FALSE;
END_IF;
all_off := FALSE;

short := FALSE;
medium := FALSE;
long := FALSE;

IF in AND NOT edge THEN
(* przycisk wcisniety - start *)
edge := TRUE;
tn := tx;
IF (NOT lamp1) THEN
lamp1 := TRUE;
current_press := TRUE;
END_IF
ELSIF in AND edge THEN
(* przycisk przytrzymany - trwa *)

IF tx - tn >= t_short AND  tx - tn <= t_long THEN
lamp2 :=  TRUE;
ELSIF tx - tn > t_long THEN
lamp3 := TRUE;
END_IF;

ELSIF NOT in AND edge THEN
(* przycisk zwolniony - koniec*)
edge := FALSE;
tn := tx - tn;
IF tn < t_short THEN
short := TRUE;
ELSIF tn > t_long THEN
long := TRUE;
ELSE
medium := TRUE;
END_IF;

IF short AND NOT current_press THEN
lamp1 := FALSE;
lamp2 := FALSE;
lamp3 := FALSE;
END_IF;
ELSE
(* nic sie nie dzieje *)
current_press := FALSE;
END_IF;

(* informacja zwrotna dla wizualizacji *)
IF (lamp1 AND lamp2 AND lamp3) THEN out_visu := 3;
ELSIF (lamp1 AND lamp2) THEN out_visu := 2;
ELSIF (lamp1) THEN out_visu := 1;
ELSE
out_visu := 0;
END_IF;

IF (out_visu>0) THEN
is_on := TRUE;
ELSE
is_on := FALSE;
END_IF;


Wykorzystanie funkcji:
Salon_LightSwitch : LightSwitch; (* lampy gorne w salonie *)

Salon_LightSwitch (in := IN005_SW015_X OR IN096_SW089_X, in_visu := oh_light_switch_dol_salon);

O86_LIGHT_SALON_KINKIETY := Salon_LightSwitch.lamp1;
O90_LIGHT_SALON1 := Salon_LightSwitch.lamp2;
O91_LIGHT_SALON2 := Salon_LightSwitch.lamp3;

oh_light_switch_dol_salon := Salon_LightSwitch.out_visu;

28
Sterowanie i Wizualizacje / Odp: WEB VIUSu
« dnia: Kwietnia 23, 2020, 12:55:09 am »
To jeszcze to zobacz: https://sourceforge.net/projects/webvisu/

W sterowniku będziesz musiał jeden plik dołożyć (przez FTP) i zamiast http://192.168.1.200/plc/webvisu.htm wywołać ten nowy plik (webvisu.html). Do jego działania nie potrzebujesz Javy.

29
Tematy ogólne / Odp: Adresowanie zmiennych w PLC
« dnia: Marca 23, 2020, 10:39:26 pm »
Dodaj ta zmienna do jakiejkolwiek wizualizacji w codesys i zerknij do pliku XML tej wizualizacji jaki adres zmiennej sie tam pojawia.

30
Tematy ogólne / Odp: Rownolegle podlaczenie przyciskow
« dnia: Grudnia 31, 2019, 10:37:38 am »
Zamiast wieloklików fajnie sprawdza się krótkie, długie i bardzo-długie przytrzymanie przycisku. A co za tym idzie dokładanie kolejnych elementów oświetlenia, tzn. krótkie przytrzymanie - 1 lampa, dłuższe - 2 lampy itd. Zdecydowanie bardziej intuicyjne.

Blok pisałem sam, bo w tym z oscata irytowało mnie opóźnione zadziałanie krótkiego przyciśnięcia na zboczu opadającym (tzn. po zakończeniu przytrzymania przycisku). Pierwsze kliknięcie aktywuje wyjście natychmiast na zboczu narastającym. Efekt zadziałania jest natychmiastowy bez zbędnych opóźnień. Przy wieloklikach to było jakieś takie nienaturalne.

Strony: [1] 2 3 ... 5