26.3.2024

D2000 a práca s časom, časť 2

Z pohľadu prechodov zimný-> letný -> zimný čas sú zaujímavé periodické deje. Čo znamená každých osem hodín ? Pri prechode na letný čas je to 0:00, 8:00, 16:00 alebo 0:00, 9:00, 17:00? Čo je dobre?

Pred tým, ako zodpovieme túto otázku, poďme sa pozrieť, ako je reprezentovaný čas v D2000.

 

D2000 - reprezentácia času

 

Čas v D2000 je reprezentovaný typom Long_Float –čo je 8 bajtové reálne číslo s presnosťou 15 číslic. Interne je presnosť obmedzená na 1 [ms] – vo všetkých procesoch.

 

Jeho hodnota je počet sekúnd, ktoré uplynuli od „cca 1970“ – presný dátum nie je dôležitý a v budúcnosti môže byť (z dôvodu zachovania presnosti na 1 ms) zmenený. Vnútorne je teda čas v D2000 monotónne rastúci a pri zmene zimného a letného času neskáče hore/dole.  Užívateľ ale spravidla potrebuje časové údaje zobrazené v lokálnom čase podľa nastavenia operačného systému, aplikácie a prípadne štartovacích parametrov (detaily budú uvedené ďalej).

 

Každá hodnota v aplikácii D2000 má priradenú časovú značku. Je možné ju zistiť ako hodnotu atribútu lokálnej premennej, objektu zo systému alebo položky štruktúry (napr. _locVar\TIM). Každá aplikácia má k dispozícii zoznam preddefinovaných časových objektov, ktoré poskytujú jednotlivé zložky systémového času.

 

time9.png

Obr 9: zoznam preddefinovaných časových objektov v D2000

 

D2000 - implementácia časových pásiem

 

Každý proces D2000 beží v nejakom časovom pásme. Toto je dané umiestnením klienta (parameter preberaný z operačného systému), ktoré je možné v prípade procesu HI preťažiť explicitným zadaním s použitím štartovacieho parametra /TZ. Navyše je možné parametrom aplikácie UseServerTimeZone globálne vnútiť použitie časového pásma D2000 Servera a ignorovanie nastavenia operačného systému ako aj parametra /TZ.

 

time10.png

Obr 10: hodnota objektu SysTime zobrazená v dvoch rôznych časových pásmach.
Fialové HI má explicite zadanú časovú zónu s časovým offsetom 3 hodiny.

 

D2000 – funkcie pre prácu s časom a intervalmi

 

Všetky funkcie D2000, ktoré pracujú s lokálnym časom, majú aj voliteľný parameter timeZone, pomocou ktorého je možné zmeniť časový offset. Ak sa parameter nezadá, automaticky sa použije %GetTimeZone (časové pásmo platné pre proces, v ktorom sa funkcia vyhodnocuje – t.j. HI, EVENT alebo CALC).

 

Funkcia %AddIntervalLocal slúži na pripočítanie časového intervalu v lokálnom čase.
Funkcia pripočíta relatívny čas (môže byť aj záporné číslo) k absolútnemu. Výsledok nebude ovplyvnený skutočnosťou, či v tomto intervale boli alebo neboli časové prechody. Napríklad pripočítaním 3 hodín k 1 hodine ráno bude vždy dávať výsledok 4 hodiny ráno.
Poznámka: funkcie %AddTime (starý názov %AddTimeT) a %SubTime (starý názov  %SubTimeT) sú interne implementované rovnako ako %AddIntervalLocal .

 

Funkcia %AddIntervalMono slúži na pripočítanie časového intervalu v monotónnom čase.
Funkcia pripočíta relatívny čas k absolútnemu. Výsledok bude ovplyvnený skutočnosťou, či v tomto intervale boli alebo neboli časové prechody. Napríklad pripočítanie 3 hodín k 1 hodine ráno môže dávať na Slovensku výsledok 3 hodiny (prechod na zimný čas), 4 hodiny (bežný deň) alebo 5 hodín (prechod na letný čas).

 

Funkcia %NewTime (starý názov %NewTimeT ) k absolútnemu času pripočíta relatívny čas vyjadrený ako počet rokov, mesiacov, dní, sekúnd. Funkcia pracuje s lokálnym časom.

 

Funkcia %SubTimesLocal odčítava od seba dva absolútne časy. Výsledok nebude ovplyvnený skutočnosťou, či v tomto intervale boli alebo neboli časové prechody. Napríklad rozdiel medzi 4 a 1 hodinou ráno je vždy 3 hodiny.

 

Funkcia %SubTimesMono odčítava od seba dva absolútne časy. Výsledok bude ovplyvnený skutočnosťou, či v tomto intervale boli alebo neboli časové prechody. Napríklad rozdiel medzi 4 a 1 hodinou ráno môže byť na Slovensku 2 hodiny (prechod na letný čas), 3 hodiny (bežný deň) alebo 4 hodiny (prechod na zimný čas).

 

D2000 – operácie s časom vo výrazoch

 

time11.png

Obr 11: operátory, typy hodnôt a výsledky operácií pri práci s časom

 

Operátory porovnania fungujú podľa intuície (novší čas je väčší ako starší).

 

Pričítavať k absolútnemu času je možné celé alebo reálne číslo a výsledok je opäť absolútny čas (a pričítava sa v lokálnom čase).

 

Odčítavať je možné dva absolútne časy (výsledok je počet sekúnd medzi nimi – pozor, v monotónnom čase, t.j. výsledok závisí od toho, či bol v tomto intervale časový prechod).

 

Od absolútneho času je možné odčítať celé alebo reálne číslo a výsledok je opäť absolútný čas (odčítava sa v lokálnom čase, takže operácia je inverzná k pričítaniu).

 

D2000 – čas hodnôt vo výrazoch

 

Výpočet výrazu nastavuje výslednej hodnote časovú značku rovnú aktuálnemu času. Majme ESL skript:

 

INT _i
TIME _b, _e
REAL _duration
_b := 1
; ... nejaká činnosť
_e := 1
_duration := _e\TIM - _b\TIM; trvanie “nejakej činnosti” v [s]

 

Zapamätaním si času začiatku (časová značka premennej _b po priradení  1) a času konca (časová značka premennej _e) a odčítaním časových značiek je možné zistiť (s presnosťou časovej značky, t.j. na 1 ms), koľko trvalo vykonávanie ESL skriptu.

 

D2000 – práca s periódou

 

Funkcia %NextTime (starý názov %NextTimeT) vracia hodnotu nasledujúcej časovej značky od aktuálneho času, ktorá je daná periódou a offsetom.  Funkcia pracuje s lokálnym časom.

 

Pozor na periódy, ktorými sa nedá celočíselne deliť deň. Napríklad:
Perióda = 16 [h]
Offset = 1[s]
funkcia bude dávať časy 00:00:01, 16:00:01, 08:00:01, 00:00:01 podľa obrázku.

 

time12.png

Obr 12: ak deň nie je celočíselným násobkom periódy,
funkcia %NextTime bude v rôzne dni dávať rôzne výsledky

 

Pokiaľ sa definuje perióda v konfigurácii periodického počítaného bodu, štatistického archívneho objektu alebo periodického vypočítaného archívneho objektu, je nutné, aby deň bol jej celočíselným násobkom. Takže periódy 1 h, 2 h, 3 h, 4 h, 6 h alebo 30 min sú v poriadku, periódy 5 h alebo 35 min nebudú akceptované.

 

Konfigurácia periódy obsahuje aj možnosť voľby lokálneho času alebo monotónneho času. Od toho závisí, či bude výpočet vždy o tej istej hodine lokálneho času (napr. 0,8,16,0 pre 8-hodinovú periódu) alebo v prípade monotónneho času v lete o hodinu neskôr ( 1,9,17,1 pre 8-hodinovú periódu).

 

Funkcia %NextMonth vráti čas začiatku nasledujúceho mesiaca (od aktuálneho času) posunutý o zadaný offset.  Funkcia pracuje s lokálnym časom.

 

D2000 – prevody medzi UTC časom a „lokálnym časom“

 

D2000 ponúka niekoľko funkcií, ktoré umožňujú prevádzať medzi UTC a lokálnym časom. Konverzia nutne potrebuje byť informovaná o časovom pásme, z/do ktorého prevod vykonáva, preto funkcie takisto používajú parameter timeZone.

 

Funkcia %StrToTimeEx konvertuje text na absolútny čas. Príklad:

%StrToTimeEx("17:03:16 18-03-17", "hh:mi:ss dd-mm-rr")

 

Pokiaľ je čas nejednoznačný (doba medzi druhou a treťou hodinou pri prechode na zimný čas), vracia funkcia neskorší čas (zimný). Rozlíšiť „prvú“ a „druhú“ 2. hodinu je možné zápisom A2 a B2. Napríklad čas A2:05:30 bude prevedený ako letný čas.

 

time13.png

Obr 13: reťazce použiteľné vo formáte funkcie %StrToTimeEx

 

Funkcia %TimeToStrEx konvertuje čas na text. Maska podporuje syntax podľa Obr 13, navyše umožňuje konvertovať meno dňa na text prostredníctvom slovníka (tt, ttt, tttt).

 

time14.png

Obr 14: masky pre konverziu názvu dňa na text s použitím slovníka

 

Funkcia %TimeFromItems umožňuje previesť lokálny zložkový čas (rok, mesiac, deň, hodina, minúta, sekunda, milisekundy) na absolútny čas.

 

Funkcie %Year, %Month, %Day ,%Hour, %Min, %Sec, %MSec naopak umožňujú vyextrahovať z absolútneho času príslušnú zložku.

 

D2000 – práca s relatívnym časom

 

Relatívny čas je reálne číslo, ktoré udáva trvanie intervalu (v sekundách). Relatívny čas teda nezávisí od časového pásma ani od letného času.

 

Na prevod do textovej formy slúži funkcia %RelTimeToStr (starý názov %RTToStr):

TEXT %RelTimeToStr(TIME in _time, TEXT in _mask)
%RelTimeToStr(86400+7200+120+2, "ddd hh:mi:ss.mss")

 

Opačný prevod textu na relatívny čas vykonávajú funkcie %StrToRelTime (text musí zodpovedať maske “ddd hh:mm:ss”) a  %StrToRelTimeEx (maska je parametrizovateľná):

REAL %StrToRelTimeEx(TEXT in _time, _mask)
%StrToRelTimeEx ("156 14:23:25","ddd hh:mi:ss")

 

D2000 – iné funkcie pre prácu s časom

 

Zistenie poradového čísla týždňa (1-53) umožňuje funkcia %WeekNr. Pre 1. január vracia hodnotu 1.

 

Podobná je funkcia %WeekOfYear, ktorá ale rešpektuje kalendárnu definíciu (prvý týždeň je ten, v ktorom sú aspoň 4 dni v tomto kalendárnom roku). Napr. rok 2012 začínal v nedeľu, ktorá patrila do 52. týždňa, a končil týždňom 24-30.12 (ktorý bol 52.) a pondelok - Silvester 31.12.2012 patril už do 1. týždňa nasledujúceho roku.

 

Funkcia %WeekStartTime vracia čas začiatku týždňa so zadaným poradovým číslom (viď funkcia %WeekNr). Napr. prvý týždeň roku 2012 sa začal 26.11.2011.

 

Prevod medzi časom a textom bez zohľadnenia letného času (DST) umožňujú funkcie %TimeToStrMono  a %StrMonoToTime.  Obidve umožňujú zadanie časového offsetu (v sekundách) času oproti UTC. 

 

Funkcia %LocalToMonoTime vráti hodnotu typu Absolútny čas. Táto je v zimnom období zhodná s hodnotou vstupného parametra. Pre letný čas je zadaná hodnota zmenšená o 1 hodinu.

 

Funkcia %ModTime vracia zvyšok absolútneho času po delení dĺžkou časového intervalu (relatívny čas). Výsledkom je hodnota typu Relatívny čas.

 

D2000 – čas pri práci s databázou

 

S databázou cez ODBC alebo OCI rozhranie komunikuje proces DbManager pomocou formátu v zložkovom čase. Spôsob konverzie na jednotlivé zložky a zohľadnenie  časových pásiem a DST je možné nastaviť na objekte typu Databáza:

 

time15.png

Obr 15: nastavenie lokálneho alebo monotónneho času
(s definovaným offsetom v hodinách) na objekte typu Databáza

 

D2000 – CSV exporty a importy

 

Akcie IMPORT_CSV a EXPORT_CSV slúžia na import resp. export dát z/do CSV súborov. Pokiaľ sa importujú/exportujú aj časové značky, prípadne hodnoty typu absolútny čas, tak parametrom bMonoTimes je možné špecifikovať, či konverzia prebieha v lokálnom čase (so zohľadnením DST) alebo lokálnom monotónnom čase. Časový offset sa nastaviť nedá – použije sa aktuálne časové pásmo.


Ak sú CSV súbory použité na prenos medzi D2000 a inými systémami, odporúčame použitie monotónneho času – odpadnú tak problémy s nejednoznačnými časmi pri prechode letného času na zimný.

 

D2000 – čas v komunikácii

 

Pokiaľ komunikačný protokol nepodporuje prenos času (napr. Modbus), tak časovú značku hodnote z komunikácie priraďuje KOM proces automaticky.

 

Pokiaľ komunikačný protokol prenos času podporuje, tak konfigurácia objektu typu Stanica určuje, či sa použije čas z komunikácie, alebo časovú značku pridelí KOM  (parameter „Použi čas komunikačného počítača“).

 

Pokiaľ  sa použije čas z komunikácie, je možné konfigurovať, či má byť chápaný ako lokálny (s DST) alebo monotónny s definovaným časovým offsetom (parameter „Použi monotónny čas UTC+“). Podobne aj čas hodnôt výstupných meraných bodov zapisovaných KOM procesom je pri zápise prevedený na príslušný typ (lokálny alebo monotónny) podľa tejto konfigurácie.

 

Niektoré protokoly (OPC, IEC104) umožňujú aj prenos príznaku validity času. Ak je čas hodnoty označený ako neplatný, časovú značku hodnotám z komunikácie opäť pridelí KOM proces.

 

Niektoré protokoly podporujú aj prenos príznaku letného času (napr. IEC101, IEC104 – viď príznak „SU“ - SUmmer v Obr 10 na konci prvej časti blogu o IEC101). V prípade, že je objekt typu Stanica nakonfigurovaný na použitie lokálneho času, sa protokolový príznak použije na rozlíšenie letného a zimného času v prípade nejednoznačnej 2. hodiny pri prechode letného času na zimný. V prípade konfigurácie v monotónnom čase sa príznak ignoruje.


Pozor – odporúčame nespoliehať sa na tieto príznaky, ale pokiaľ je možné, konfigurovať komunikácie v monotónnom čase – odpadnú tak problémy spôsobené prechodom časov. Nie každý systém totiž implementuje tieto príznaky korektne – máme skúsenosť so starším systémom ABB Microscada, ktorý v IEC104 protokole posielal nastavený príznak „SU“ bez ohľadu na letný či zimný čas.

 

time16.png

Obr 16: časové parametre v konfigurácii objektu typu Stanica

 

Obr 16 ukazuje okrem konfigurácie časových značiek a lokálneho/monotónneho času aj konfiguráciu parametrov pollingu (ako často sa majú čítať hodnoty meraných bodov tejto stanice z komunikácie). Polling môže byť s udanou periódou (na rozdiel od periodických výpočtov môže byť perióda ľubovolná) alebo s oneskorením (oneskorenie je definované ako čas medzi skončením jedného čítania hodnôt a začiatkom ďalšieho). Dlhšie trvanie čítania hodnôt teda neovplyvní čas následného čítania pri konfigurácii s udanou periódou, ale posunie čas následného čítania pri konfigurácii s oneskorením.

 

Pokiaľ komunikačný protokol podporuje aj časovú synchronizáciu (napr. IEC104, BACnet, ESC8816), je možné nakonfigurovať aj túto. Časová značka sa bude posielať v lokálnom alebo monotónnom čase podľa parametra „Použi monotónny čas UTC+“, aby bola v zhodnom formáte ako čítané a zapisované hodnoty.

 

Konfigurácia logického dňa v D2000 HI

 

Pokiaľ užívateľ v procese D2000 HI pracuje s dialógom pre výber časového intervalu, môže chcieť od systému rôzne špeciality. Napríklad:

  • aby sa mu pri výbere celého dňa alebo viacerých dní neoznačil čas od nultej hodiny (prednastavená hodnota) ale napr. od šiestej (tzv. plynárenský deň)
  • aby sa mu zobrazil deň od nultej sekundy prvého zvoleného dňa poslednej sekundy posledného zvoleného dňa (napr. 1.1. 00:00:00 – 5.1. 23:59:59) alebo až do do nultej sekundy ďalšieho dňa (napr. 1.1. 00:00:00 – 6.1. 00:00:00).

Na nastavovanie začiatku a konca tzv. logického dňa slúžia parametre D2000 Server-a day_start_hour, day_start_min, day_end_hour, day_end_min a na zahrnutie prvej sekundy ďalšieho dňa parameter day_end_strong_ineq.

 

time17.png

Obr 17: dialóg pre výber časového úseku pri nastavenom logickom dni od 6 do 30 hodiny (tj. do 6 hodiny ďalšieho dňa). Pri označení 1.1.2018 až 4.1.2018 myšou v kalendári sa v zadávacích poliach vyplní 1.1.2018 06:00 – 5.1.2018 6:00

 

Tieto parametre je možné zadávať aj pri užívateľsky riadenom otváraní dialógového okna na výber časového intervalu zo skriptu schémy pomocou funkcie %HI_SelectTimeDialog.

 

Záver

 

Téma práce s časom v systémoch reálneho času je pochopiteľne bohatá. Tento článok sa snažil o prehľad možností D2000 z pohľadu užívateľa – konfigurátora systému. Vždy je potrebné mať na pamäti, s akým typom času pracujeme (lokálny/monotónny) a do akého typu ho chceme dostať pre potrebu užívateľa, iného systému, komunikačného partnera či databázy. Pestrosť témy je daná tým, že užívateľ väčsinou chce vidieť dáta v lokálnom čase včítane časového posunu v dôsledku letného času, ale pre riadiaci systém je výhodnejšie pracovať s monotónnym časom, ktorý je jednoznačný a neposkakuje. Rozhrania na okolie (export do textových súborov, databázy, komunikácie) musia ponúkať obe alternatívy.

15,1.2018, Ing. Peter Humaj, www.ipesoft.com

 

Iné blogy