Dokumentace

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; END_VAR VAR dix, diy : DINT; END_VAR VAR rx, ry : REAL; END_VAR VAR rlx, rly : LREAL; END_VAR ADD (1, 2, 3) => výraz je stejný jako ADD_DINT. (poznámka: pokud není učeno jinak,potom konstanta 1, 2 a 3 jsou interpretovány jako typy DINT) ADD (x, y) => 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) a výsledek je 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