Narazil jsem na zajímavou vlastnost v CFC a bylo to na více místech s různými bloky. Je to jakoby nebylo přesně definovaná posloupnost volání bloků v CFC a né vždy se to chová stejně.
Viz. přiložený snímek (a ano, nemusí to tak být, ale je to pro demonstraci). Předpokládal bych, že se prvně vykoná blok SUB a až pak MOVE, ale stalo se, že tam byla přetečená hodnota, což nasvědčuje tomu, že se vykonal prvně MOVE a pak až SUB.
Podobně se stalo, že byly 2 MOVE za sebou, kde to fungovalo jako FIFO. Tam to bylo ale pro LREAL. Tam to tedy někdy fungovalo správně a někdy ne (z toho, co jsem vypozoroval, tak to bylo každé druhé volání). Tam to způsobilo, že proměnná pak obsahovala nesmysly s vysokými exponenty, ale nebylo to vždy stejné. Když jsem to přepsal do ST, tak to fungovalo bez problému.
Odpovědi 5
Když se přepnete/kliknete do okna editoru CFC a stisknete Ctrl+F2, resp. si stejnou funkci zvolíte v lokálním menu přes pravé tlačítko myši, v pravém horním rohu každé instance funkčního bloku a také u každého výstupního elementu se objeví pořadové číslo a bude z něj patrné, v jakém pořadí se zpracovávají a kdy se do proměnné zapíše. Při překreslení schématu se může pořadí změnit. Toto pořadí odpovídá tomu, jak jsou jednotlivé instrukce přepsány do textové podoby (což můžete prověřit, když si otevřete CFC soubor v běžném textovém editoru).
Zkusil jsem to nasimulovat a je to tedy opravdu jinak ta posloupnost. Jak je to možné? 😱
Přiložil jsem také část, kde byl problém s tím každým 2 voláním a tam to vypadá dobře, ale není to funkční.
Dobrý den, a je nějaké řešení - jak přehodit pořadí bloků v CFC?
Pořadí se dá ovlivnit přesunutím bloků na ploše. Zjednodušeně se dá říct, že při převodu z grafického zobrazení do textové podoby se postupuje zleva doprava a shora dolů. Zde v tomto konkrétním případě na to má vliv i využití vstupů EN pro podmíněné vykonání funkcí a funkčních bloků a jejich řetězení přes signál ENO. Zkusíme zde popsat nějaká pravidla, kterých se můžete držet při tvorbě CFC schémat.
Co se týká pořadí volání bloků, to se určuje v následujících krocích:
- Objekty se sloučí do sítí. Síť tvoří skupina propojených objektů, přičemž se nepočítají spojení přes EN/ENO, VAR_IN_OUT a zpětné vazby.
- Určí se pořadí sítí směrem shora dolů a zleva doprava. (rozhoduje nejvýše položený blok nebo výstup sítě a v případě shody, blok nebo výstup nejvíce vlevo)
- Provede se analýza EN/ENO a upraví se pořadí sítí, aby platilo, že zdroj EN jel vyřešen dřív než blok, který jím je řízen.
- Objekty v síti se řeší tak, aby byly vypočteny výstupy nejvíce vlevo a v případě shody nejvíce nahoře.
To co se stalo v případě na Screenshot 09-01-2026 16.45.24.png je to, že síť která provádí MOVE 0.0 do poc_davka se při vyhodnocování EN/ENO nepřesunula za bloky, které jsou stejným signálem EN/ENO ovládány. Očekávané pořadí by mělo jít docílit buď tím, že se MOVE[12] posune dolu (Řešení 1), nebo se místo odbočky ze signálu EN/ENO, která je za MOVE[14] protáhne z výstupu bloku MOVE[12] do vstupu OR (Řešení 2).
Řešení 1:

Řešení 2:

Co se týká resetu denních počítadel Screenshot 09-01-2026 16.46.14.png, zde bych zkusil přidat detekci náběžné hrany R_TRIG za signál Novy_den, aby nedošlo k tomu, že se provede akce více než jednou, pokud by signál trval déle než jeden cyklus.
Vaše odpověď
Pro vložení odpovědi je nezbytné být přihlášený. Pokračujte na přihlášení.
