Do Projektu iAutomatyka dołączyli:

https://iautomatyka.pl/wp-content/uploads/2019/05/mini3.jpg

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!).

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.

 



Utworzono: / Kategoria: , , , , ,

Reklama

Newsletter

Zapisz się i jako pierwszy otrzymuj nowości!



PRZECZYTAJ RÓWNIEŻ



NAJNOWSZE PUBLIKACJE OD UŻYTKOWNIKÓW I FIRM

Reklama



POLECANE FIRMY I PRODUKTY
  • Ten kurs zawiera podstawy z dziedziny serwomechanizmów. Składa się z pierwszego modułu wprowadzającego, pełnego kursu o serwomechanizmach. Mini kurs przeprowadzi Cię przez podstawowe zagadnienia związane z serwomechanizmami. Zaczniemy od sa...
  • Chcieliby Państwo być informowani z wyprzedzeniem o stanie maszyny lub techniki napędowej? Nic prostszego! Aplikacja DriveRadar® oferuje kompleksowe zarządzanie konserwacją w oparciu o cyfrowe rejestrowanie danych, na podstawie których możl...
  • 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...
  • Zapraszamy Cię na pełny kurs zdalnego dostępu SECOMEA. Kurs powstał z myślą o każdym, kto chce zgłębić tajniki zdalnego dostępu do maszyn i sieci przemysłowej. Zdalny dostęp rozwija się dynamiczne i zyskuje na znaczeniu zwłaszcza w sytuacji...
  • 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@staport.p&...
  • Sterowniki kompaktowe, modułowe i zintegrowane, CODESYS V3 (programowanie, wizualizacja, komunikacja), Krótkie cykle czasowe, EtherCAT, BACnet (opcjonalnie), Modbus, CANopen, Porty szeregowe: RS232, RS485, 2 konfigurowalne karty Ethernet, W...