Týden v roce

   Dobrý deň. Mal by som otázku. Už som videl príspevok jvalter.byl.cz/rocni-casovy-plan a mám tušenie že otázka bola mierená tak ako sa ju pýtam teraz ja ale odpoveď nerieši tento problém...
Môj problém je ten, že potrebujem spraviť časový plán na celý rok, kde sa každý týždeň menia podmienky a potrebujem splniť plán s presnosťou +-1 deň, najlepšie však presne, (aby sa nestalo, že celý 10ty týždeň mi bude AMiT vykonávať časy z 9 alebo 11 týždňa)
Stanica: AMiT AMiNi-ES
sb_RTC/get_Time majú všetky možné výstupy, ale neobsahujú týždeň v roku, tak by ma zaujímalo akým spôsobom by ste to spravili vy. Časový plán mám 54x4 s tým že nemám číslo týždňa v roku podľa ktorého by som spínal osvetlenie v dané časy..

   Dobrý den. V napsání algoritmu pro zjišťování čísla týdne nevidím žádný velký problém, jen je potřeba tomu věnovat čas. Na internetu je podkladů dostatek. Například:
https://kalendar.beda.cz/cislo-tydne
https://cs.wikinew.wiki/wiki/ISO_week_date  (https://en.wikipedia.org/wiki/ISO_week_date)   ISO 8601
https://webspace.science.uu.nl/~gent0113/calendar/isocalendar_text_5.htm
Pokud se rozhodnete do toho pustit, tak budu rád, pokud se o výsledek podělíte a já ho budu moci zprostředkovat i ostatním.

   Dobrý večer. Medzičasom som pátral po riešení... Do dnes som pravdupovediac netušil že existuje ISO na čas, preto sa mi to zdalo ako niečo zložité :) Človek sa učí celý život (a obzvlášť v IT smere) Našiel som napr. stránku: http://www.proesite.com/timex/wkcalc.htm
Vyriešil som to teda celkom "jednoduchým" spôsobom teda:
ProcINIT obsahuje príkaz kde si obnovujem pri reštarte premennú DOW0101(int) kde mám zapísaný deň v týždni ktorý bol 1.1.
 EERead 0, DOW0101, 1, 1
Bežný Proc
   Time (MI8x1) je to vlastne výstup z sb_RTC
   odtiaľ riešim iba DD ( Time [3,0]) a MM (Time [4,0])
   Ďalej 1.1. zapisujem jednorazovo deň v týždni do pamäte
 EEWrite 0, DOW0101, 1, 1
   Ďalej z Time [6,0] zapisujem cez if/else do premennej DOW(int) pondelok až nedeľa aby mali poradie 1 až 7
   No a ďalej dám copy-paste keďže to nie je môj výtvor ale iba úprava aby to bolo použiteľné v AMiT-e
 If (DOW0101 < 4)
   Let pom1 = 1 //pom1 je int nie bit
 Else
   Let pom1 = 0
 EndIf
 Let Vysledok = int( float( pom1 + (4*(MM-1)) + ( (2*(MM-1)) + (DD-1) + DOW0101 - DOW + 6 ) * 36 / 256 ) )
Ako som spomínal,, 0 = 53.t ,,1-52=1-52t.
Testoval som to iba letmo, takže to nemusí byť stopercentné, ale ako myšlienka by to mohlo byť fajn.
Ak môžem otázku, tak EEprom by mala ukladať po výpadku napájania aj na dlhšiu dobu, a teda aj pri inom ako Teplom reštarte že? Vďaka za ochotu

   Dobrý den, v prvním mailu jste psal stanici AMiNi. Ta má zálohovanou RAM baterií, kde by měla záloha vydržet 5 let bez napájení. Podle zkušeností bych tomu věřil (po deseti letech by se měla baterie vyměnit, ale při běžném provozu vydrží rozhodně déle). EEPROM jsem nikdy u AMiNi nepoužil a ani nevím, jestli je to uživatelsky možné. Tato paměť je náchylná na počty zápisů, proto byste do ní neměl psát často. Tato paměť drží informaci i bez napájení, takže by tam měla určitě zůstat dlouho. Osobně bych použil zálohovanou RAM.
K algoritmu „TÝDEN V ROCE“:
   Věnoval jste tomu čas, tak jsem ho věnoval i já ;-) V příloze zasílám, jak bych to řešil já. Vyšel jsem z vašeho návrhu. Byl tam trochu problém s nultým týdnem, ale uspokojivě jsem ho vyřešil. Chtělo by to ještě více testování, ale myslím, že je to použitelné.

Dobrý deň a RAM využijem akým spôsobom? (Či to je už ten skôr spomínaný "Warm" ?)

   Dobrý den, proměnné jsou automaticky ukládány do zálohované RAM (o nic se nestaráte). Volba „Warm“ je pro inicializaci proměnné při každém restartu. Příklad: zavedete proměnou „A“ s inicializační hodnotou „3“; během běhu programu se hodnota mění; při každém restartu nabyde opět hodnoty „3“. Je to v podstatě ekvivalent zápisu „Let A = 3“ v procesu INIT.

   Dobrý deň. Áno, lenže to je inicializačná hodnota.. a ja ku premennej "DOW0101" potrebujem prepisovať automaticky inicializačnú hodnotu každý rok 1.1. aby to fungovalo správne každý rok.
   Teda jeden rok je 1.1 pondelok(1) inokedy je to nedeľa(7) atď. Takže premenná sa prepisuje raz ročne (to by EEPROMka mala zvládnuť, nie?) a pri výpadku potrebujem aby sa inicializovala vždy práve tá hodnota ktorú uložím.
   Nemám prehľad vo funkciách AMiT-u, ale v Siemense je to Retain pre danú premennú, ten plní úlohu automatického ukladania poslednej hodnoty a pri opätovnom zapnutí si premenná drží túto hodnotu..
   Prikladám moje riešenie aspoň prntscr , pretože rozmýšľal som nad tým, čo ste vraveli že bol problém s tým 0tým týždňom a nemám tušenia v čom (lebo predtým ako som program vytváral som to testoval aj cez online C kompiler pre daný vzorec a pomocou kalendára (https://kalendar.aktuality.sk/zakladny/kalendarik/2004/) som testoval viaceré roky a fungovalo mi to) Prípadne, ak si pamätáte v čom tam bol problém?

   Dobrý den, standardní proměnná splní to, co chcete, bez uložení do EEPROM, tedy dokud je funkční baterie a toho bych se nebál. Vydrží hodně dlouho a pokud odejde, tak by se řídicí systém stejně neměl provozovat. Podle mého je zbytečné to dávat do EEPROM (jednou za rok tam psát, je určitě OK), i když je to možné (ověřil jsem na supportu AMiTu). Záleží, jak je to pro vás důležité.
   Problém nultého týdne pozorovaného v mém SW: nechal jsem projít zlom roku 2019/2020 abych měl správné výchozí hodnoty; posunul jsem se na 31.12.2020 -> 53 týden vše OK; nechal jsem projít zlom roku 2020/2021 -> číslo týdne „0“ (1.1.2021 je pátek, tak opravdu nepatří do 1. týdne). Mělo by tedy 1;2;3 ledna patřit do posledního týdne minulého roku (53), a ne do nultého (z jednoho týdne jsou dva). V první verzi jsem to řešil změnou týdne jen při změně týdne, což bylo náchylné na projití daným časem (0:00 z Ne na Po). V druhé verzi jsem to vylepšil tak, že ignoruji nultý týden.
Celkové chování není 100% odzkoušené, to nechám na Vás ;-) Též se nerozebírám a neupravuji vzorec, protože to by byla práce na delší čas.

   Dobrý deň. Pokiaľ bol jediný problém 0 a 53.. to je to najmenej :-) táto vec sa vyrieši pár IFmi. Dobre pamäť potom vyskúšam, keby mi to robilo problémy tak sa ozvem. Ďakujem za Váš čas.
Ku tej pamäti, áno funguje to ako vravíte, teda pri výpadku si zapamätá predošlú hodnotu, tak nebudem využívať tú EEPROMku nech to nerobí časom problémy.

   Ešte by som mal otázku ku tomu programovaniu. Videl som, že AMiT má svoj špecifický jazyk, s ktorým som sa nikde inde doteraz nestretol.. Nie je ku nemu nejaká príručka? pretože ste programovali dosť zaujímavým štýlom (napr. If v príkaze Let, alebo iné podobné veci)
Nikdy človek nevie, s čím sa v živote stretne, a aspoň by som sa chcel naučiť taký kód čítať.

   Dobrý den, programovací jazyk AMiTu vychází z C. Modul „Let“ je z mého hlediska nejsilnější modul který je k dispozici (lze v něm udělat skoro vše). Nápovědu k jakémukoli modulu získáte klávesovou zkratkou CTRL + M nad řádkem s použitým modulem. Příručky jako takové už nejsou, ale pokud se chcete AMiTu věnovat, tak bych doporučil tento postup:
1) Absolvovat školení. Zde nejlépe pochopíte jejich filozofii.
2) V DetStudiu v záložce Nápověda jsou hned nahoře čtyři „příručky“, kde získáte základní znalosti a je tam i popis modulů.
3) Projít si Aplikační poznámky, které jsou i s příklady použití https://amitomation.cz/produkt/aplikacni-poznamky/
4) Zkouknout YouTube kanál https://www.youtube.com/channel/UCjHIGfzI1mpVATudU1UOWZQ

Dobrý deň. Ďakujem, pôjdem podľa postupu aký ste napísali :-) Vďaka za váš čas.

Odesílatel: martin@gmail.com

Soubory: