Funkcia
Zmena jednej hodnoty je implementovaná formou priradenia, alebo podmieneného priradenia.


Deklarácia
dstIdent := expression [TIME timeExpression] 
dstIdent :?= expression
Parametre
dstIdentinCieľ hodnôt (identifikátor riadku, alebo celej štruktúry).
expressioninVýraz definujúci hodnotu.
TIME timeExpressioninVýraz typu Absolútny čas - čas vzniku hodnoty (nepovinný parameter).
Popis
Hodnota vzniknutá priradením má čas vzniku hodnoty aktuálny čas. Ak je uvedený nepovinný parameter TIME, vyhodnotí sa výraz timeExpression a jeho výsledok sa použije ako čas vzniku hodnoty.

Parameter dstIdent je identifikátor jednej hodnoty:
    • objektu alebo lokálnej premennej typu Int, Bool, Real, Time, Text
      Výraz expression musí byť daného typu. Ak nie je, skript sa pokúsi hodnotu konvertovať na správny typ. Ak sa to nepodarí, výsledná hodnota je neplatná (Invalid).


    • lokálnej premennej typu RECORD alebo objektu typu Štruktúrovaná premenná
      priradenie je možné len do jednej položky konkrétneho riadku štruktúry. Ostatné pravidlá priradenia sú zhodné s jednoduchým typom.

       RECORD (SD.RecordDef) _lArr
       REDIM _lArr[10]
       _lArr[2]^Int := 1
       
    • lokálnej premennej typu ALIAS (netypový)
      Ak nie je asociovaná s objektom systému, vzniká chyba _ERR_NO_ASSIGNED_ALIAS. Ináč je výraz vyhodnotený a výsledná hodnota priradená objektu, ktorý je asociovaný s lokálnou premennou.

       ALIAS _a
       SET _a  AS U.Int
       _a := 1 
       WAIT
       
    • lokálnej premennej typu ALIAS (typový)
      Priradenie je možné len do jednej položky konkrétneho riadku štruktúry. Ak nie je asociovaná s objektom systému, vzniká chyba _ERR_NO_ASSIGNED_ALIAS. Ináč je výraz vyhodnotený a výsledná hodnota priradená objektu políčka.

       ALIAS (SD.RecordDef) _aArr
       SET _aArr  AS SV.Struktura
       _aArr[2]^Int := 1
       WAIT 

Podmienené priradenie :?=

Pri podmienenom priradení je najskôr vyhodnotený výraz a výsledná hodnota je potom porovnaná s aktuálnou hodnotou dstIden.
Ak sú hodnoty rôzne, vykoná sa priradenie. Ak hodnoty nie sú rôzne, priradenie sa nevykoná.

Pri porovnávaní hodnôt (v prípade ak sú obe hodnoty platné) sa berie do úvahy len hodnota bez ďalších atribútov, ako sú čas vzniku hodnoty, príznaky, limity .... 
Porovnanie pokladá dve neplatné hodnoty za zhodné.


Podmienené priradenie má zmysel hlavne pri zmenách hodnôt objektov v rámci DODM, kedy sa predchádza zbytočným činnostiam ktoré po priradení nasledujú.
Napríklad:

  • pri zápise do výstupného meraného bodu dochádza ku komunikácii na úrovni protokolu
  • pri zápise do užívateľskej premennej alebo položky štruktúrovanej premennej, ktorá má zapnuté ukladanie štartovacej hodnoty, dochádza k zápisu hodnoty do konfiguračnej databázy

Podmienená priradenie je ekvivalent nasledujúceho zápisu

IF M.Output\VLD THEN
  IF _newValue\VLD THEN           ; old valid, new valid
    IF M.Output # _newValue THEN
      M.Output := _newValue
    ENDIF
  ELSE                            ; old valid, new invalid
    M.Output := _newValue
  ENDIF
ELSE
  IF _newValue\VLD THEN           ; old invalid, new valid
    M.Output := _newValue
  ENDIF                           ; old invalid, new invalid
ENDIF
Poznámka:
Ak priradením meníme hodnotu objektu v systéme, má priradenie charakter "žiadosti" o zmenu hodnoty. Skript po priradení pokračuje vykonávaním ďalších akcií a nie je zaručené, že objekt svoju hodnotu zmenil (je to dané aktuálnymi časovými pomermi - zaťažením systému).


Príklad
 INT _prevValue
 
 _prevValue := U.Int             ; odložím si predchádzajúcu hodnotu objektu
 U.Int := U.Int + 1              ; zvýšim hodnotu objektu o 1
 IF U.Int = _prevValue THEN       ; skontrolujem hodnotu
   ; priradenie ešte neprebehlo
 ELSE
   ; priradenie je realizované
 ENDIF 
 


Prípad, že priradenie ešte neprebehlo, je pravdepodobnejší. Čakanie na realizáciu priradenia (na jeho dokončenie) umožňuje akcia WAIT.

Súvisiace stránky:

Write a comment...