Tekst strukturalny
Tekst strukturalny , w skrócie ST lub STX , jest jednym z pięciu języków obsługiwanych przez normę IEC 61131-3 , zaprojektowaną dla programowalnych sterowników logicznych (PLC). Jest to język wysokiego poziomu, który ma strukturę blokową i składniowo przypomina Pascala , na którym jest oparty. Wszystkie języki mają wspólne elementy IEC61131 . Zmienne i wywołania funkcji są definiowane przez wspólne elementy, dzięki czemu w tym samym programie można używać różnych języków w ramach normy IEC 61131-3.
Obsługiwane są złożone instrukcje i instrukcje zagnieżdżone:
- Pętle iteracyjne (REPEAT-UNTIL; WHILE-DO)
- Wykonanie warunkowe (JEŚLI-TO-INNE; PRZYPADEK)
- Funkcje (PIERW(), SIN())
Przykładowy program
(* prosta maszyna stanowa *) TxtState := STANY [ StateMachine ] ; CASE StateMachine OF 1 : ClosingValve () ; StateMachine := 2 ; 2 : Otwieranie zaworu () ; ELSE BadCase () ; END_CASE ;
W przeciwieństwie do niektórych innych języków programowania, nie ma przejścia dla instrukcji CASE: wprowadzany jest pierwszy pasujący warunek, a po wykonaniu jego instrukcji blok CASE jest pozostawiany bez sprawdzania innych warunków.
Dodatkowe przykłady programowania ST
0
0 // Konfiguracja PLC KONFIGURACJA DefaultCfg VAR_GLOBAL b_Start_Stop : BOOL ; // Zmienna globalna reprezentująca wartość logiczną. b_ON_OFF : BOOL ; // Zmienna globalna reprezentująca wartość logiczną. Start_Stop AT % IX0 . : BOOL ; // Wejście cyfrowe PLC (adres 0.0) ON_OFF AT % QX0 . : BOOL ; // Wyjście cyfrowe PLC (adres 0.0). (Cewka)
END_VAR // Zaplanuj wykonywanie programu głównego co 20 ms TASK Tick ( INTERVAL := t #20 ms ) ; PROGRAM Główny Z Tick : Monitor_Start_Stop ; END_CONFIGURATION PROGRAM Monitor_Start_Stop // Aktualny program VAR_EXTERNAL Start_Stop : BOOL ; WŁ_WYŁ : BOOL ; END_VAR VAR // Zmienne tymczasowe do obsługi logiki
ONS_Trig : BOOL ; Rising_ONS : BOOL ; END_VAR // Początek logiki // Złap zbocze narastające Jedno ujęcie wejścia Start_Stop ONS_Trig := Start_Stop AND NOT Rising_ONS ; // Główna logika dla Run_Contact -- Toggle ON / Toggle OFF --- ON_OFF := ( ONS_Trig AND NOT ON_OFF ) OR ( ON_OFF AND NOT ONS_Trig ) ;
// Rising One Shot logika Rising_ONS := Start_Stop ; END_PROGRAM
Przykład bloku funkcyjnego
//================================================ ======================= // Licznik czasowy bloku funkcyjnego: Przyrostowe zliczanie interwału czasowego //============ ================================================== ========= FUNCTION_BLOCK FB_Timed_Counter VAR_INPUT Wykonaj : BOOL := FALSE ; // Sygnał wyzwalający do rozpoczęcia zliczania czasowego Time_Increment : REAL := 1.25 ; // Wprowadź czas cyklu (sekundy) między liczbami Count_Cycles : INT :=
0
20 ; // Liczba żądanych cykli zliczania END_VAR VAR_OUTPUT Timer_Done_Bit : BOOL := FALSE ; // Jeden bit wskazujący zakończenie cyklu timera Count_Complete : BOOL := FALSE ; // Bit wyjściowy wskazujący, że zliczanie zostało zakończone Current_Count : INT := ; // Zliczanie wartości licznika END_VAR VAR CycleTimer : TON ;
// Timer FB z biblioteki poleceń CycleCounter : CTU ; // Licznik FB z biblioteki poleceń TimerPreset : TIME ; // Przekonwertowane Time_Increment w sekundach na MS END_VAR // Początek programowania bloku funkcyjnego TimerPreset := REAL_TO_TIME ( in := Time_Increment ) * 1000 ; CycleTimer ( w := Wykonaj I NIE CycleTimer . Q
, pt := TimerPreset ); Timer_Done_Bit := Licznik czasu cyklu . P ; CycleCounter ( cu := CycleTimer . Q , r := NIE Wykonaj , pv := Count_Cycles ); Current_Count := CycleCounter . życiorys ; Count_Complete := Licznik cykli . q ; END_FUNCTION_BLOCK