Używamy plików cookies (tzw. ciasteczka) by spersonalizować treść i ogłoszenia oraz by analizować ruch na stronie.  W sposób automatyczny dzielimy się informacjami o Twoim użyciu tego portalu z dostawcami ogłoszeń, którzy mogą połączyć te informacje z informacjami, które im udzieliłaś/łeś lub, które sami zebrali. Korzystanie z witryny bez zmiany ustawień dotyczących cookies oznacza, że będą one zamieszczane w Państwa urządzeniu końcowym.  Możecie Państwo dokonać w każdym czasie zmiany ustawień dotyczących cookies zmieniając opcje przeglądarki.

Odczytywanie zmiennych złożonych (Struct)

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.

visu definitions

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ć:

  • Structure2.state – 4,adres Structure2.id+2,2,3
  • Structure2.name – 4,adres Structure2.id+4,11,8
  • Structure2. Data[0] – 4,adres Structure2.id+15,1,2
  • Structure2.Data[1] – 4, adres Structure2.id+17,1,2 itd…..

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:

  • PLC_PRG.Blind_Salon_Data1.ON_minute ma adres 3,6234,2,3 (6232+2)
  • PLC_PRG.Blind_Salon_Data1.OFF_hour ma adres 3,6236,2,3
  • PLC_PRG.Blind_Salon_Data1.OFF_minute ma adres 3,6238,2,3
  • PLC_PRG.Blind_Salon_Data1.Weekday ma adres 3,6240,2,3, oraz
  • PLC_PRG.Blind_Salon_Data1.Active ma adres 3,6242,2,3

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ł!