Programové řešení přechodu na zimní/letní čas



Podobné dokumenty
Beznárazové přepnutí aplikace

Alternativní použití analogových vstupů

Měření teploty a odporu

Využití přebytků energie z FVE

Komunikace AMREG s řídicími systémy AMiT (DB-Net)

Práce s textovými proměnnými v DetStudiu

Nahrávání image flash do jednotek APT81xx, PPC81xx

Provozní deník v řídicích systémech

KS-VARIOLF Komunikační rozhraní

KS-28T Kamerový systém

KS-VARIO LF2-2 Kamerový systém

KNIHOVNA LETNI_CAS. edice verze 1.0. Knihovna letni_cas. Ing. Zdeněk Rozehnal MICROPEL s.r.o. 2008

AS-28T. Audio systém. Historie verzí. Verze as-28t_v_cz_101.doc

Komunikace AMREG v síti MODBUS TCP

XPE91B Windows XP Embedded pro jednotku AP9NW800L0G1

Komunikace v síti M-Bus

ISC-TRIOSEA Informační systém

Průmyslový ethernetový switch bez PoE

Komunikace v síti LON

KS-28T Kamerový systém

AS 28T Audio systém pro 28T

DetStudio - výpis aplikace. Obsah Poznámky k procesní stanici

KS-VARIOLF Komunikační rozhraní

KS-28T Kamerový systém

Komunikace v síti MP-Bus

LZ77 KNIHOVNA PRO KOMPRESI A DEKOMPRESI DAT POMOCÍ ALGORITMU LZ77. Příručka uživatele a programátora

TP /b P - POPIS ARCHIVACE TYP Měřič INMAT 57 a INMAT 57D

PCKEYB JEDNOTKA PRO OBSLUHU KLÁVESNICE TYPU PC AT. Příručka uživatele a programátora

Instrukce pro montáž, obsluhu a údržbu

Komunikace v síti ARION definice tabulkou

Vlastnosti dokumentu/stránky

Firemní aplikace pro nástěnný ovladač AMR-OP60. Aplikace disponuje automatickým přepínáním zobrazení vnitřní / venkovní teploty.

Rozšiřující modul s protokolem MODBUS

ISC-TRIOSEA Informační systém

udspt10r JEDNOTKA IMPLEMENTUJÍCÍ DISPLEJ VZDÁLENÉ VARIANTY TERMINÁLU TERM10 Příručka uživatele a programátora

OVLÁDÁNÍ FAN COIL JEDNOTKY 02

SNAPARC Stahování archivů z řídicích stanic

2015 GEOVAP, spol. s r. o. Všechna práva vyhrazena.

BASPELIN CPL. Popis obsluhy regulátoru CPL CER01

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

Knihovna WebGraphLib

DM-GSM2 Modem pro síť GSM

Uživatelská příručka

ACASYS-KS Komunikace v systému ACASYS

HROMADNÉ ÚPRAVY NAJÍT A NAHRADIT

PA152. Implementace databázových systémů

Návody na montáž, obsluhu a údržbu

AMR-DI2RDO2 Podomítkový modul

Doporučená obsluha I/O

umenugr JEDNOTKA PRO VYTVÁŘENÍ UŽIVATELSKÝCH GRAFICKÝCH MENU Příručka uživatele a programátora

Komunikace v síti GSM/GPRS

Knihovna XmlLib TXV druhé vydání říjen 2012 změny vyhrazeny

POKOJOVÁ JEDNOTKA S MODULAČNÍM PROGRAMOVATELNÝM REGULÁTOREM

LookDet Dispečerský systém Uživatel

Skriptování v DetStudiu

Knihovna GalaxyLib TXV druhé vydání srpen 2012 změny vyhrazeny

Knihovna XmlLib TXV první vydání prosinec 2010 změny vyhrazeny

Plc Calculator. Nástroj pro automatizovaný návrh aplikace s automaty MICROPEL

Tiskový manažer Printman (Tiskový manažer verze 1.58 a novější)

Knihovna EpsnetLib TXV první vydání září 2012 změny vyhrazeny

EvMO postup při instalaci

Nový způsob práce s průběžnou klasifikací lze nastavit pouze tehdy, je-li průběžná klasifikace v evidenčním pololetí a školním roce prázdná.

POKOJOVÁ JEDNOTKA S MODULAČNÍM PROGRAMOVATELNÝM REGULÁTOREM

Assembler - 5.část. poslední změna této stránky: Zpět

DataLab LCD. Panelové LCD monitory s dotykovou obrazovkou

Průvodce programováním AMiNi-E jazykem STL Dipl. Ing. Pavel Votrubec

Provozní pokyny Aplikační stránky

PALSTAT s.r.o. systémy řízení jakosti PALSTAT CAQ verze Mezioperační kontrola 07.1/ Obsah

KARTA ŘADIČE DCF A GPS ME3

BASPELIN CPM EQ21. Popis obsluhy ekvitermního regulátoru CPM EQ21

Komunikace v síti Ethernet

DataLab LCD Panelové LCD monitory s dotykovou obrazovkou

Průvodce hladkého přechodu na jinou sazbu DPH

Tiskový manažer - Printman

PALSTAT s.r.o. systémy řízení jakosti PALSTAT CAQ verze Výstupní kontrola 07.1/ Obsah

Systémové elektrické instalace KNX/EIB (13. část) Ing. Josef Kunc

Portál farmáře Tisk map v LPIS Podklady pro školení Říjen 2010

MANUÁL ADMINISTRÁTORA. k aktivaci online testování na stránce

Principy operačních systémů. Lekce 7: Obrana proti deadlocku

Prezentace (Presentation) - ECDL / ICDL Sylabus 6.0

ovládat kompaktní pohon ILx pomocí M221 přes RS-485 s ASCII.

BASPELIN CPL. Popis obsluhy ekvitermního regulátoru CPL EQ23/EQ24

DM-MB2ET/A Komunikační převodník M-Bus na Ethernet

Vývoj řízený testy Test Driven Development

Knihovna RecDBXLib ZÁZNAMY V DATABOXU TXV

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Helios RED a Elektronická evidence tržeb (Helios RED verze 10)

SEKVENČNÍ LOGICKÉ OBVODY

Nové funkcé programu TRIFID 2015

1. Elektronická hlášení a objednávky

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

REG10. návod k použití. záznamová jednotka stavů logických vstupů CBF

Algoritmizace a programování

6 Příkazy řízení toku

Knihovna SolarMonitorLib

Programovatelná řídící jednotka REG10. návod k instalaci a použití 2.část. Řídící jednotka regulace podtlaku TPR

Zóny a pravidla UŽIVATELSKÁ PŘÍRUČKA

SČÍTAČKA, LOGICKÉ OBVODY ÚVOD TEORIE

Popis změn kontrolní hlášení

Knihovna DataBoxLib TXV první vydání prosinec 2010 změny vyhrazeny

Transkript:

AP0022 APLIKAČNÍ POZNÁMKA Programové řešení přechodu na zimní/letní čas Abstrakt Aplikační poznámka řeší automatický přechod na zimní/letní čas. Autor: Zbyněk Říha Dokument: ap0022_cz_02.pdf Příloha Obsah souboru: - - Není Copyright (c) 2009, AMiT, spol. s r.o. www.amit.cz 1/9

Obsah Historie revizí...3 Související dokumentace...3 1. Automatická změna zimního/letního času...4 1.1. Příklad řešení 1...4 1.2. Příklad řešení 2...5 1.3. Princip činnosti navrhovaných řešení...6 1.4. Výhody a nevýhody obou řešení...6 1.5. Funkční blok pro přechod letní/zimní čas...7 2. Technická podpora...8 3. Upozornění...9 ap0022_cz_02 2/9

Historie revizí Verze Datum Změny 001 3. 12. 2008 Nový dokument 002 17. 12. 2009 Změna názvu funkčního bloku Související dokumentace 1) Nápověda k návrhovému prostředí DetStudio soubor: DetStudioHelp.chm 3/9 ap0022_cz_02

1. Automatická změna zimního/letního času Řešení automatické změny času je individuální záležitostí, kde je možné, v několika fázích návrhu algoritmu, vybrat ze dvou různých řešení. Polovina uživatelů bude přesvědčena o správnosti jednoho řešení a druhá polovina upřednostní druhé. To je důvod, proč jsme upustili od záměru integrovat řešení problematiky zimního/letního času přímo do operačního systému nebo do funkčního modulu a rozhodli jsme se řešení nechat na autorovi aplikace, aby sám mohl rozhodnout o tom, jaké řešení mu vyhovuje. Jako návod a inspiraci nabízíme níže uvedené příklady. Uveďme některé ze zmiňovaných problémů: Bez ohledu na to, jakou zvolíte metodu (jestli udržujete interní čas jako UTC a měníte offset pro výpočet lokálního času nebo udržujete interní čas jako lokální čas a udržujete si příznak, jestli je to čas zimní nebo letní) musíte si někde mimo hodinový obvod (v datech aplikace) udržovat určitý dodatečný údaj (offset nebo příznak zima/léto). To dělá problémy při zavedení aplikace (nové nebo upravené), kdy tento dodatečný údaj nemá platnou hodnotu. Další problém je, chceme-li zajistit (což zpravidla chceme), aby systém správně přešel na zimní/letní čas jak v případě, že byl v okamžiku změny času v chodu, tak v případě, že byl v okamžiku změny času vypnut. Další problém nastává na systémech, kde má probíhat automatická změna letního/zimního času a zároveň existuje možnost ručního nastavení data a času uživatelem. Pokud uživatel změní ručně datum z 15. 3. na 15. 4., má se okamžitě přepnout na letní čas tj. přičíst hodinu? Polovina lidí odpoví ano, polovina odpoví ne. A co když uživatel změní ručně čas z 1:05 na 4:05 zrovna v tu neděli, kdy probíhá změna času? Má se okamžitě přičíst/odečíst hodina, tj. nastavit čas o hodinu posunutý oproti tomu, co uživatel právě zadal? Zde patrně každý odpoví ne, že by se nově zadaný údaj měl respektovat a považovat za údaj v rámci nového (zimního/letního) času. Přitom rozlišit ruční změnu času od normálního plynulého chodu hodin je programově velmi obtížné, nestačí pravidelné čtení hodin a vyhodnocení okamžiku přechodu s následnou úpravou. Bylo by nutné se přímo systémově navázat na událost ruční změny času a obsluhovat ji jiným algoritmem, než změnu způsobenou chodem hodin obejít standardní periodickou kontrolu časového údaje. K tomu ovšem v DetStudiu prakticky nejsou k dispozici potřebné prostředky. S ručním zadáváním času souvisí další problém zpravidla se požaduje, aby se systém definovaně vypořádal se situací, kdy uživatel zadá neplatný časový údaj (např. 28. 3. 2008, 02:30:00 je neplatný údaj, protože ve 02:00 se změnou na letní čas hodiny posunuly na 03:00 a čas 2:30 v tomto dni jednoduše neexistuje). Zadání takovéhoto neplatného údaje je chybou uživatele, ale je pochopitelným požadavkem, aby takováto chyba nezpůsobila systému závažné problémy. Jak přesně se ovšem má reagovat, je otázkou osobního přístupu. Nakonec je potřeba zvážit i to, zda zákon (resp. vyhláška) definující algoritmus pro datum změny (poslední neděle v březnu / poslední neděle v říjnu) bude platit dlouhodobě, nebo zda dojde v nějaké podobě ke sjednocení Evropy s USA, kde je datum jarního přechodu druhá neděle v březnu a datum podzimního přechodu je první neděle v listopadu. 1.1. Příklad řešení 1 Nabízíme Vám následující popis algoritmu, na kterém je možné vidět jeden ze způsobů řešení. Program vytvoříme takto: //Zjištění aktuálního času v řídicím systému GetTime RTC_time, RTC_slozky, NONE //Převod na čas Azorských ostrovů (přechod zima/léto nastává o půlnoci) Let UTC_time = if(@tmletnicas, RTC_time - 10800, RTC_time - 7200) //Převod časi z formátu DB-Net na složky ParseTime UTC_time[0,0], NONE, NONE, UTC_slozky ap0022_cz_02 4/9

//Na základě jednotlivých složek zjistíme, zda je zimní nebo letní časové období Let @tmleto = ((UTC_slozky[4, 0] > 3) and (UTC_slozky[4, 0] < 10) or (UTC_slozky[4, 0] == 3) and ((UTC_slozky[3, 0] + 7) - UTC_slozky[6, 0] > 31)) or (UTC_slozky[4, 0] == 10) and ((UTC_slozky[3, 0] + 7) - UTC_slozky[6, 0] <= 31) //Po zavedení aplikace se v prvním průchodu procesem tato část neporovede If @tmletoinit, :NONE EndIf //Zjištění, zda došlo k přechodu mezi letním / zimním časem Let @tmzmena = @tmleto xor @tmletnicas If @tmzmena, :NONE EndIf //V případě, že došlo k přechodu, získáme aktuální čas a posuneme jej GetTime RTC_time, NONE, NONE Let RTC_time = if(@tmleto, RTC_time + 3600, RTC_time - 3600) //posunutý čas zapíšeme zpět do řídicího systému SetTime RTC_time //Pomocná proměnná pro vyhodnocování přechodu mezi letním / zimním časem Let @tmletnicas = @tmleto //Pomocná proměnná pro detekci prvního průchodu procesem (po zavedení aplikace) Let @tmletoinit = true Program je nutno vyvolávat z periodického procesu s vhodnou periodou, tak často, jak přesně chceme, aby se systém trefil do okamžiku změny času z letního na zimní a zpět. Perioda ovšem nesmí být kratší než 1 sekunda (z důvodu problémů s asynchronním zápisem času do hodinového obvodu v operačním systému). Výše uvedený algoritmus řeší změnu zimního/letního času tak, že se v hodinovém obvodu udržuje lokální (zimní/letní) čas, v databázi aplikace se udržuje příznak, jestli tento čas je letní nebo zimní (bit @tmletnicas). Řeší se i situace po zavedení aplikace, kdy se aktuální čas stanice považuje za z dřívějška správně nastavený, jen se nastaví příznak, zda se jedná o čas zimní nebo letní. Otázku ruční změny data přes hranici léto/zima algoritmus řeší přístupem upravit čas. Otázka ruční změny času přes hranici není uspokojivě vyřešena (při pokusu nastavit dne 28. 3. 2008 v 1:00 nový čas 4:00 se čas okamžitě změní na 5:00, protože okamžitě následuje automatická změna ze zimního na letní). 1.2. Příklad řešení 2 Tento příklad je modifikací příkladu řešení 1. Do programu přidáme mezi druhý a třetí řádek kódu tyto řádky: If @SysStart, :NONE Else :NONE EndIf Let @tmletoinit = if((utc_time < LastUTC_t) or (UTC_time > LastUTC_t + 2), bool(0), @tmletoinit) Let LastUTC_t = UTC_time a na konec podprogramu přidáme řádek: Let @SysStart = False 5/9 ap0022_cz_02

Do procesu INIT (který případně vytvoříme) doplníme řádek: Let @SysStart = True Pozor Podtržením zvýrazněná konstanta = 2 platí pro jednosekundovou periodu vyvolávání programu. Pokud program vyvoláváme s delší periodou, musí se toto číslo změnit nejméně na Perioda + 1, doporučujeme však pro jistotu volit hodnotu 2 Perioda. Touto úpravou se dosáhne toho, že po jakékoliv ruční změně data nebo času nedojde k následné úpravě času na zimní/letní. Pouze se podle nastaveného data a času nastaví příznak @tmletnicas. Úprava spočívá v tom, že se kontroluje, jestli se mezi dvěma vyvoláními programu nezměnil čas o více, než by odpovídalo normálnímu chodu hodin po dobu mezi vyvoláními procesu. V takovém případě se předpokládá, že došlo k ruční změně a obskočí se řádky provádějící automatickou změnu času, takže se pouze upraví hodnota příznaku @tmletnicas, aby odpovídala nově zadanému datu a času. 1.3. Princip činnosti navrhovaných řešení Do proměnné UTC_time se na druhém řádku programu ukládá lokální čas převedený na pásmový (=zimní) čas Azorských ostrovů, tj. čas o hodinu opožděný oproti UTC (GMT). Takto upravený čas má tu výhodu, že v něm středoevropský přechod zima/léto a zpět nastává vždy o půlnoci, takže není třeba řešit speciality různých časů v rámci kritické neděle, kdy dochází ke změně času. S takto uvedeným časem lze zjistit, jestli spadá do zimního nebo letního období (bit @tmleto) následovně: Léto je od dubna do září, v březnu tehdy, jestliže nejbližší následující neděle je už v dubnu, v říjnu tehdy, jestliže nejbližší následující neděle spadá ještě do října. S výjimkou okamžiku těsně po zavedení aplikace (v příkladu 2 též s výjimkou okamžiku po ruční změně času) se tento příznak porovnává s aktuální hodnotou příznaku @tmletnicas, v případě neshody se nastaví příznak @tmzmena a čas se posune o hodinu vpřed nebo vzad. V každém případě se bit @tmleto kopíruje do bitu @tmletnicas. Proměnnou RTC_Time není nezbytně nutné zavádět, je možné ji na všech místech, kde se používá, nahradit proměnnou UTC_Time. Její použití je výhodné ve fázi testování, protože pak máme oddělené oba pracovní časy proměnná RTC_Time obsahuje stále lokální čas (zimní nebo letní), proměnná UTC_Time obsahuje stále azorský pásmový čas viz výše. Pozor Tato navrhovaná řešení platí pouze pro středoevropský čas! 1.4. Výhody a nevýhody obou řešení Příklad 2 lépe řeší otázku ruční změny času. Změněný čas je zachován tak, jak byl zadán, bez pokusu o automatickou úpravu na zimní nebo letní. Příklad 1 lépe řeší zadání neplatného časového údaje (spadajícího do vynechané hodiny při změně ze zimního na letní) okamžitě jej přičtením či odečtením hodiny změní na platný. Příklad 2 v takové situaci nechá nastavený neplatný čas a až do jeho samovolné změny na platný (přechodem přes 03:00:00) bit @tmletnicas osciluje mezi nulou a jedničkou. Při prvním vyvolání programu, těsně po zavedení aplikace, nastává v obou příkladech jedna drobná nekorektnost, protože pro převod lokálního času na azorský (UTC_Time) se používá bit @tmletnicas, který v tom okamžiku nemá ještě správnou hodnotu, čímž může nastat hodinový posun. Čas UTC_Time se potom použije pro určení rozhodného okamžiku změny času. Problémy ap0022_cz_02 6/9

by to mohlo způsobit jedině v případě, že by se zaváděla nová aplikace v okamžiku méně než hodinu vzdáleném od okamžiku přechodu na zimní/letní čas. Vzhledem k malé pravděpodobnosti takovéto události nepovažujeme za nutné řešit tuto nekorektnost dalším komplikováním algoritmu. Navíc spolehlivé řešení této situace je v případě podzimní změny principiálně nemožné. V okamžiku, kdy jediná informace, která je k dispozici, je čas z hodinového obvodu, není podle čeho určit, jestli čas 31. 10. 2008, 02:30:00 je zimní nebo letní. 1.5. Funkční blok pro přechod letní/zimní čas Pro změnu letního/zimního času byl vytvořen funkční blok s názvem RTC.sb, který je součástí instalace DetStudia. Tento je naprogramován dle příkladu řešení 2 a lze jej jakkoliv uživatelsky dále upravovat. Pozor Funkční blok, tak jak je napsán, musí být vložen do procesu s periodou 1 sekunda! 7/9 ap0022_cz_02

2. Technická podpora Veškeré informace ohledně programového řešení přechodu na zimní/letní čas, Vám poskytne oddělení technické podpory firmy AMiT. Technickou podporu můžete kontaktovat nejlépe prostřednictvím emailu na adrese support@amit.cz. ap0022_cz_02 8/9

3. Upozornění AMiT spol. s r. o. poskytuje informace v tomto dokumentu, tak jak jsou, nepřejímá žádné záruky, pokud se týče obsahu tohoto dokumentu a vyhrazuje si právo měnit obsah dokumentu bez závazku tyto změny oznámit jakékoli osobě či organizaci. Tento dokument může být kopírován a rozšiřován za následujících podmínek: 1. Celý text musí být kopírován bez úprav a se zahrnutím všech stránek. 2. Všechny kopie musí obsahovat označení autorského práva společnosti AMiT, spol. s r. o. a veškerá další upozornění v dokumentu uvedená. 3. Tento dokument nesmí být distribuován za účelem dosažení zisku. V publikaci použité názvy produktů, firem apod. mohou být ochrannými známkami nebo registrovanými ochrannými známkami příslušných vlastníků. 9/9 ap0022_cz_02