Zobrazenie priemernej hodnoty

Toto je hlavní technické fórum pro diskusi o problémech při vytváření PROMOTIC aplikací a jejich řešení.

Zobrazenie priemernej hodnoty

Postby homoly » Thu 02. May 2019 11:46:42

Dobrý deň,

Rád by som sa informoval , akým spôsobom by bolo možné vyriešiť rýchly výpočet a zobrazenie priemernej hodnoty, obdržanej ako hodnota MODBus registra.

Na Vašich webstránkach som našiel v Trendoch funkciu filter, ale tam išlo skôr o výpočet dlhodobého priemeru v rozsahu hodín.

Ja by som potreboval realizovať výpočet , kde by sa vždy vypočítal okamžitý priemer medzi aktuálnou hodnotou a hodnotou ktorá bola vypočítaná ako priemer predchádzajúcich hodnôt. Výpočet by sa resetoval nejakým tlačidlom na ploche.

Existuje nejaká príručka na písanie scriptov v rámci Promoticu, keďže s jeho prostredím nemám zatiaľ skúsenosti, po preštudovaní ktorej by som skúsil naprogramovať horeuvedený algoritmus pre textové pole. Momentálne testujem Freeware verziu a na tvorbu prostredia a načítanie hodnôt cez MODBus bola online príručka plne postačujúca, ale toto rýchle priemerovanie sa bude dať vyriešiť asi len programovaním.


Vopred ďakujem za radu.

Gabriel.
homoly
 
Posts: 1
Joined: Thu 02. May 2019 11:29:21

Re: Zobrazenie priemernej hodnoty

Postby Kazimierz Heczko » Thu 16. May 2019 12:34:35

Dobrý deň,

Pokial ide o výpočet priemeru tak toto by sa dalo riešiť rôzne podľa toho, čo presne potrebujete:
1. Ak by Vám stačilo počítať priemer z aktuálnej hodnoty a z predchádzajúcej hodnoty, tak pre výpočet môžete použiť událosť objektu PmData onItemBeforeWrite, v ktorej máte k dispozícii celú premennú pred vlastným zápisom a parameter pEvent.NewValue, v ktorom je prednastavená novo prečítaná hodnota. A do tohoto parametru by ste kľudne mohol zapísať priemer týchto dvoch uvedených hodnôt, čiže zápis by mohol byť následujúci:
Code: Select all
pEvent.NewVal = (pEvent.Item.Value + pEvent.NewVal)/ 2

Tento postup má výhodu v tom, že nepotrebujete žiadnu dodatočnú premennú. Nevýhodou tohoto postupu je skutočnosť, že môžete počítať vždy priemer len z dvoch hodnôt: z predchádzajúcej (čiže predchádzajúci priemer) a novej hodnoty. Okrem toho nemáteuchovanú hodnotu, ktorú ste získal z komunikácie, príp. pre takéto výpočet by bolo potrebné si napr. vypočítaný priemer zapisovať do inej premennej.
Takisto v tomto prípade asi nemá veľký zmysel tento výpočet vynulovať.

2. Ak potrebujete počítať priemer z viacerých hodnôt od určitého času, tak pre každú takúto premennú si potrebujete zapamätať dva pomocné údaje: počet vzoriek a ich súčet. A tento priemer by sa zasa mohol počítať v události onItemAfterWrite, kde by ste v tejto události:
a) zväčšil počet vzoriek
b) pripočítal hodnotu k predchádzajúcej sume
Toto by sa dalo spraviť asi následujúco:
Code: Select all
sName = pMe.Item.Name
pMe.Item(sName & "_sum").Value = pMe.Item(sName & "_sum").Value + pMe.Item.Value
pMe.Item(sName & "_count").Value = pMe.Item(sName & "_count").Value + 1

Reset sa dá potom spraviť jednoduch tak, že do príslušných premenných zapíšete 0. Uvedený príklad predpokladá, že pre každú premennú, ktorú takto chcete prepočítávať budete mať v tom isto PmDat aobiekte pripravené dve ďalšie premenné s názvom doplneným koncovkou "_sum" pre uloženie súčtu, resp. "_count" pre uloženie počtu premenných.
Takisto je dôležité si pri premenných, ktoré takýmto spôsobom chcete spracovávať, si vytvoriť dátové rozšírenie typu WriteAction, ktorá by sa volala PRED (v prvom prípade) resp. PO (v druhom prípade) zápise do premennej. A ďalšia informácia, ak používate dátové rozšírenia typu WriteAction je vždy potrebné ošetrovať, pre akú premennú k danej události došlo.

Dúfam, že uvedené informácie Vám pomôžu.
Kazimierz Heczko
 
Posts: 68
Joined: Thu 13. Dec 2012 9:28:56


Return to Nevím jak...

Who is online

Users browsing this forum: No registered users and 2 guests

cron