Akcia WAIT


Funkcia
Dočasné pozastavenie vykonávania akcií.
Deklarácia
WAIT expression

 
alebo
 
WAIT

Parametre
expression in Výraz typu Bool - podmienka.

Popis
  • Akcia WAIT s výrazom - pozastavenie vykonávania akcií až po splnenie podmienky. Podmienka je splnená, keď výraz nadobudne hodnotu @TRUE.

  • Akcia WAIT bez výrazu - pozastavenie vykonávania akcií po vykonanie posledného priradenia. Tento variant akcie umožňuje odstránenie časových hazardov a taktiež kontrolu úspešnosti priradenia. Priradenie do lokálnej premennej je okamžité (synchrónne s vykonávaním akcií).
    Naproti tomu priradenie do objektu (nastavenie hodnoty objektu) predstavuje len žiadosť a jeho vykonanie môže určitý čas trvať. Tu existuje riziko vzniku časového hazardu.

Príklad
Predpokladá existenciu objektu U.Int typu Užívateľská premenná, typ hodnoty Int.
 
 ; priradenie s čakaním
 U.Int := 1  ; priradenie hodnoty
 WAIT        ; čakanie na priradenie
 
 ; ak akcia WAIT dopadla úspešne (bez chyby), objekt U.Int má
 ; určite hodnotu 1
 IF U.Int = 1 THEN ; test hodnoty
   ; vetva THEN-ELSE sa vykoná vždy, lebo objekt U.Int má hodnotu 1
 ELSE
   ; vetva ELSE-ENDIF sa nevykoná nikdy
 ENDIF
 
 U.Int := 2
 ; v tomto prípade nie je zaručené, že
 ;objekt U.Int bude mať hodnotu 2 
 ; závisí to od momentálnej záťaže systému ...
 IF U.Int = 1 THEN
 ELSE
 ENDIF 

 
Akcia WAIT umožňuje testovať úspešnosť priradenia hodnoty do objektu. Napríklad zápis do výstupného meraného bodu, ktorý realizuje proces D2000 KOM.
Príklad
Predpokladá existenciu objektu M.Cmd typu Meraný bod, typ výstupný celočíselný (Integer).
 
 INT _maxWriteCount = 10  ; maximálny počet zápisov
 INT _writeCount          ; počítadlo zápisov
 
 ON ERROR WriteFailed     ; obsluha chyby
 
 _writeCount := 0
 WriteRetry:
   IF _writeCount >= _maxWriteCount GOTO WriteLoopFailed
     _writeCount := _writeCount + 1
     M.Cmd := 1
     WAIT
     ; zápis prebehol úspešne
     END
 
 ; zápis prebehol neúspešne _maxWriteCount-krát
  WriteLoopFailed:
   END
 ; obsluha neúspešného zápisu
 WriteFailed:
 GOTO WriteRetry 

 
Uvedený príklad ošetruje všetky chybové stavy, ktoré môžu vzniknúť pri zápise:
  • nebeží proces D2000 KOM
  • stanica nekomunikuje
  • zápis do zariadenia neprebehol úspešne
  • objekt nie je v manuálnom režime
V prípade, že ide o viacnásobné priradenie, je toto kontrolované ako celok. Musí v poriadku prebehnúť každý čiastkový zápis. Takáto situácia nastáva pri priradení hodnoty typu Štruktúra, ak v jednotlivý položkách sú odkazy na objekty.
Príklad
Objekt SD.Rec je typu Definícia štruktúry obsahuje jednu položku typu Int s menom Int a dve položky typu Objekt s menami Obj1 a Obj2.
Objekt SV.Rec je typu Štruktúrovaná premenná, má typ štruktúry SD.Rec a počet riadkov 2.
Objekty M.1, M.2, M.3 a M.4 sú výstupné merané body typu Int.


 
 RECORD NOALIAS (SD.Rec) _locArr  ; lokálna premenná typu Record
                                  ; vypnuté odkazy na objekty 
 REDIM _locArr[2]                 ; zmena dĺžky poľa
 
 ; naplnenie hodnôt lokálnej premennej typu Record
 _locArr[1]^Int  := 1
 _locArr[1]^Obj1 := 1
 _locArr[1]^Obj2 := 2
 _locArr[2]^Int  := 2
 _locArr[2]^Obj1 := 3
 _locArr[2]^Obj2 := 4
 
 ; priradím odkazy na objekty
 SET SV.Rec[1]^Obj1 AS M.1
 SET SV.Rec[1]^Obj2 AS M.2
 SET SV.Rec[2]^Obj1 AS M.3
 SET SV.Rec[2]^Obj2 AS M.4
 WAIT   ; realizácia zmeny odkazu v systéme
 
 P1:
 SET SV.Rec AS _locArr ; priradenie celej hodnoty
 WAIT 

 
V príklade na riadku označenom návestím P1 sa uskutoční priradenie celkovo 6-tich hodnôt, pričom 4 priradenia realizujú zápis do meraných bodov (prostredníctvom odkazu na objekt). Úspešnosť operácie sa dá preveriť následnou akciou WAIT. Prípadný neúspech ľubovoľného priradenia spôsobí chybu.

Súvisiace stránky:

Napíšte komentár