Vyhodnocování výrazů z pohledu číselných typů

Odvozovací pravidla jsou pravidla, které pomáhají určit konkrétní verzi přetížené funkce (s generickými parametry) ve výrazu.

Vzhledem k tomu, že standardní ST nepodporuje přetížené funkce definované uživatelem, nejsou k dispozici žádné ST vzory k jejich popisu. Proto budeme používat C-notaci.

Příklad

ADD(ANY_MAGNITUDE, ANY_MAGNITUDE, ... ) => ANY_MAGNITUDE

Přetížené funkce mohou být určeny výrazem, to znamená že existují pravidla, jak určit, které negenerické typy budou použity pro parametry funkce.

Příklad

ADD_INT(INT, INT, ... ) => INT

Cílem pravidel je určit vhodnou funkci pro výraz určený hodnotou partikulárních hodnot argumentů.

Příklad

VAR 
    ix, iy : INT; 
    dix, diy : DINT; 
    rx, ry : REAL; 
    rlx, rly : LREAL; 
END_VAR 
 
ADD (1, 2, 3) => the expression is the same as ADD_DINT. (note: if not specified otherwise then the 1, 2, 3 constants are interpreted as DINT types) 
ADD (ix, iy) => ADD_INT 
ADD (rx, ix) => ADD_REAL 
ADD (ix, diy, rlx) => ADD_LREAL 

Odvozovací proces jde zhruba tímto způsobem:

  1. Argumenty na přetížené funkce musí patřit do obecných kategorií typu odpovídajících parametrům přetížené funkce.
  2. Parametry funkce jsou seskupeny podle svých obecných kategorií typu (označme je p-skupina)
  3. Pro každou p-skupinu určíme nejvíce přesný typ (označme je c-skupina), která může pojmout hodnoty všech argumentů současně, a že bude typem použitým ke generickým parametrům typu p-skupiny.
  4. Pro všechny argumenty z p-skupiny se očekává, že budou implicitně převedeny na typy c-skupina a jsou převedeny do tohoto typu dříve, než se zavolá vlastní funkce.

Příklad

ve výrazu

ADD (ix, diy, rlx)

je jedna p-skupina s generickým typem ANY_MAGNITUDE ve funkci ADD, a parametry IN1, IN2, IN3 patří do něj i odpovídající argumenty IX, DIY a RLX. Proto c-skupina je určena jako typ LREAL. V důsledku výše uvedeného výraz je ekvivalentní výrazu:

ADD_LREAL(ix, diy, rlx) and result is LREAL

Příklad

MUX(K := dix, IN0 := rx, IN1 := dix)

Jsou tu dvě p-skupiny, ANY_INT a ANY. Parametr K patří do první skupiny a IN0, IN1 do druhé jmenované. Proto c-typ ANY_INT skupiny je DINT a ANY je c-typ REAL. V důsledku výše uvedeného je výše uvedený výraz ekvivalentní výrazu:

MUX_DINT_REAL (K := dix, IN0 := rx, IN1 := dix) a výsledek je REAL
  • © Energocentrum Plus, s.r.o. 2017 - 2024