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.

envelope 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).

lightbulb Ř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