Dotychczas opisywałem, jak pobrać ze sterownika wartości zmiennych typu BOOL, BYTE, czy WORD. Nadszedł czas, by przyjrzeć się zasadom odczytywania struktur, czyli zmiennych składających się z grupy zmiennych.
Zacznijmy od przykładu. W programie w zakładce Data types definiuję typ testStruct:
TYPE testStruct : STRUCT id : BYTE; state : WORD; name : STRING[10]; data : ARRAY [0..5] OF BYTE; END_STRUCT END_TYPE
W programie definiuję zmienną Structure typu testsTruct:
VAR Structure : testStruct; END_VAR
W programie przypisuję przykładowe wartości:
Structure.id:=10; Structure.state:=1000; Structure.name:='testing'; Structure.data[0]:=11; Structure.data[1]:=12;
Tworzę wizualizację test_visu w której umieszczam 5 prostokątów, wyświetlających 5 elementów zmiennej Structure.
Po skompilowaniu programu i wgraniu go do sterownika, łączę się ze sterownikiem przez FTP i w katalogu PLC znajduję plik test_visu.xml, w którym na samym dole widzę:
<variable name="PLC_PRG.Structure.id">4,176680,1,2</variable> <variable name="PLC_PRG.Structure.state">4,176682,2,3</variable> <variable name="PLC_PRG.Structure.name">4,176684,11,8</variable> <variable name="PLC_PRG.Structure.data[0]">4,176695,1,2</variable> <variable name="PLC_PRG.Structure.data[1]">4,176696,1,2</variable>
Dzięki umieszczeniu poszczególnych elementów zmiennej Struct w wizualizacji udostępnianej przez web, możemy poznać adresy owych elementów. Adres Structure.id to 176680, Structure.state – 176682, Structure.name – 176684, Structure.data – 176695.
Struktura adresowania poszczególnych elementów zmiennej danego typu jest taka sama, stąd też w przyszłości wystarczy poznanie wyłącznie adresu pierwszego elementu, by móc zczytywać pozostałe. Jeśli więc zdefiniowałbym kolejną zmienną np. Structure2 : testStruct i w wizualizacji umieścił wyłącznie 1 element wyświetlający wartość Structure2.id, aby odczytać pozostałe elementy musiałbym użyć:
Spróbujmy na konkretnym przykładzie. W moim programie wykorzystuję bibliotekę WAGO Scheduler_02.lib a z niej zmienne typu typScheduleWeekly, przechowujące dane kalendarzy. Mam więc w programie:
VAR Blind_Salon_Data1 : typScheduleWeekly; END_VAR
W eksploratorze bibliotek (Resources->Library Manager->Data types) zobaczyć mogę, że typScheduleWeekly zdefiniowany jest jako:
TYPE typScheduleWeekly : STRUCT ON_hour : WORD; ON_minute : WORD; OFF_hour : WORD; OFF_minute : WORD; Weekday : WORD; Active : WORD; END_STRUCT END_TYPE
Gdy w wizualizacji udostępnianej przez web umieszczę 1 element, który wskazywać będzie wartość PLC_PRG.Blind_Salon_Data1.ON_hour, po skompilowaniu, wgraniu programu na sterownik, w katalogu PLC, w pliku ‘nazwawizualizacji.xml’ blisko końca znajdę:
<variable name="PLC_PRG.Blind_Salon_Data1.ON_hour">3,6232,2,3</variable>
Znajac structure typScheduleWeekly (wszystkie elementy typu WORD) i wiedząc, że pierwszy element ON_hour ma adres 3,6232,2,3, mogę wyliczyć, że:
Ostatecznie więc – czy da się odczytywać zmienne typu struct? Da się! Wystarczy pierwszy z elementów umieścić w wizualizacji udostępnianej przez web, poznać jego adres, wyliczyć adresy pozostałych i odczytywać je jako pojedyncze dane (jak? przeczytaj poprzedni artykuł).
W oparciu o powyższą wiedzę, zmienne typu struct odczytać można też prez MODBUS’a, czy zapytanie READPI. Trzeba by jednak rozpoznać, jak mają się adresy prezentowane w wizualizacjach (np. 3,6232) do adresów używanych przez MODBUS i webserwer do obsługi READPI.
Oto nadszedł czas by wzbogacić moje wizualizacje o obsługę schedulerów :) UPDATE: Zobacz ten artykuł!