WAIT
Akcia WAIT
Funkcia
Dočasné pozastavenie vykonávania akcií.
Deklarácia
WAIT expression
alebo
WAITParametre
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: