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:
Pro úspěšnou synchronizaci bychom měli postupovat asi takto:
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: