Powrót do blogu

Wprowadzenie myślenia obiektowego do programowania sterowników PLC

Obiektowo zorientowane projektowanie sterowników PLC zmniejsza ryzyko kopiowania i wklejania dzięki enkapsulowanym komponentom, jawnym interfejsom, kompozycji, modelom stanów, testowaniu i kontroli...

Myślenie obiektowe może ułatwić ponowne wykorzystanie, testowanie i utrzymanie oprogramowania PLC, ale nie stanowi jednego uniwersalnego zestawu funkcji. Niektóre środowiska zgodne z normą IEC 61131-3 obsługują metody, interfejsy, właściwości, dziedziczenie i polimorfizm. Inne platformy sterowników udostępniają wielokrotnego użytku bloki funkcyjne, instrukcje dodatkowe, definiowane przez użytkownika typy danych lub biblioteki, nie implementując pełnego modelu obiektowego. Inżynierowie muszą projektować rozwiązania z uwzględnieniem dokładnej platformy i jej wersji.

Praktycznym celem nie jest naśladowanie oprogramowania klasy enterprise. Chodzi o to, aby przestać traktować każdy zawór, silnik, kanał analogowy i jednostkę pakietową jako kolejne zadanie polegające na kopiowaniu i wklejaniu. Dobrze zdefiniowany komponent programowy zapewnia każdemu urządzeniu spójny interfejs, model stanów, sposób obsługi alarmów, ścieżkę symulacji i zapis diagnostyczny, jednocześnie pozostawiając specyficzne dla maszyny okablowanie oraz ograniczenia procesu poza rdzeniem wielokrotnego użytku.

Modułowy sprzęt PLC i I/O obsługiwany przez wielokrotnego użytku komponenty oprogramowania sterującego

Sprzęt jest z założenia modułowy; wielokrotnego użytku oprogramowanie powinno równie jednoznacznie definiować interfejs, stan i sposób reakcji każdego modułu na awarie.

Zacznij od hermetyzacji, nie od dziedziczenia

Hermetyzacja oznacza umieszczenie powiązanego stanu i zachowania za zdefiniowanym interfejsem. Komponent zaworu może przyjmować polecenia, zezwolenia, sygnały zwrotne, tryb pracy i konfigurację. Może udostępniać stany otwarcia, zamknięcia, ruchu, awarii, blokady oraz diagnostyki. Wewnętrzny timer, wykrywanie zmian, zasady ponawiania prób i logika alarmów pozostają własnością komponentu.

Jest to wartościowe nawet na platformie, która nie obsługuje dziedziczenia. Blok funkcyjny lub instrukcja dodatkowa nadal może chronić stan wewnętrzny, ujednolicać działanie i ograniczać powielanie kodu. Dziedziczenie jest przydatne wyłącznie wtedy, gdy istnieje rzeczywista relacja „jest” i typ pochodny może zachować zgodność z interfejsem bazowym. Głębokie drzewa dziedziczenia są trudne do diagnozowania online, a niewielka zmiana w typie bazowym może wpłynąć na wiele maszyn.

Oddziel definicję typu, dane instancji i mapowanie I/O

Definicja wielokrotnego użytku opisuje zachowanie. Instancja przechowuje stan jednego fizycznego lub logicznego urządzenia. Mapowanie I/O łączy tę instancję z rzeczywistymi sygnałami. Mieszanie tych odpowiedzialności uzależnia logikę biblioteki od adresów w szafie i uniemożliwia bezpieczne testowanie offline.

Utrzymuj fizyczne tagi wejść i wyjść na granicy integracji. Konwertuj surowe sygnały na czytelne wartości logiczne lub jednostki inżynierskie, wywołuj komponent wielokrotnego użytku, a następnie mapuj zatwierdzone żądania wyjść z powrotem na sprzęt. Taki układ obsługuje symulację, zastępcze moduły I/O i etapową migrację. Sprawia również, że program najwyższego poziomu pokazuje intencję procesu zamiast powtarzających się operacji na adresach.

Sterowniki i rodziny I/O można przeglądać w kolekcji systemów PLC i PAC, ale wybrana architektura oprogramowania musi uwzględniać obsługiwane przez sterownik języki, model pamięci, zasady zmian online oraz certyfikację bezpieczeństwa.

Używaj interfejsów jako kontraktów zachowania

Jeśli platforma obsługuje interfejsy, zdefiniuj operacje, na których mogą polegać elementy wywołujące, bez ujawniania szczegółów implementacji. CODESYS opisuje na przykład obiektowe bloki funkcyjne z metodami, interfejsami, właściwościami, dziedziczeniem i wywołaniami metod wirtualnych w swoim oficjalnym materiale referencyjnym dotyczącym programowania obiektowego. Ta funkcja rzeczywiście istnieje, ale nie należy zakładać jej dostępności w każdym środowisku PLC.

Interfejs może pozwolić różnym implementacjom silnika udostępniać wspólne polecenia i statusy. Prosty rozrusznik, przemiennik częstotliwości i serwonapęd mogą obsługiwać zezwolenie, zatrzymanie, reset, tryb, gotowość, pracę i informacje o awariach, zachowując odmienne wewnętrzne funkcje diagnostyczne. Sekwencja wywołań zależy wtedy od kontraktu, a nie od każdego parametru specyficznego dla danego producenta.

Preferuj kompozycję w przypadku maszyn i skidów

Większość urządzeń przemysłowych ma naturalnie złożoną strukturę. Pakiet pompowy zawiera silnik, zawory odcinające, zezwolenia, pomiary analogowe i logikę sekwencji. System zbiornika zawiera przyrządy do pomiaru poziomu, zawory, pompy, alarmy i tryby pracy. Buduj większe jednostki, zawierając w nich mniejsze, przetestowane komponenty, zamiast wyprowadzać każde urządzenie z jednej uniwersalnej klasy bazowej.

Kompozycja zapewnia przejrzysty podział odpowiedzialności. Sekwencja pompy może sterować jej silnikiem i zaworami, ale komponent silnika nadal odpowiada za sygnał zwrotny rozrusznika, limit czasu uruchomienia i stany awarii właściwe dla silnika. Komponent analogowy odpowiada za prawidłowość sygnału i skalowanie. Jednostka koordynuje te elementy i przekazuje zwięzły stan do logiki wyższego poziomu.

Urządzenia procesowe, takie jak pompa i zawory, modelowane jako złożone komponenty oprogramowania PLC

Kompozycja odzwierciedla hierarchię urządzeń, pozwalając jednocześnie każdemu komponentowi silnika, zaworu i przyrządu zachować własną diagnostykę.

Zaprojektuj jednoznaczny model stanów

Komponent powinien udostępniać obserwowalny stan pracy. Sama logika poleceń logicznych często prowadzi do niemożliwych kombinacji, takich jak jednoczesny stan pracy i zatrzymania, automatyczny i ręczny tryb pracy albo jednoczesny stan sprawności i awarii. Model stanów oparty na wyliczeniu może wyrażać stany bezczynności, uruchamiania, pracy, zatrzymywania, awarii i konserwacji, wraz z celowo zdefiniowanymi przejściami.

Każde przejście wymaga warunków wejściowych, potwierdzenia zakończenia, reakcji po przekroczeniu limitu czasu i zasad anulowania. Polecenia powinny być żądaniami, a nie bezpośrednimi przypisaniami do stanu. Reset powinien kasować zatrzaśniętą awarię tylko wtedy, gdy pozwala na to przyczyna problemu. Tryb ręczny powinien określać, które zabezpieczenia pozostają aktywne i kto przejmuje sterowanie wyjściem.

Oddziel konfigurację od stanu wykonawczego

Konfiguracja obejmuje limity czasowe, zakresy jednostek inżynierskich, progi alarmowe, opcje urządzenia i aktywację funkcji. Stan wykonawczy obejmuje akumulatory timerów, bieżący tryb, właściciela polecenia, historię awarii i status przejścia. Ich rozdzielenie ułatwia przegląd zmian i zarządzanie recepturami.

Nie każde ustawienie powinno być zapisywalne z poziomu HMI. Zdefiniuj kontrolę zakresu, uprawnienia ról, rejestrowanie zmian oraz moment, w którym nowa wartość staje się aktywna. Dane retencyjne również wymagają jednoznacznej polityki. Komponent, który wznawia działanie po cyklu zasilania, nie może przywracać niebezpiecznego polecenia tylko dlatego, że wszystkie jego zmienne wewnętrzne skonfigurowano jako trwałe.

Testuj komponenty przed zwielokrotnieniem instancji

Korzyści z ponownego wykorzystania pojawiają się dopiero wtedy, gdy definicja jest godna zaufania. Zbuduj uprząż testową, która wymusza prawidłowe sygnały zwrotne, opóźnione sygnały zwrotne, sprzeczne wejścia, utratę komunikacji, nieprawidłową jakość sygnału analogowego, zmiany trybu, próby resetu, uruchomienie po włączeniu zasilania i graniczne wartości limitów czasu. Dla każdego przypadku potwierdź wyjścia, alarmy i przejścia stanów.

Następnie przetestuj wiele instancji, aby ujawnić błędy związane ze współdzielonym stanem. Zweryfikuj czas cyklu i wpływ na pamięć przy realistycznej skali. Zwięzłe wywołanie na poziomie głównym nie oznacza, że implementacja nie wymaga zasobów obliczeniowych. Zmiany online, aktualizacje bibliotek i migrację danych instancji należy przećwiczyć na docelowym sterowniku przed wdrożeniem.

Kontroluj zmiany i wersjonowanie bibliotek

Komponent wielokrotnego użytku może szeroko rozpowszechnić poprawkę, ale równie szeroko może rozpowszechnić błąd. Każdemu wydanemu typowi nadaj wersję, udokumentowany interfejs, zapis testów i historię zmian. Klasyfikuj zmiany jako zgodne lub przełamujące zgodność. Nie zmieniaj po cichu znaczenia alarmów, domyślnych czasów, działania wyjść ani układu danych retencyjnych w używanej definicji.

Projekty powinny rejestrować wersje bibliotek, z których skompilowano i pobrano program. Jeśli platforma osadza kopie źródłowe, określ sposób porównywania i importowania zatwierdzonych aktualizacji. Jeśli odwołuje się do zarządzanej biblioteki, zaplanuj jej dostępność i możliwość wycofania zmian. Grafiki operatorskie i obrazy ekranów powinny rozwijać się razem z interfejsem sterowania, zamiast zakładać, że stare nazwy elementów pozostaną prawidłowe.

Integruj diagnostykę z warstwą operatorską

Przydatny komponent informuje, dlaczego nie może wykonać działania: brak zezwolenia, rozbieżność sygnału zwrotnego, przekroczenie limitu czasu przejścia, sterowanie lokalne, nieprawidłowa konfiguracja, niska jakość sygnału wejściowego lub aktywna funkcja bezpieczeństwa. HMI powinien tłumaczyć ten uporządkowany status na komunikat umożliwiający podjęcie działania, bez obchodzenia uprawnień sterownika. Odpowiedni sprzęt operatorski można znaleźć w kategorii HMI i komputery przemysłowe, ale kontrakt diagnostyczny zaczyna się w kodzie sterowania.

Perspektywa inżynierska

Programowanie PLC w stylu obiektowym jest najbardziej wartościowe jako dyscyplina oparta na przejrzystych interfejsach, hermetyzacji stanu, kompozycji, testowaniu i kontrolowanym ponownym wykorzystaniu. Pełne dziedziczenie i polimorfizm mogą pomóc na platformach, które je implementują, ale nie są wymaganiami wyjściowymi. Zacznij od jednego ograniczonego typu urządzenia, sprawdź jego reakcje na awarie, udokumentuj interfejs i skaluj rozwiązanie dopiero wtedy, gdy dowody z testów będą solidne. Rezultat powinien ułatwiać uruchamianie i rozwiązywanie problemów kolejnemu inżynierowi, a nie tylko sprawiać, że kod źródłowy wygląda bardziej zaawansowanie.

Zostaw komentarz

Pamiętaj, że komentarze muszą zostać zatwierdzone przed ich opublikowaniem.