Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

PLC Codesys - Obsługa daty/czasu w PLC z wykorzystaniem wyłącznie bibliotek st.

tehaceole 13 Paź 2012 12:51 5274 0
  • Zegar czasu rzeczywistego w PLC, czy to Moellera serii XC-201, czy to WAGO serii 750-xxx, wykorzystuję praktycznie w każdym z projektów. Ponieważ ostatnimi czasy obydwie serie sterowników stosowane są przeze mnie zamiennie - stąd narodził się pomysł napisania bloku funkcyjnego, który wykorzystuje wyłącznie elementy zawarte w bibliotece standardowej standard.lib i syslibrtc.lib. Do tej pory stosowałem biblioteki obsługi daty / czasu dedykowane dla konkretnego sterownika. W większości są one ze sobą zamienne. Jednak dość często zdarza się, że przenosząc kod na inny komputer danej biblioteki na nim nie ma. Stąd wniosek był tylko jeden: biblioteki standardowe są dostępne zawsze, niezależnie od targetu docelowego. Zatem blok funkcyjny musi zostać stworzony z ich wykorzystaniem.

    Pisząc kod bloku przyjąłem założenie, że ma on realizować całą procedurę zmiany czasu - włącznie z aktualizacją daty / czasu na panelu operatorskim. W związku z tym kod przyjmuje jako zmienne wejścia wyjścia: zmienną typu DWORD w której przechowywana jest wartość czasu (typ DATE_AND_TIME) oraz 2 tablice ośmioelementowe: Status i Control (WORD) - bezpośrednio uczestniczące w procesie aktualizacji czasu na panelu operatorskim. Aktualizacja przebiega następująco:

    - do zmiennej Time (DWORD) wpisujemy aktualną wartość daty/czasu wykorzystując DT_TO_DWORD

    - ustawiamy na true 11 bit w zerowym słowie rejestru Control

    - oczekujemy na pojawienie się wartości true na 11 bicie zerowego słowa rejestru statusu

    - gdy pojawi się true, ustawiamy na false 11 bit w zerowym słowie rejestru Control

    Ponieważ do zmiennych wejścia / wyjścia, które de facto są wskaźnikami na właściwe zmienne (analogicznie jak w innych językach programowania) nie możemy odwoływać się bezpośrednio bitowo, stąd wewnątrz bloku funkcyjnego zerowe słowa rejestrów Status i Control przepisywane są do lokalnych zmiennych (WORD), zmiany dokonywane są na tych zmiennych a na koniec zmienne ponownie wpisywane są jako zerowe pozycje tablic. Spytasz: po co do bloku przekazujesz tablice a nie tylko zerowe ich pozycje? Odpowiadam: po to, aby po umieszczeniu bloku w programie podpiąć do niego zmienne bezpośrednio wystawiane do komunikacji z panelem, bez zewnętrznego ich przeliczania. Poza tym, mając do dyspozycji wewnątrz bloku całą tablicę - mogę w łatwy sposób rozbudować blok np. o możliwość przełączania aktywnych masek na panelu np. w zadanych godzinach. Możliwości jest wiele - stąd do bloku trafia cała tablica a nie jej zerowy element. Choć tak też możnaby to zrealizować i byłoby to całkowicie poprawne.

    Paczka z kodem jest do ściągnięcia tutaj.

    Niezwykle ważna uwaga: zmienne podpinane do bloku, odpowiedzialne za komunikację z panelem Micro Innovation MUSZĄ posiadać następujące nazwy:

    Control :ARRAY [0..7] OF WORD;
    Status :ARRAY [0..7] OF WORD;
    Date_Time :DWORD;

    Podczas importu pliku konfiguracji symboli do środowiska Glileo zostanie wyświetlony komunikat typu "could not import tag Date_Time because tag is already...". Nie należy się tym przejmować. Pomimo tego komunikatu Galilo poprawnie odczytuje dane spod tych trzech tagów umożliwiając sterowanie funkcjami panelu z poziomu steronwnika PLC.

    Jako przydatny dodatek blok generuje zmienną typu string z ładnie sformatowaną datą, godziną i dniem roku do wyświetlenia w wewnętrznej wizualizacji Codesysa.

    UWAGA!!!
    Fragmenty kodu zawarte w niniejszym opracowaniu pochodzą z freewareowych bibliotek OSCAT.


    Więcej o programowaniu w środowisku Codesys tutaj.


    Fajne!
 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME