Szkolenie PLC cz. 14: Zaawansowana obsługa asynchronicznego mechanizmu wymiany danych w sterowniku TECO TP03


W przypadku konieczności integracji sterownika PLC z urządzeniami, które nie zostały wyposażone w moduły cyfrowych sygnałów wejściowo/wyjściowych, należy opracować algorytm wymiany danych pomiędzy składowymi projektowanego systemu. Najprostszym sposobem jest wykorzystanie wbudowanych funkcji sterowników, jednakże nawet w oparciu o te udogodnienia, programista zmuszony jest odpowiednio przemyśleć ich zastosowanie przed rozpoczęciem tworzenia projektu. W tej części szkolenia omówiony zostanie problem połączenia sterownika z urządzeniem posiadającym jedynie szeregowy interfejs komunikacyjny.

Pod pojęciem szeregowej komunikacji cyfrowej, powinniśmy rozumieć proces wymiany danych pomiędzy co najmniej dwoma urządzeniami, wykorzystując szeregowy kanał transmisyjny. Zajmiemy się analizą przypadku najprostszego, czyli układu złożonego tylko w dwóch składowych. Jednym z tych urządzeń jest sterownik TP03 firmy TECO, a drugim dowolny komponent automatyki, posiadający wbudowany mechanizm komunikacji szeregowej. Istotnym założeniem jest asynchroniczność układu, polegająca na tym, iż proces wymiany danych pomiędzy elementami systemu, może każdorazowo zostać zainicjowany w dowolnym momencie. Programista nie jest w stanie określić sekwencji kolejnych zapytań i odpowiedzi, gdyż nie wynikają one z działania programu, a ze zdarzeń które mogą zachodzić niezależnie w sposób nieskoordynowany.

Zasada działania kolejki (bufor FIFO)

Rysunek 1. Zasada działania kolejki (bufor FIFO)

W przykładzie, który zostanie zaprezentowany w dalszej części artykułu, zdarzenia te polegać będą na inicjacji odpowiednich wejść cyfrowych sterownika. Zakładamy iż działanie to jest zjawiskiem losowym i możemy jedynie określić prawdopodobieństwo wystąpienia danej sekwencji zapytań. Dlatego też, biorąc pod uwagę losowość występowania zdarzeń inicjujących komunikację, konieczne jest opracowanie mechanizmu kolejkowania i realizacji zapytań, zgodnie z kolejnością wystąpienia zdarzeń je generujących. Podejście takie zapobiega „gubieniu” zapytań, w sytuacjach w których kolejne zdarzenie zachodzi w czasie szybszym, licząc od wystąpienia zdarzenia poprzedniego, niż wynosi interwał potrzebny do jego wykonania.

MECHANIZM KOLEJKOWANIA

Kolejka jest liniową strukturą danych, przechowująca zbiór mniejszych struktur nazywanych elementami kolejki. Najpopularniejszym mechanizmem kolejkowania danych w informatyce jest kolejka typu FIFO (ang. First In, First Out), w której nowe dane dopisywane są na jej końcu, a z początku pobierane są dane do dalszych operacji arytmetyczno-logicznych. Istnieją także inne instancje podobnych buforów takie jak np. stos, będący przeciwieństwem kolejki, jednakże w tym artykule zajmiemy się tylko buforem typu FIFO. Kolejka jest bardzo istotnym elementem wszystkich systemów informatycznych, gdyż umożliwia poprawną obsługę wielu zdarzeń. Może się okazać, iż dwa lub więcej zdarzeń systemowych zachodzi w tym samym czasie. Jeżeli wszystkie muszą być obsłużone przez system operacyjny, lub system sterowania, konieczne jest istnienie mechanizmu który zapamięta i zrealizuje je zgodnie z ustalonymi priorytetami w momencie, w którym będzie to możliwe.

BUFOR FIFO

Na ilustracji nr 1 w sposób poglądowy przedstawiona została zasada działania kolejki. Element umieszczany w kolejce dodawany jest na jej końcu, czyli posiada największy indeks spośród wszystkich elementów, z kolei element usuwany ze struktury, przejmowany przez dalszą część systemu przetwarzania, posiada indeks zerowy (lub pierwszy, w zależności od przyjętej koncepcji numeracyjnej).
Główna idea polega na tym, iż pierwszy obsługiwany jest element, który znajduje się najdłużej w kolejce. W momencie dodawania elementu, kolejka zwiększa swoją wielkość, natomiast w chwili usuwania elementu, kolejka się zmniejsza i dekrementuje indeksy adresowe elementów o jeden. W ten sposób, w każdym momencie adresacja elementów rozpoczyna się od tego samego adresu początkowego, a kończy adresem wyznaczonym poprzez dodanie do adresu początkowego ilości elementów w kolejce. Zapewnia to ciągłą przestrzeń adresową bufora.
Struktura pojedynczego elementu kolejki, z teoretycznego punktu widzenia może być dowolna, a ograniczenia wynikają jedynie z możliwości obliczeniowych i funkcyjnych zastosowanego układu arytmetyczno-logicznego, czyli z konkretnego sprzętu zastosowanego przez projektanta. Jak się przekonamy w dalszej części artykułu, możliwości sterownika TP03 dotyczące postaci elementu składowego kolejki, sprowadzają się do pojedynczego rejestru 16-bitowego. Nie stanowi to jednak ograniczenia nakładanego na ostateczną postać przechowywanych elementów, gdyż wykorzystując zbiór rejestrów, możemy tworzyć bardziej zaawansowane struktury, zgodne z założonymi wymaganiami programistycznymi.

KOLEJKA W STEROWNIKU TP03

Wykorzystując sterownik TECO do stworzenia bufora typu FIFO, należy zapoznać się z dwiema najistotniejszymi instrukcjami drabinkowymi.

Są to:
• SFWR – instrukcja tworząca kolejkę oraz dodająca do niej elementy,
• SFRD – instrukcja usuwająca element z kolejki i dekrementująca jej rozmiar.

Zbiór parametrów dotyczących obu instrukcji jest identyczny:
• rejestr źródłowy,
• początek kolejki (przechowuje ilość elementów)
• maksymalny rozmiar kolejki.

Przykładowa instrukcja dodająca element do kolejki mogłaby wyglądać tak: SFWR (D100, D199, K20). W momencie jej inicjacji, sterownik skopiuje wartość rejestru D100 na koniec kolejki rozpoczynającej się od rejestru D200. Należy zapamiętać, iż w rejestrze który podajemy w instrukcji, przechowywany jest aktualny rozmiar kolejki, a elementy rozpoczynają się od rejestru kolejnego. Jeśli w danej chwili w kolejce znajdują się 3 elementy (D200, D201, D202) to najnowszy element zostanie skopiowany do rejestru D203 a licznik elementów będzie wynosił 4.
Instrukcja pobierająca dane z kolejki mogłaby wyglądać tak: SFRD (D300, D199, K20). Jeżeli jako przykład użyjemy wyżej wymienionej kolejki, to do rejestru D300 skopiowany zostanie element kolejki znajdujący się w D200. Rejestry D201 – D203 skopiowane zostaną do rejestrów D200 – D202, a licznik elementów zostanie zdekrementowany i aktualnie będzie wynosił ponownie 3.

WYKORZYSTANIE KOLEJKI DO OBSŁUGI TRANSMISJI SZEREGOWEJ

Na potrzeby tego szkolenia, opisany zostanie realny problem konwersji binarnych sygnałów cyfrowych na komendy sterujące, przesyłane po protokole MODBUS RTU. Wystarczy sobie wyobrazić sytuację, gdy za pomocą prostych sygnałów elektrycznych sterujących wejściowymi elementami półprzewodnikowymi, użytkownik chce zmieniać stan urządzenia posiadającego jedynie interfejs komunikacyjny. Zakładamy, iż pojedynczej inicjacji konkretnego wejścia cyfrowego, odpowiada wysłanie jednej, konkretnej komendy sterującej. Poniżej przedstawiony zostanie przykładowy kod drabinkowy wraz z opisem. Na ilustracji 2, widoczna jest procedura inicjująca program drabinkowy. Wykonywane operacje polegają na parametryzacji portu szeregowego, określeniu czasu oczekiwania na odpowiedzi z urządzenia zdalnego oraz wyzerowaniu wszystkich rejestrów od D0 do D500.

Inicjacja programu

Rysunek 2. Inicjacja programu

Kolejny fragment (ilustracja 3) przedstawia sposób dodawania elementów do dwóch kolejek, rozpoczynających się od rejestrów D200 oraz D300. Ze względu na 16 bitowy zakres zmienności rejestrów w standardzie MODBUS, potrzebne są 2 rejestry 8 bitowe. Pierwsza kolejka przechowuje bardziej znaczący bajt rejestru danych, natomiast druga mniej znaczący. Obie kolejki obsługiwane są w sposób równoległy, więc można stworzyć dowolne struktury kolejek jednorejestrowych, które mogą być analizowane jako jedna kolejka wielorejestrowa. Dla ułatwienia, zamiast rejestru do kolejki kopiowana jest stała liczba szesnastkowa. Inicjacja wejścia X0 powoduje równoległe umieszczenie w kolejkach odpowiednio bardziej i mniej znaczącego bajtu 16 bitowego rejestru danych. Różnica funkcjonalna w działaniu programu po inicjacji drugiego z wejść cyfrowych polega tylko na dodaniu innych danych do kolejki.
W przypadku markera X0 w kolejce umieszczamy wartość 0x52ED (21229 = 19999 + 1230, liczba 1230 oznacza 123,0°C), natomiast dla X1 jest to 0x52F7 (21239 = 19999 + 1240, czyli 124,0°C). Sens tych danych w naszym przykładzie, sprowadza się do modyfikacji rejestru wartości zadanej regulatora temperatury. W zależności od zainicjowanego wejścia, ma zostać ustawiona odpowiednia temperatura zadana. Kolejka jest w tym wypadku wykorzystywana do przechowywania nowych wartości temperatury zadanej, w sytuacji w której inicjacja, bądź inicjacje zmiany nastąpią równolegle lub gdy obsługiwana jest poprzednia transmisja. Kolejka zapewnia buforowanie rozkazów i późniejszą ich obsługę. Warto zauważyć, iż maksymalny rozmiar kolejki wynosi 20 rejestrów.

Dodawanie elementów do kolejki

Rysunek 3. Dodawanie elementów do kolejki

Fragment przedstawiony na ilustracji 4 przedstawia proces konstrukcji ramki danych dla zapytania MODBUS RTU (wykorzystujemy funkcję 0x06 – zapis pojedynczego rejestru). Szczegółowa budowa ramki została przedstawiona w jednym z poprzednich szkoleń. Niezmienne elementy ramki to adres urządzenia, kod funkcji, oraz adres rejestru który chcemy modyfikować. Elementy te ustawiane są w pierwszej części kodu. Zmiennym elementem jest sama wartość którą musimy do tego rejestru zapisać, czyli dwa kolejne rejestry danych. W sytuacji w której wartość licznika elementów w kolejce (D199) jest większa od zera, z kolejki pobierane są umieszczone w niej wartości i kopiowane do rejestrów przechowujących ostatnie elementy ramki (D54 oraz D55). Równolegle z ostatnią fazą konstrukcji zapytania, inicjowane jest rozpoczęcie procesu transmisji, poprzez ustawienie markera M0.

Obsługa ramki danych

Rysunek 4. Obsługa ramki danych

Inicjacja wspomnianego markera, powoduje w kolejnej części kodu (Ilustracja 5) wysłanie zapytania szeregowego. W momencie odebrania poprawnej odpowiedzi z urządzenia zdalnego, kasowany jest marker inicjujący.

Wysłanie ramki danych

Rysunek 5. Wysłanie ramki danych

Działanie przedstawionego programu sprowadza się do oczekiwania na wystąpienie zdarzenia na jednym z dwóch wejść cyfrowych. Każdorazowa inicjacja któregokolwiek z nich, powoduje dodanie odpowiedniej wartości do dwóch równolegle obsługiwanych kolejek. W sytuacji w której ilość elementów w kolejkach jest niezerowa, uruchamiany jest mechanizm pobierania kolejnych elementów i umieszczania ich w odpowiednich miejscach ramki danych, która następnie jest wysyłana na port szeregowy. Operacja jest powtarzana aż do opróżnienia bufora.

autor:
Dominik Szewczyk
dszewczyk@introl.pl