Symulacja zbiornika z wodą

Cześć wszystkim!

Słowem wstępu,
jakiś czas temu pytałem tutaj o naukę programowania PLC w domu, sposoby programowania itp.,
teraz, korzystając z przymusowej kwarantanny postanowiłem stworzyć swój pierwszy projekt bazujący jedynie na podstawie wiedzy ogólnej z internetu i własnej dociekliwości. Co prawda jeden fragment został tak jak pewien Pan na youtube uczył, ale link wrzucę przy tym konkretnym fragmencie.

Program PLC i HMI został napisany w programie TIA Portal V15, a symulacja została wykonana dzięki programom PLC SIM V15, do symulacji sterownika Siemens S7-1200, oraz Factory I/O, w którym wykorzystałem animację i możliwość połączenia z PLC SIM.
Na końcu postu dodałem link do krótkiego filmiku prezentującego jak cały program działa.

Przebieg projektu krok po kroku:

Na samym początku pobrałem gotową templatkę pozwalającą połączyć
Factory I/O z PLC SIM, a następnie całym projektem w TIA Portal, cała instrukcja (bardzo prosta swoją drogą) jak to zrobić znajduję się na stronie Factory IO.

Następnie w programie Factory I/O utworzyłem nową scenę do której dodałem nasz zbiornik, skrzynkę, oraz używane później przyciski, po czym całość została podłączona do naszego sterownika.

Teraz mogłem przejść do tworzenia programu.

Pierwszym i głównym blokiem programowym PLC został System_Run, który nauczyłem się tworzyć dzięki użytkownikowi https://www.youtube.com/channel/UCWkyWCcJT9N4ihmtVC7kS5Q/featured
również layout skrzynki jest taki jak u tego Pana, ponieważ tak mi się po prostu bardzo spodobało, a plan na projekt miałem już na parę dni przed odnalezieniem tego kanału :smiley:

Ponieważ była to jedyna rzecz której nie zrobiłem całkowicie samodzielnie, nie będę udostępniał kodu źródłowego do programu(może mi się jeszcze przyda :wink: ), a jedynie opisywał co dany blok robi i w jaki sposób.

Tak prezentują się wszystkie bloki programowe dla naszego sterownika, oraz kilka przykładowych zmiennych:

  • System_Run
    Blok odpowiedzialny jest za przyciski Start/Stop/Reset/Emergency Stop.
    Ma na celu uniemożliwienie wykonywania jakiejkolwiek czynności dopóki przycisk Emergency Stop jest wciśnięty (dodatkowo przycisk Stop mruga po wciśnięciu przycisku EStop, a nie po prostu świeci, tak jak w przypadku wciśnięcia przycisku Stop) Dopiero po zwolnieniu tego przycisku i wykonaniu instrukcji Reset, możliwe jest kontynuowanie pracy.
    Cały program został stworzony tak, że w dowolnym momencie pracy można go wyłączyć zatrzymując wszystkie wykonywane czynności.
    Ponadto przycisk Reset, na 3 sekundy blokuje możliwość ponownego włączenia systemu, aby umożliwić spokojny reset “mechaniczny”.
    Kontroluje również przełączenie między trybem “Auto” i “Manual”

  • Manual_Fill_&_Manual_Discharge
    Blok do sterowania manualnego, który działa tylko wtedy gdy nasz system jest włączony i jest wybrany tryb sterowania Manualny.
    Po wciśnięciu przycisku Fill otwiera maksymalnie zawór napełniający zbiornik, a po wciśnięciu przycisku Discharge otwiera maksymalnie zawór opróżniający.
    Dodałem również zabezpieczenie przed ewentualnym wciśnięciem dwóch przycisków na raz, niestety jest to symulacja w komputerze i nie mam fizycznej możliwości wciśnięcia dwóch przycisków na raz.

  • Auto_Fill_&_Auto_Discharge
    Blok połączony z blokiem Tank_Level_Record.
    Po przełączeniu w tryb Automatyczny, umożliwia napełnienie, lub opróżnienie zbiornika, w zależności od jego obecnego poziomu, do wartości zadanej, tj. 0%/25%/50%/75%/100%.
    Program wykrywa obecny poziom zbiornika i zaczyna automatyczne opróżnianie lub napełnianie sprawdzając, która operacja teraz będzie stosowna.
    Dążenie do zadanego poziomu sygnalizuje mrugająca lampka poziomu napełnienia zbiornika.
    Tak samo jak w trybie automatycznym, dodane jest zabezpieczenie uniemożliwiające wprowadzanie programu w zakłopotanie i wciskanie 5 opcji na raz, ponieważ ta czynność jest wykonywana przez program i nie musimy już trzymać przycisku napełniania, byłem w stanie to pokazać.
    Dodatkowo, ponieważ fizyka nawet w symulacjach jest bezlitosna, zawory w trybie auto są otwierane tylko na 50%, aby po zamknięciu zminimalizować “błąd pomiaru” i skoczyć czynność na faktycznie zadanym poziomie. (woda jest bardzo wzburzona przy maksymalnym przepływie i efekty mogą wychodzić fałszywe)

  • Tank_Level_Record
    Blok odpowiadający za sygnalizację obecnego poziomu napełnienia zbiornika na dwa sposoby.
    Pierwszym z nich jet wyświetlacz cyfrowy który na bieżąco wskazuje zmieniający się poziom napełnienia zbiornika w %.
    Drugi to lampki sygnalizujące przekroczenie progów odpowiednio 0%/25%/50%/75%/100%.

  • Warnings_Function_Block i Warnings_Function_Block_DB
    Są to bloki wykorzystane do sygnalizacji ostrzeżeń na panelu HMI, w odpowiednim momencie wysyłają odpowiedni sygnał, umożlwiając sygnalizację na panelu.

Teraz możemy przejść do krótkiej konfiguracji panelu HMI.
Wybrałem panel TP900 Comfort, zawsze lubiłem wygodę i nowoczesność, więc przyciski nie wchodzą w grę, a więc panel z serii Comfort, w pełni dotykowy.

Tak prezentują się Ekrany, templatki, skrypty i ich funkcję:

  • Home
    Witający nas ekran wyświetlający w formie ostrzeżeń co obecnie dzieje się z naszym zbiornikiem.

  • Control
    Ekran uruchamiający skrypt Control_Panel_Bars który na bieżąco oblicza wartości przedstawione na screenie. No poza temperaturą która jest na sztywno, nie znalazłem w factory io czujnika temperatury :smiley:
    W dokumentacji Manual programu factory io znajdziemy wymiary zbiornika które pozwalają na następne obliczenie pojemność i reszty parametrów.

  • Auto_Control
    Tutaj mamy możliwość sterowania automatycznego, działa to tak samo jak w przypadku sterowania przyciskami.
    Widzimy również obecny poziom napełniania zbiornika.

  • Manual_Control
    Nic innego jak odzwierciedlenie tego co przedtem.

Dodatkowo powstała templatka S-R-S w które znajdują się przyciski Stop,Reset,Start, nawet samodzielnie modelowane w blenderze, w raz z grafiką “pressed” :smiley:

Został jeszcze ekran Show Time, ale po to zapraszam do filmiku.
(jakiekolwiek opóźnienia między np. wciśnięciem przycisku Fill a rozpoczęciem napełniania nie są spowodowane słabo zoptymalizowanym programem a zwyczajnie fizyką programu Factory IO, jako mały dowód może być np. to, że przy zadaniu wartości 25% zbiornik przestaje być napełniany na wartości 25%, anie 26 :p)

Dopiero się uczę tego wszystkiego, więc bez przeszkód się nie obejdzie i tutaj parę z nich.

Projekt nie skończył się tak jak chciałem, panel HMI miał właściwie pełnić rolę małego systemu SCADA, stąd też widoczny na pierwszym screenie z HMI skrypt
Excel_Table.
Skrypt zacząłem pisać i udało mi się dojść do momentu w którym codziennie tworzy on nowy folder z datą a w nim plik Excel (to również jest na filmie), domyślnie miała tam powstawać tabelka monitorująca godziny napełniania/opróżniania zbiornika oraz stan przed/po i sumę z końca dnia, niestety Pan minister ogłosił że maturki już tuż tuż i tą część muszę na razie odpuścić.
Nie da się również nie zauważyć, że lampki na panelu HMI nie mrugają tak jak te “fizyczne”.
Robiłem już co w mojej mocy próbując wskaźnikami dostać się do parametrów ekranu tak jak w C#, niestety na nic się to zdało i w internecie również nie znalazłem odpowiedniego dla mnie rozwiązania tego problemu, gdyby ktoś coś wiedział to będę wdzięczny :smiley:

Zapraszam do obejrzenia krótkiego filmiku potwierdzającego, że ten wymysł faktycznie działa i dzięki wszystkim którzy się pofatygowali aż dotąd, z Automatyką wiążę przyszłość i stworzenie takiego mini projektu to dla mnie pewien kamień milowy, zobaczymy co dalej :slight_smile:

EDIT: Film jest wrzucony ponownie bez dźwięku, okazuje się, że yt blokuje nawet filmy niepubliczne, a więc w tle oryginalnie leciało ACDC - Higway to Hell gdyby ktoś miał ochotę :stuck_out_tongue:

2lajki

Chcesz żeby lampki świeciły tak samo jak te na szafie sterującej czy jak?

Dokładnie tak, nie wiem tylko jak dobrać się do tej grafiki ze skryptu nie robiąc też pop-up screen, na jedną lampkę to chyba trochę za dużo zachodu.

Po stronie paneli hmi masz źle zrobione. Musisz zmieniać wyglad przycisku na podstawie sygnału który jest setowany i resetowany po stronie plc, a obecnie chyba tylko masz ustawiony wygląd inny dla normalnego przycisku i wciśniętego.

Najprościej wg mnie byłoby po prostu dorzucić zmienną w PLC tam gdzie zapalam lampki i wrzucić ją do skryptu zmieniającego grafikę, jakiś prosty if, ale właśnie problem polega na tym, że nie wiem jak z zewnątrz, właśnie ze skryptu dostać się do własności grafiki elementu.

Po stronie HMI to musi być jako button, bo co to za HMI jak nie można nim sterować, a samej grafiki nie “wcisnę”.

W elemencie button nie ma też atrybutu do którego mógłbym przypisać zmienną tak jak w np. process bar dla wizualizacji jakiegoś progresu, jest jedynie opcja wybrania grafiki dla Button is not pressed, oraz button is pressed.

Teraz w sumie tak myślę, że może trzeba w drugą stronę i zamiast szukać opcji dostania się do grafiki to można szukac jak “wcisnąć” ten przycisk w momencie uruchamiania lampki, wtedy grafika sama się zmieni. Jakby nie było narazie wiadomo tyle co przedtem :smiley:

Dla zwykłego buttona masz opcję graphic list lub ewentualnie możesz użyć takiej kontrolki jak switch zamiast buttona. To zależy od sygnału którym sterujesz.

No i z samego buttona na szybko możesz zrobić animacje w zakładce animations, opcja appearance. Także opcji masz sporo na uzyskanie takiego efektu jak chcesz.

1lajk

I w graphic list za pomocą zmiennej moge zmieniac grafiki tak? Banał… :smile:

Jeśli dobrze to rozumiem to właśnie o czymś takim myślałem, dzięki!

Edit: Switch mi nie odpowiada, piękny ten panel nie jest ale minimum estetyki chciałem zachować więc przyciski pełnią rolę przycisków, poza tym switch nie byłby tak bezpieczny, gdyby ktoś go zostawił na ON a następnie wyłączył sprzęt to po ponownym uruchomieniu System_Run odrazu zaczęła by się powtarzać czynność którą wymusza switch, a tak guzik to sobie wciśniesz raz i bezpiecznie jest :smiley: Ile głów tyle pomysłów i switch by można ogarnąć.

Nie do końca. Panel to tylko panel i wizualizacja stanu sygnałów w sterowniku. Jeśli sterownik wystartuje z sygnałem ustawionym na false to na panelu switch sam wraca do pozycji off. Możesz np dodać sobie blok OB100 i w nim zrobić reset wszystkich sygnałów które chcesz mieć na false po uruchomieniu. Blok OB100 wykona się raz po starcie sterownika.

Odrazu coś podobnego przyszło mi do głowy, czarna magia to to nie jest, wszysko da się zrobić.
Tak z ciekawości, bo widzę, że masz trochę doświadczenia, ja zrobiłem kopie “fizycznych” przycisków na panelu tylko po to żeby jak najwięcej zrobić pokazując co potrafię, w rzeczywistości robi się tak, że jest normalnie sterowanie przyciskami i jednocześnie takim panelem?
To dosyć sporo roboty dodaje, tak jak kosztów, więc pomijając, że można, to czy jednak praktykuje się to?

Dorabiając sobie w wakacje widziałem takie interface’y w betoniarni, jedyne za co był odpowiedzialny operator to wpisywanie wartości ilości materiałów do mieszanki, tak samo jak oglądam różne rzeczy to jest albo panel albo przyciski fizyczne.

Ja osobiście nie dubluje sygnałów. Albo panel albo sterowanie na szafie. Pewnie co programista to inna szkoła. Jeśli robię panel to najczęściej jest to docelowy sposób sterowania.

1lajk