Jak jednoduše zaokrouhlovat v celočíselné aritmetice ?
Pomocí vstupů pro Pt100 (Ni1000) měříme teplotu s rozlišením 0.1K. Pro účely zobrazení požadujeme hodnotu v celých stupních Celsia. |
|
Popis problému:
Pokud automaty Micropel měří teplotu pomocí čidel Pt100 připojených přímo na vstupy např. modulu D, je hodnota teploty reprezentována pro uživatelský program v rozlišení 0.1K (stupně Kelvina). Samozřejmě, že pro potřeby řídících algoritmů je toto rozlišení nejen vhodné ale i potřebné. Pro účely zobrazení na displeji automatu to už nemusí být vždy pravda. Pokud požadujeme zobrazení na displeji ve stupních Celsia a navíc v celých stupních Celsia, jsme postaveni před problém zaokrouhlování v celočíselné aritmetice (přesněji v aritmetice s pevnou řádovou čárkou).
Řešení:
Řešení daného problému přináší vcelku jednoduchý postup. Postup využije prostou operaci dělení a rozdílu. Rozdíl použijeme pro převod jednotek ze stupňů Kelvina na stupně Celsia. Operaci dělení pak použijeme o odstranění řádu desetin. Zrojový text by mohl vypadat např. takto:
R0 # Kelvin ; mapování vstupu Pt100 na symbol Kelvin var word Celsius ; deklarace proměnné pro uložení výsledku přepočtu ; přepočet Celsius = (Kelvin - 2732) / 10 ; výsledek je v celých stupních Celsia
Tento postup skutečně poskytuje výsledek ve stupních Celsia ale pohužel nezaokrouhluje a tudíž např. teplotu zobrazenou v desetinnách Kelvina jako 2960 (22.8 C) přepočítá na údaj 22 C. Tento údaj bude asi většina lidí požadovat za nesprávný a tudíž celý výpočet není vhodný pro požadovaný přepočet teploty. Proto musíme výraz přepočtu upravit tak, aby došlo k zaokrouhlení a ne jako v předchozím případě k oříznutí. Úprava výrazu je celkem snadná. Ke změřené hodnotě připočteme 5 (tj. 5 desetin Kelvina) a zbytek výrazu ponecháme beze změny. Výraz tedy bude vypadat takto:
R0 # Kelvin ; mapování vstupu Pt100 na symbol Kelvin var word Celsius ; deklarace proměnné pro uložení výsledku přepočtu ; přepočet Celsius = ((Kelvin + 5) - 2732) / 10 ; výsledek je v celých stupních Celsia
Výsledný výraz je záměrně vzhledem k přehlednosti ponechán bez úpravy (součet konstant na hodnotu (Kelvin - 2727) ). Funkci výpočtu můžeme principielně ukázat na hodnotách od 10 do 19. Mezivýsledky a výsledky shrnuje následující tabulka:
Hodnota
|
Součet (+5)
|
Podíl (/10)
|
Výsledek
|
10
|
15
|
1
|
1
|
11
|
16
|
1
|
1
|
12
|
17
|
1
|
1
|
13
|
18
|
1
|
1
|
14
|
19
|
1
|
1
|
15
|
20
|
2
|
2
|
16
|
21
|
2
|
2
|
17
|
22
|
2
|
2
|
18
|
23
|
2
|
2
|
19
|
24
|
2
|
2
|
|
|