Cześć,
Czy zrobiliście kiedyś swoją własną linię produkcyjną? Bo my tak 🙂 Umożliwił nam to symulator Factory IO. W tym artykule zaprezentujemy nasz projekt wykonany w ramach Studenckiego Koła Naukowego „Control Engineers” Politechniki Śląskiej oraz omówimy przyjęte założenia, sposób systematyzacji projektu. Chcielibyśmy się podzielić wnioskami i doświadczeniem, które zdobyliśmy dzięki naszej własnej fabryce. O samym symulatorze rozpisywać się nie będziemy, gdyż już były artykuły na temat: Nauki programowania PLC w Factory I/O.
Wstęp
W naszej linii produkcyjnej wykorzystujemy centra obróbcze, które produkują detale w dwóch kolorach – zielonym i niebieskim. Produkowane są części górne i dolne, które następnie transportowane są do stacji rozdzielającej, sortującej detale po kolorach do dwóch robotów montażowych. Każdy z robotów łączy ze sobą wyprodukowaną górną oraz dolną część. Złożone części z robotów montażowych trafiają do paletyzerów XYZ, a następnie transportowane są do magazynu wysokiego składowania. Zdecydowaliśmy się na użycie symulatora sterownika S7-300 korzystając z PlcSim V5.4 oraz Tia Portal V15.1.
Oznaczenia:
- MC – Machine Center
- CS – Converage Station
- A – Assembler
- P – Paletizer
- W – Warehouse
Stworzenie samej sceny zajęło nam trochę czasu. Projekt wykonywaliśmy w trzy osoby, więc każdy z nas miał być odpowiedzialny za jedną lub więcej stacji. Ustaliliśmy założenia dla każdej stacji oraz pewne zasady programowania, by uniknąć bałaganu w kodzie. Przyjęliśmy np. wspólną nomenklaturę dla tagów wejść/wyjść.
Przykładowo, CS_BI_InputSensor mówi, że mamy do czynienia z wejściem binarnym stacji przeładunkowej i jest to czujnik wejściowy (CS – Converage Station, BI – Bool Input). Podobnie P2_WQ_SetPositionX oznacza wyjście do drugiego Paletyzera typu Word i służy do zadawania pozycji w osi X (P2 – Paletizer 2, WQ – Word Output). Dla każdej ze stacji tworzona była osobna tablica tagów. Osobne tablice były także dla wejść i wyjść.
Ustaliliśmy również, że dla każdej stacji robimy osobny blok funkcyjny z zastrzeżeniem, że musi mieć wejścia do parametryzacji. Dzięki temu wystarczyło napisać jednego FBka dla jednej stacji z robotem, aby potem powielić go dla każdego z robotów.
Jednym z założeń było również wykrywanie awarii czujników i urządzeń wykonawczych. Ustaliliśmy także, że każda ze stacji ma mieć przyciski Start, Stop, Reset, ErrAck oraz kolumnę świetlną sygnalizującą stan maszyny. Pamiętajmy, że załączanie maszyny, jak i zatwierdzanie błędów powinno być wyzwalane zboczem sygnału, a zatrzymanie stanem, oraz o tym, że zatrzymanie powinno mieć priorytet nad startem. Są to podstawowe kwestie bezpieczeństwa.
Warto też uwzględnić przypadek, kiedy maszyna jest wyłączona z prądu, natomiast styki przycisku start uległy zwarciu. W takiej sytuacji załączenie maszyny do prądu natychmiast uruchomi cykl produkcji. By tego uniknąć, należy pominąć start produkcji podczas pierwszego cyklu sterownika. W tym celu możemy zbocze narastające „start” połączyć szeregowo z zanegowanym stykiem bitu „First Scan” lub ustawić wartość domyślną bitu pomocniczego, służącego do wykrywania zbocza na wartość „true”. Wykonaliśmy małą Scadę, dzięki której można uruchamiać wszystkie stacje, potwierdzać ich błędy oraz je konfigurować. Widoczne są również stany pracy maszyn. Dla każdej stacji wykonaliśmy osobny widok, by były osobno konfigurowalne.
Programowanie
Założenia przyjęte, to teraz przyszedł czas na to, co tygryski lubią najbardziej – czyli programowanie PLC 😉
Większość kodu napisaliśmy w Ladderze, jednak niektóre funkcje, czy bloki funkcyjne wygodniej było napisać w SCLu.
Stacja 1. Produkcja elementów
Pierwsza stacja to centrum obróbcze (MC). Tutaj półprodukt wjeżdża z jednej strony, robot go podnosi, wkłada do maszyny, a wyciąga wykonaną część górną lub dolną. Mamy tutaj zliczanie czasu pracy maszyny w ciągu zmiany. O godzinie 21 czas jest zapisywany do bloku danych. Możliwe jest sprawdzenie, czy maszyna pracuje cały czas. Najlepszym wyjściem byłoby zapisywać czasy awarii oraz zatrzymania maszyny. Wykrywamy tutaj niektóre awarie, takie jak np. zbyt długi czas przecinania wiązki czujnika, ponieważ może to oznaczać, że detal się zaklinował, czujnik rozregulował się lub zepsuł. Czas pracy maszyny w trakcie zmiany oraz czas przetwarzania aktualnego półproduktu jest wyświetlany na Scadzie.
Stacja 2. Sortowanie
Kolejna stacja to stacja przeładowcza (CS), która rozdziela odpowiednie części do robotów montażowych. Na wejściu znajduje się kamera, która rozpoznaje część i podaje jej ID.
W bloku FB tej stacji znajdują się 4 mniejsze bloki FB, każdy obsługuje jeden siłownik. Odczyt ID elementu przez kamerę powoduje wpisanie go do tablicy bloku funkcyjnego obsługującego pierwszy siłownik. Jeżeli detal najedzie na czujnik znajdujący się po prawej stronie siłownika, to jest wypychany pod warunkiem, że jest to część o odpowiednim ID (przypisanym do danego siłownika) oraz stacja następna (robot montażowy) daje zezwolenie na podanie detalu (jest to zabezpieczenie przed zapchaniem następnej stacji). W innym przypadku część nie jest wypychana, a ID z tablicy FBka jednego siłownika przepisywane jest do tablicy FBka obsługującego następny siłownik. Dzięki temu nie ma problemu, gdy kilka detali wjeżdża do stacji na raz. Gdy następna stacja jest zapełniona, to detale po prostu spadają do pudełka na końcu transportera. Wykrywamy tutaj awarie takie jak zbyt długi czas powrotu siłownika i zbyt długi czas wypchnięcia siłownika – oznaczać to może zaklinowanie się części. Wykrycie awarii powoduje zatrzymanie maszyny. Wypchnięte detale każdego rodzaju zliczane są oraz wyświetlane na Scadzie. Gdy detal najeżdża na czujnik, to wypychany jest z pewnym opóźnieniem. Po naciśnięciu przycisku „Open config” czas ten jest również konfigurowalny w systemie Scada (osobno dla każdego siłownika).
Stacja 3. Montaż
Kolejna stacja to robot montażowy, który wykonuje pewną sekwencję nałożenia górnej części na dolną. Oprócz robota znajdują się tu również pozycjonery oraz blokady, blokujące nadejście następnej części.
Gdy robotowi zadawana jest pozycja, to następnie wywołujemy funkcję „OnPosition”, która sprawdza, czy zadana pozycja została osiągnięta. Jeśli została, to algorytm może przejść do następnego kroku. Używamy zmiennej „step”, do wskazywania, w którym kroku znajduje się algorytm. Oczywiście warto nazywać networki, by nazwa mówiła jaką funkcję realizuje.
W głównym bloku funkcyjnym stacji znajdują się mniejsze bloki – jeden odpowiedzialny za sterowanie robotem, drugi odpowiedzialny za sterowanie pozycjonerem i blokadą znajdującą się po lewej stronie oraz trzeci odpowiedzialny za sterowanie blokadą i pozycjonerem znajdującym się po prawej stronie. Zamiast trzymać wszystko w jednym FBku, to warto pisać obiektowo i podzielić program.
Stacja 4. Paletyzacja
Z robotów montażowych złożone części trafiają na paletyzer. Ma on tryb automatyczny oraz ręczny (Jog). Pozycje kładzenia części na palecie są konfigurowalne, podobnie jak ich ilość. Stacje podzieliliśmy na trzy bloki sterujące robotem, taśmociągiem detali oraz taśmociągiem palet. Robot wykonuje pojedyncze cykle umieszczenia detalu na palecie tak długo, aż zapełni ją zgodnie z podanymi ustawieniami. Dzięki bramkom świetlnym sprawdzana jest wysokość palety. Pozwala to wykryć czy paleta jest dobrze załadowana.
Stacja 5. Magazynowanie
Ostatnią stacją jest magazyn. Przydziela on palety do odpowiednich półek w magazynie. Dzieli się on na dwa skrzydła – każde po 108 miejsc. Miejsca te mogą mieć 3 stany: wolne, załadowane i nieczynne. Ostatnie z nich jest stosowane podczas uszkodzenia lub konserwacji. Magazyn posiada także dwa porty, wejściowy po stronie produkcji i wejściowo-wyjściowy po stronie hali magazynowej. Magazyn automatycznie przypisuje palecie miejsce, odczytując jej numer seryjny poprzez czytnik RFID, dzięki czemu można łatwo i jednoznacznie wyszukać potrzebne produkty.
Wnioski
Dzieląc się doświadczeniem, jakie zdobyliśmy podczas tej przygody, chcemy zwrócić uwagę na pewne aspekty programowania, by następne aplikacje nie sprawiały tyle problemów.
Priorytety – Zastanówmy się co w ogóle mamy zrobić
W programowaniu ważne jest, by przemyśleć kod, zanim zacznie się go pisać. Zastanowić się co właściwe program musi robić, a co „może” robić. Skupmy się na głównych funkcjonalnościach, a dopiero później rozbudujmy go.
Funkcje – Podzielmy nasz program na jak najprostsze funkcje
Stworzyliśmy prostą funkcję do sterowania „WorkMode”, która steruje kolumną sygnalizacyjną. Dzięki temu, jeżeli zmienilibyśmy zdanie co do działania lampek, i postanowili, że w trakcie awarii maszyny lampka czerwona nie powinna migać, tylko świecić, to wystarczy kod zmodyfikować w jednym miejscu – wewnątrz FB „WorkMode” i gotowe – wszystkie maszyny sygnalizują stan pracy w taki sam sposób. Tak samo postąpiliśmy, jeśli chodzi o sterowanie podzespołów, które powtarzają się na różnych stacjach.
Integracja – ustalmy współprace między naszymi funkcjami
Początkowo, każdy pisał przyznaną mu część osobno. Gdy ukończyliśmy programowanie każdej ze stacji, to trzeba było połączyć wszystkie projekty w całość, jednak nie ustaliliśmy współpracy wszystkich maszyn między sobą. Przykładowo robot paletyzujący powinien dawać zezwolenie robotowi montażowym na wysyłanie mu złożonych części. W przeciwnym wypadku w przypadku awarii robota paletyzującego, robot montażowy będzie ciągle wysyłał mu części, które będą się gromadzić i wysypywać z transportera. Pomimo że ustaliliśmy sposób nazywania tagów wejść/wyjść to każdy z nas miał inną nomenklaturę zmiennych. Co za tym idzie, łącząc bloki, te same zmienne były różnie podpisane.
Systematyzacja – Ułóżmy system programowania, którego będziemy się trzymać, przynajmniej w tym projekcie
Nasze bloki funkcyjne Często charakteryzują się sygnałami „Execute” oraz „Ready”. Zbocze wejścia „Execute” daje sygnał do wykonania sekwencji, obliczeń, wprawiając w ruch całe wnętrze bloku funkcyjnego, gdy blok skończy wykonywać swoje zadanie, wystawia stan wysoki na wyjściu „Ready” tak długo, dopóki trzymany jest stan wysoki na wejściu „Execute”. Dodawaliśmy jeszcze ograniczenie czasowe, w jakim czasie blok musi dać sygnał gotowości, by zasygnalizować zawieszenie systemu lub zacięcie się maszyny. Warto systematyzować także sposób nazywania zmiennych.
Zachęcamy również do obejrzenia filmiku przedstawiającego nasz projekt: Factory IO – Students Project
Ocena artykułu zgłoszonego do Konkursu iAutomatyka 4.0 pisz artykuły, zdobywaj punkty, wymieniaj je na nagrody.
Kryterium 1 2 3 4 5 6 7 8 9 10 Punkty (0-2) 1 1 2 2 2 2 2 2 2 2 Suma zdobytych punktów: 18