cz
en

Synchronizace času v regulátorech UC...

Zónové regulátory UC102, UC200 a FC… jsou vybaveny hodinami reálného času (RTC). Je sice pravdou, že časové programy jsou většinou řešeny v nadřazených procesních stanicích, ale pokud má uživatel mít možnost si týdenní časový program měnit sám přímo na ovladači, nezbývá, než povolit místní časový program.

Ten je ovšem řízen právě obvodem RTC. Místní hodiny je dobré občas synchronizovat, zejména s ohledem na to, že u nich není možnost přechodu mezi letním a zimním časem. Synchronizaci času můžeme samozřejmě provádět z programu ModComTool, ale tento způsob není příliš vhodný pro pravidelné – a nejlépe automatické – nastavování času.

V modbusové tabulce je čas uložen v paměti RAM a lze jej kdykoli přepsat. Problém ovšem bude s formátem, v této podobě se čas nikde v PLC nevyskytuje:


Část modbusové tabulky s RTC

Pro úspěšnou synchronizaci bychom měli postupovat asi takto:

  • použít reálný čas z PLC, ideálně synchronizovaný z NTP serveru
  • jednou za nějakou dobu (hodina, den…) aktuální čas převést na výše popsaný formát
  • tento údaj zapsat do každého regulátoru na sběrnici.

První bod lehce splníme nastavením NTP klienta v PLC a navázáním na místní či vzdálený NTP server, viz též zde: https://www.domat-int.com/cs/jak-nastavit-mistni-ntp-server.

V modbusové tabulce se dočteme, že pro úspěšný zápis do registrů RTC je nutné před zápisem povolit zápis nahozením prvního bitu ve wordovém reg. 3 (registr Status LSB). Pro povolení budeme tudíž potřebovat binární proměnnou pro zápis coilu funkcí F15 do bitového registru 33 (přeskočí se 2 × 16 bitů v registrech 1 a 2, tedy počáteční prvek je 33. bit celé tabulky).

Pro zápis je nutné nahození povolovacího bitu

Pro převod času bude nejsnazší připravit blok v jazyce ST, např.:

FUNCTION_BLOCK UCTimeSync
    VAR
        s, m, h, d, dow, mm : sint;
        y, i : int;
        sync, write : bool;
        totalsecs : lint;
        trigger:R_TRIG;
        toff:TOF;
        uctimearr : array [0..7] of byte;
    END_VAR
    VAR_INPUT
        trig : bool;
    END_VAR
    VAR_OUTPUT
        writeena: bool;
        uctime : ulint;
    END_VAR
    trigger(CLK:=trig,Q=>sync);
    if sync then
        write := true;
        LIB.CORE.V1_0.B99_PCTIMENODE(LOCAL:=TRUE, SEC=>s,MIN=>m, HOUR=>h, DAY=>d, WDAY=>dow, MON=>mm, YEAR=>y);
        uctimearr[7]:= to_byte(to_bcd_byte(y - 2000)); // year
        uctimearr[6]:= 0;        
        uctimearr[5]:= to_bcd_byte(d); // date
        uctimearr[4]:= to_byte(to_bcd_byte(mm)); // month
        uctimearr[3]:= to_bcd_byte(h); //
        uctimearr[2]:= to_bcd_byte(dow + 1); // day of week
        uctimearr[1]:= to_bcd_byte(s);// s
        uctimearr[0]:= to_bcd_byte(m); // m
        uctime := to_ulint(uctimearr[0]);
        for i := 1 to 7 DO
            uctime := uctime * 256;
            uctime := uctime + to_ulint(uctimearr[i]);
        end_for;
     end_if;
     toff(IN:=write,PT:= t#1s,Q=>writeena);
     write := false;
END_FUNCTION_BLOCK

Převod času se aktivuje náběžnou hranou na vstupu trig. Výstupem je impuls pro povolení zápisu (writeena) a proměnná uctime typu lint s převedeným aktuálním časem PLC podle tabulky výše. Pro uctime by bylo elegantnější zvolit osmibajtové pole, ale u proměnné typu pole není možné v komunikačním driveru nastavit zápis pouze při změně hodnoty. Typ lint má 8 bajtů, tedy přesáhne všechny čtyři registry 49…52, které obsahují údaj o aktuálním čase.

Zápis na sběrnici probíhá standardním způsobem pomocí dvou skupin v prototypu:

Nastavení pořadí skupin

Všimněme si pořadí řazení skupin do driveru. Nejprve musí proběhnout povolení zápisu (výchozí pořadí 0) a pak teprve vlastní zápis (pořadí 1). Podrobnosti k Modbus driveru a řazení telegramů do fronty najdeme zde: https://www.domat-int.com/cs/domat-modbus-driver-a-jeho-optimalizace

Každý regulátor musí mít vlastní naadresovaný prototyp. V aktuální verzi firmwaru nejsou broadcastové zápisy s linkovou adresou 0 podporovány.

Nakonec zajistíme pravidelnou synchronizaci pomocí náběžné hrany na vstupu trig synchronizačního bloku. Ta může být vyvolána časovým programem nebo zdrojem impulsů, vhodnější je časový program se synchronizací 1× denně po 3. hodině ráno, aby došlo ke korektnímu přechodu mezi letním a zimním časem.

Časový program pro vyvolání synchronizace

Samozřejmě stačí jeden společný funkční blok pro všechny IRC regulátory.

Kompletní projekt s příkladem je ke stažení zde:

Soubory ke stažení

velikost 522 KB