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:
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