Do Projektu iAutomatyka dołączyli:

Publikacja zgłoszona do 🎁 Konkursu iAutomatyka

Python + PLC = Symulacja procesu


Wiele pytań pojawiło się ostatnio na forum i grupie odnośnie testowania logiki programu z użyciem symulacji – padały różne odpowiedzi, a ten artykuł ma na celu wyjaśnienie kolejnej z możliwości.

Wykorzystanie kosztownego oprogramowania do symulacji zjawisk fizycznych i testowania logiki programu? Nic bardziej mylnego, o ile kod napiszesz samodzielnie. Poniżej opiszę jak symulować proces fizyczny w Pythonie i komunikować go z symulowanym sterownikiem Omron, w celu wizualizacji i sterowania. Zacznijmy od historii, założeń, przyczyn i potrzeb.

Wśród automatyków języki wysokiego poziomu nie są tak popularne jak za płotem w dziale IT, głównie ze względu na brak zapotrzebowania. Jednak posiadają one wiele plusów, których brakuje w sterownikach programowalnych. Dynamiczne tablice, dynamiczna deklaracja zmiennych, szybkość i czytelność pisania kodu, a co najważniejsze multiplatformowość i ogrom wsparcia w sieci (stackoverflow!).

Dyskusja na temat tego artykułu odbywa się w Klubie Automatyka

klubautomatyka

Dlaczego akurat Python? Jest to jeden z najpopularniejszych języków, a także jeden z posiadających rozwiązania z prawie każdej branży – od stron www do sztucznej inteligencji. Nieprzypadkowo jest to ulubiony język naukowców, jego czytelność oraz łatwość przyswojenia sprawia, że możemy skupić się na tym co chcemy osiągnąć, a nie na tym w jaki sposób.

Większość studentów automatyki i robotyki w Polsce ma lub miało styczność z programem Matlab, który sprawdza się idealnie do symulacji, lecz w przemyśle produkcyjnym poza działami R&D nie ma dla niego miejsca. Python idealnie nadaje się do zastąpienia nam Matlaba, który w przeciwieństwie do w.w. programu jest darmowy.

Tak też powstał pomysł na ten artykuł. Posiadając model matematyczny zaprojektowany na potrzeby pracy inżynierskiej w Simulink, postanowiłem przenieść sterowanie do automatyki przemysłowej. Problem stanowi jednak brak licencji programu Matlab – tym bardziej do zastosowań komercyjnych. Więc skoro posiadamy wzór oraz wyniki wystarczy przepisać to co widzimy na kod w języku Python.

Opisywany model to kaskadowy system trzech zbiorników.

Źródło: Producent INTECO sp. z o.o. (http://www.inteco.com.pl/)

Przeniesienie modelu na kod Python

Model symulacyjny narysowany w Simulink można łatwo przepisać na kod, jednak w trakcie symulacji Matlab wykorzystywał charakterystyki uzyskane po identyfikacji obiektu – zapisywane w przestrzeni roboczej środowiska. Plik workspace.mat zawiera zapis zmiennych, tylko jak do nich dotrzeć? Żadna przeszkoda dla narzędzia jakim jest Python. Po odczytaniu dane zapisane zostały w prosty i szybki do odczytania sposób.

Notka: zmienna py to „słownik”, posiada klucze oraz wartości, kluczem jest nazwa zmiennej, podobne do struktury. Google: Python dictionary.

Kod wrzucany jest jako zdjęcia dla zwiększenia czytelności, program który widać to VSCode (VisualStudio Code).

Przepisany do Pythona model ‚zachowywał’ się identycznie jak ten symulowany w Matlabie – porównanie na podstawie wykresów z pracy dyplomowej i tych wygenerowanych przez nowy kod. Przejdźmy zatem do omówienia programu oraz sposobu wymiany danych z symulacją PLC.

 

Dobrze napisany kod powinien obronić się sam bez komentarzy, dlatego też poniżej znajduje się opis algorytmu w krokach:

  • if __name__ == „__main__”
    • sprawdzenie czy jest to ‚samoczynny proces’, nie jest to wymagane aczkolwiek jest dobrą praktyką,
  • wczytanie danych charakterystyk przepływu pomp oraz zaworów,
  • inicjalizacja obiektu, podając jako argumenty dane charakterystyk. Obiekt posiada wewnątrz struktury danych zbiorników oraz pompy, a także metodę (funkcję) simulate() – opis poniżej,
  • odczyt aktualnego czasu, czyszczenie/stworzenie pliku simLog.csv,
  • inicjalizacja zmiennych,
  • while(..) główna pętla programu, sprawdza czy kontynuować symulację,
  • try: / except KeyboardInterrupt,
    • wykonuje część programu zawartą pod try, chyba że wykryto wciśnięcie CTRL+C w terminalu,
  • try: (…),
    • czy plik został zmodyfikowany przez symulację sterownika? Jeżeli wykryto zmianę:
      • odczyt danych z pliku – opis poniżej,
      • nadpisanie czasu ostatniej zmiany,
      • wykonanie kroku symulacji z zadaną stałą czasową,
      • dopisanie danych do pliku simLog.csv,
      • wyświetlenie kolejnego wiersza statusu,
    • uśpienie procesu na 5 milisekund,
  • except KeyboardInterrupt: (…),
    • wyświetlenie informacji o możliwych komendach,
    • odczyt jednej z dwóch komend:
      • ‚exit’ – przerwie symulację,
      • wartość liczbowa – zmiana stałej czasowej symulacji dt,
  • wyświetlenie informacji o całkowitym czasie trwania programu,
  • wyświetlenie wykresów.

Notka: zapis „self.” odnosi się do obiektu MultiTankModel, przykład: MT = MultiTankModel(), zatem „self.” można odczytywać dla ułatwienia jako „MT.”.


Notka 2: ‚kwargs’ to skrót od keyword arguments, w ten sposób można przekazywać do funkcji wartości po nazwie zmiennej, bez potrzeby ich wypisywania w deklaracji funkcji. 

Metoda simulate() obiektu MuliTankModel, zawiera zabezpieczenia przed przelaniem zbiorników poprzez wyłączenie pompy lub zamknięcie zaworów, wylicza dopływ i odpływ cieczy ze zbiorników oraz aktualizuje ich wysokość na podstawie różnicy przepływów. Zawiera również dodawanie kolejnych wierszy do inputLog oraz outputLog i kontroluje ilość wierszy – metoda pop(0) usuwa najstarszy wpis.

Funkcja wymieniające dane przez plik, w tym wypadku zapis try/except odpowiada za próbę otwarcia pliku, jeżeli nie został on poprawnie zamknięty przez symulację PLC to wykona instrukcję pass – nic.

Dlaczego akurat plik? Wydaje się to nieintuicyjne i takie jest, a powód podany jest niedługo poniżej.

Zmienne w programie są typu float, natomiast na potrzeby wymiany zamieniane są na 32-bitowy integer, po przemnożeniu dla zachowania dokładności po przecinku. Mnożnik jest na tyle duży ponieważ normalnie wysokości znajdują się w zakresie od 0 do 0.3.

Dane są najpierw odczytywane z pliku, część z nich jest aktualizowana i całość zapisywana jest z powrotem do pliku. Linie 357..359 kodu to sposób zapisu stanu odcięcia pompy/zaworów na bitach w zmiennej values[3]. Rozkazy są dzielone przez 100 ponieważ w symulacji PLC operują w  zakresie od 0 do 100, natomiast w Pythonie od 0 do 1.0.

Konfiguracja PLC

Zacznijmy od zagadki jaką jest wymiana danych przez plik – niestety symulator Sysmac Studio nie tworzy pełnoprawnego sterownika, który może komunikować się z urządzeniami sieciowymi tak jak symulatory u konkurencji.

Pierwszym rozwiązaniem jakie zostało sprawdzone była wymiana danych przez TCP/IP, jednak ze względu na wyżej wymieniony powód ta metoda nie zadziałała, drugim podejściem było wykorzystanie połączenia z bazą danych przez sterownik, które również nie zadziała na symulacji. Trzecia próba to sprawdzenie internetu, być może ktoś wpadł już na rozwiązanie.. Niestety.

Zatem jak to się stało, że akurat plik? Przeglądając w zakładce Toolbox dostępne funkcje trafiłem na te odpowiadające za obsługę karty SD – pierwszą do przetestowania była DirCreate(), po użyciu której wystarczyło odszukać na dysku nowo stworzony folder.. eureka! 

Skoro jesteśmy w stanie stworzyć folder to zapewne i plik. Pozostała kwestia w jakim formacie zapisywane są dane. Ctrl+Shift+T, wpisujemy komendę ipython, otwiera się interaktywny interpreter, kilka linijek kodu, wciskamy enter i wyświetlamy zawartość pliku. Dane zapisywane są w formacie binarnym, po jednym bajcie, ostatnia kwestia – ich kolejność, little czy big endian? Porównujemy odczyt z zapisem w sterowniku i wygląda na to, że little.

Notka: Ctrl+Shift+T to skrót to uruchomienia terminala w Ubuntu, który jest głównym systemem operacyjnym, pozostałe systemy uruchamiane są jako maszyny wirtualne.


Ustaliliśmy sposób komunikacji pomiędzy Pythonem i symulacją PLC, pozostaje kwestia wydajności, która jest delikatnie mówiąc.. słaba. Otwarcie, odczyt, zapis i zamknięcie pliku przez sterownik zajmuje około 800 milisekund. Widzieliśmy już jak wygląda kod operacji na pliku ze strony języka wysokiego poziomu, przejdźmy więc do drabinki!

Notka: strzałki wewnątrz styku NO oznaczają detekcję zbocza, opadającego lub narastającego.

Omówmy networki po kolei:

  • Jeżeli program został zainicjalizowany, zakończono działanie na pliku i minął czas przerwy – ponów działanie na pliku.
  • Zabezpieczenie przed błędem, gdy operacje na plikach trwają za długo – zamknij plik .
  • Sekwencja funkcji:
    • Otwórz plik,
    • Odczytaj dane,
    • Wróć wskaźnikiem na początek pliku,
    • Zapisz dane,
    • Zamknij plik.
  • Nalicz jak długo trwała operacja na plikach, żeby wiedzieć ile należy odczekać (do pełnej sekundy).
  • Oblicz wartość do odczekania i sprawdź czy ta wartość nie jest za mała (<1ms).
  • Po zakończeniu operacji na plikach wywołaj puls o długości poprzednio wyliczonej.
  • Wyzeruj licznik czasu trwania operacji na plikach.

Program ten ma dwa założenia początkowe, musi najpierw zostać wykona inicjalizacja i należy ustawić bit RWFile żeby rozpocząć pracę pętli. Na czym polega inicjalizacja? Należy stworzyć pusty plik zawierający przynajmniej 4 wpisy, tyle odczytujemy w networku numer 2.

Program Initializing wykona się tylko raz i stworzy/nadpisze plik zawierający 32 bajty, jest to suma bajtów zmiennych (32bit  = 4bajty, a zmiennych jest 8).

Uzyskano stabilną wymianę danych, należałoby je zwizualizować w zrozumiały dla człowieka sposób, lecz zanim przejdziemy do panelu operatorskiego, dla czytelności dodano maping zmiennych lokalnych do globalnych.

Pozostaje kwestia odczytu statusu blokad przed przelaniem, zapisanych w bitach. Wybrana metoda typ danych union, ale jak to właściwie działa?

Stworzony nowy typ danych, struktura składająca się z przynajmniej dwóch zmiennych – w tym wypadku double word oraz array[0..31] of bool.

Takie rozwiązanie tworzy dwa odwołania do tego samego obszaru pamięci, więc stany bitów są identyczne zarówno w bitArray jak i numeric.

Tworzenie wizualizacji Omron HMI

Wizualizacja! ale najpierw mapowanie zmiennych PLC, co w Sysmac Studio jest banalnie proste:

Posiadając już niezbędne dane należy odtworzyć graficznie budowę zbiorników, wyposażyć je w animację oraz dodać elementy do sterowania zaworami oraz pompą.

Notka: Percentage fill zaczyna się od 34 ze względu na fakt, że pompa rusza dopiero od wartości 0.34 dla PWM, jest to pozostałość po identyfikacji z Matlaba.


Narysowanie zbiorników oraz rury doprowadzającej wodę do pierwszego z nich zostało wykonane z użyciem kształtu Polygon, który budowany jest z pojedynczych linii i końcowy efekt to wielokąt posiadający sporo przydatnych atrybutów – jak np. dynamiczne wypełnienie. Dlatego też widać wszystkie elementy wypełnione w 100% na niebiesko, ponieważ poziom jest realizowany dynamiczne od zmiennej dopiero podczas pracy. Dodatkowa animacja jest związana z blokadą pompy i zmienia kolor wypełnienia na szary – jako sygnalizację wstrzymania pracy pomimo wysterowania, tak samo zachowują się zawory.

Przyciski ON/OFF ustawiają wartość na maksymalną lub minimalną, jako ułatwienie – przeciąganie nie jest równie wygodne.

Zawory posiadają jeszcze jedną dodatkową animację – ich wypełnienie cieczą jest zależne od poziomu w zbiorniku, jeżeli jest bliski zeru wtedy zawór znika i pojawia się pusty zawór, bez przepływu.

Poniżej dodatkowe zdjęcia zawierające animacje/atrybuty pozostałych elementów.

Symulacja

Część teoretyczną mamy za sobą, a więc czas na uruchomienie symulacji!

Wystartowaliśmy symulację i.. efekty widoczne są na wideo poniżej.

Film stworzony z kilkuset zrzutów ekranu, przedstawia uruchomienie skryptu w Pythonie, start pętli w sterowniku oraz wizualizację. Nagranie jest mocno przyspieszone ze względu na czas trwania całej symulacji, czas pracy skryptu wynosił prawie 30 minut!. Początkowo jeden krok odpowiada stałej czasowej równej 0.2 sekundy, co szybko zostało zmienione na 1 sekundę. Zauważalne są również spowolnienia przy zadziałaniu blokady przed przelaniem, jest to celowy zabieg aby zwrócić uwagę i ułatwić zatrzymanie na odpowiedniej klatce.

Notka: Zmiana stałej czasowej sprawia, że posiadamy mniej lub bardziej dokładną symulację procesu, idealnie wartość ta powinna być jak najmniejsza.

Podsumowanie

Podstawowym zajęciem inżyniera jest rozwiązywanie problemów, powyżej przedstawiona jest odpowiedź na pytanie – jak mogę przetestować program bez urządzeń? Posiadając skrypt niezależny od platformy (producenta automatyki), wykorzystujemy jedno narzędzie do wielu sterowników, adaptując jedynie część odpowiedzialną za komunikację.

Tutaj przedstawiony został proces sterowania zbiornikami z cieczą, ale w łatwy sposób można stworzyć logikę dla linii transportowej, celi spawalniczej, czy dźwigu. Zastosowań jest wiele i ograniczone są jedynie przez naszą wyobraźnię.

Następny krok w rozwoju tego projektu to implementacja sterowania wysokością cieczy w zbiorniku z wykorzystaniem algorytmów automatycznej regulacji.

Dyskusja na temat tego artykułu odbywa się w Klubie Automatyka

klubautomatyka

Artykuł został nagrodzony w Konkursie iAutomatyka – edycja Maj 2019

Nagrodę koszulka + długopis PARKER+ zestaw gadżetów  dostarcza ambasador konkursu, firma EATON.

 



23 maja 2019 / Kategoria: , , , , ,

Reklama

Newsletter

Zapisz się i jako pierwszy otrzymuj nowości!

Zapoznałem się i akceptuję klauzulę informacyjną.



.

NAJNOWSZE PUBLIKACJE OD UŻYTKOWNIKÓW I FIRM

>KLIKNIJ<

Jak zabezpieczyć swój system Smart Home? Przewodnik krok po kroku

Jak zabezpieczyć swój system Smart Home? Przewodnik krok po kroku

>KLIKNIJ<

Jak wykonać bardziej przejrzystą rozdzielnię domową?

Jak wykonać bardziej przejrzystą rozdzielnię domową?

>KLIKNIJ<

Logistyka zakładowa w standardzie I4.0: System ActiveShuttle z zaawansowaną interakcją jest teraz bardziej bezpieczny i elastyczny

Logistyka zakładowa w standardzie I4.0: System ActiveShuttle z zaawansowaną interakcją jest teraz bardziej bezpieczny i elastyczny

>KLIKNIJ<

Przyspiesz proces kompletacji zamówień! – studium przypadku ELESA+GANTER

Przyspiesz proces kompletacji zamówień! – studium przypadku ELESA+GANTER

>KLIKNIJ<

Do czego mogą służyć skrypty w panelu operatorskim?

Do czego mogą służyć skrypty w panelu operatorskim?

>KLIKNIJ<

To już ostatnie dni konkursu z programem Simultus! Nie zwlekaj!

To już ostatnie dni konkursu z programem Simultus! Nie zwlekaj!

>KLIKNIJ<

Obniż swoje rachunki za ogrzewanie za pomocą tego małego termostatu!

Obniż swoje rachunki za ogrzewanie za pomocą tego małego termostatu!

>KLIKNIJ<

Efektywniejsze maszyny pakujące dzięki Trio Motion Technology

Efektywniejsze maszyny pakujące dzięki Trio Motion Technology

>KLIKNIJ<

SLG-2 czyli kompaktowa kurtyna optyczna mogąca wykryć obiekty o grubości 1 mm !!

SLG-2 czyli kompaktowa kurtyna optyczna mogąca wykryć obiekty o grubości 1 mm !!

>KLIKNIJ<

WAGO IO SYSTEM – Komunikacja z urządzeniem IO-Link za pomocą modułu master IO-Link 750-657

WAGO IO SYSTEM – Komunikacja z urządzeniem IO-Link za pomocą modułu master IO-Link 750-657

>KLIKNIJ<

Perspektywy rozwoju rynku robotów współpracujących

Perspektywy rozwoju rynku robotów współpracujących

>KLIKNIJ<

Piec obrotowy z systemem automatyzacji firmy akYtec

Piec obrotowy z systemem automatyzacji firmy akYtec

>KLIKNIJ<

Od prostych do kompleksowych rozwiązań

Od prostych do kompleksowych rozwiązań

>KLIKNIJ<

Zobacz Przemysł 4.0 w praktyce! – Wywiad z Tomaszem Dawid z firmy Balluff

Zobacz Przemysł 4.0 w praktyce! – Wywiad z Tomaszem Dawid z firmy Balluff

>KLIKNIJ<

Relacja z 8. Konferencji VIX Automation

Relacja z 8. Konferencji VIX Automation

>KLIKNIJ<

WAGO I/O SYSTEM FIELD

WAGO I/O SYSTEM FIELD

>KLIKNIJ<

Efektywność na całej linii

Efektywność na całej linii

>KLIKNIJ<

MY AUTOMATYCY MAMY CIĄGŁE WYZWANIA! – VIII Edycja Technology Days 2021

MY AUTOMATYCY MAMY CIĄGŁE WYZWANIA! – VIII Edycja Technology Days 2021

>KLIKNIJ<

W pełni funkcjonalne zarządzalne switche Ethernet RocketLinx® dołączają do oferty produktów komunikacji przemysłowej

W pełni funkcjonalne zarządzalne switche Ethernet RocketLinx® dołączają do oferty produktów komunikacji przemysłowej

>KLIKNIJ<

Koncepcja inteligentnego kurnika z urządzeniami firmy akYtec GmbH

Koncepcja inteligentnego kurnika z urządzeniami firmy akYtec GmbH

Reklama



MOŻESZ SIĘ TYM ZAINTERESOWAĆ

  • W trybie refleksyjnym sygnał ultradźwiękowy jest nieustannie odbijany przez zamontowany na stałe element odbijający wiązkę, tzw. element odniesienia. Jako elementu odbijającego wiązkę można używać odpowiednio ustawionego panelu z plastiku l...
  • Rozwiązania wizyjne nadają się idealnie do zautomatyzowanych zadań kontrolnych i pomiarowych. Kamery wizyjne 2D i 3D firmy SICK sprawdzają się w ogromnej ilości aplikacji, polegających na pomiarze, lokalizacji, kontroli i identyfikacji. Nas...
  • Poniższy poradnik jest zbiorem schematów połączeń elektrycznych. W poradniku zapoznamy się z podstawami wprowadzenia do systemów przekaźnikowych, sekwencji przełączeń przekaźników, porównania systemów przekaźnikowych z systemami tradycyjnym...
  • Selektor napędów Panasonic umożliwia przeglądanie napędów z serii MINAS, wyszukiwanie ich w prosty sposób, a nawet porównywanie ze sobą. Dzięki wyszukiwaniu po słowach kluczowych i przy użyciu funkcji filtrowania, potrzeba zaledwie sekund a...
  • Urządzenia XV300 wyposażone są w przemysłowe wyświetlacze wysokiej rozdzielczości z technologią wielodotyku. To, w połączeniu z precyzyjnym i intuicyjnym interfejsem użytkownika, umożliwia operatorom pracę od zaraz. Dodatkowo te wysoko wyda...
  • Zapraszamy do składania zapytań ofertowych o wszystkie produkty EATON w tym sterowniki easyE4 przez portal allektro.pl (Kliknij tutaj) lub przez kontakt e-mail oferty@stapor&#...



KATEGORIE ARTYKUŁÓW
POLECANE ARTYKUŁY
Wydarzenia