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