www.label.pl | LAB-EL Elektronika Laboratoryjna
Elektronika Laboratoryjna

Protokół komunikacji z LB-702/705/725


Komunikacja z panelami LB-702 / LB-705 / LB-725
-----------------------------------------------

 rozkazy użytkownika dla wersji:
   LB-702  od 3.20
   LB-705  od 1.20
   LB-725  od 2.20

1. Dane sprzętowe:

a. interfejs wg. standardu EIA-232.

b. komunikacja: 9600 bps, 1 bit startu, 8 bitów danych, 1 bit stopu;
   bez synchronizacji, z jednym wyjątkiem - dla panelu LB-702 musi zostać
   podany sygnał DTR aby uaktywnić interfejs (musi również pozostać na czas
   komunikacji), DTR powinien zostać podany na jakiś czas przed wysłaniem
   czegokolwiek do panelu (500ms powinno wystarczyć)

2. Ogólnie o komunikacji

a. Odbywa się na zasadzie zapytanie odpowiedź. Wysyłany rozkaz ma format:
   MMPP<cr>, gdzie MM to mnemonik a PP jest opcjonalnym parametrem. Odpowiedź
   zazwyczaj składa się z powtórzonego mnemonika oraz danych i zakończona jest
   sekwencją <cr><lf>. Istnieje jeden wyjątek w starszych wersjach paneli,
   gdzie na rozkaz `DC' nie ma żadnej odpowiedzi. Po rozkazie którego panel
   nie zrozumiał odsyła odpowiedź ?<cr><lf>.

3. Szczegółowo o komunikacji

a. Podane tu rozkazy są `rozkazami użytkownika', oprócz nich istnieją jeszcze
   rozkazy serwisowe, których nie należy wysyłać bo może to spowodować
   rozkalibrowanie sondy -- dotyczy to głównie grupy rozkazów `B0' .. `BF'
   oraz `*'.

b. <EOL> oznacza dalej sekwencję: <cr> - przy zapytaniu, <cr><lf> - przy
   odpowiedzi.

c. Dla kodowania wartości heksadecymalnych używane są tylko wielkie litery

d. Określenie `wszystkie panele' oznacza dalej panele:
      LB-702 o wersji (v) >= 3.20
      LB-705 v >= 1.20
      LB-725 v >= 2.20
   rozkazy odczytu wyników pomiarowych ( `F0' .. `F3' ) można stosować dla
   wszystkich wersji ww. urządzeń (nawet starszych wersji), pozostałe rozkazy
   nie powinny być wydawane dla starszych wersji niż powyżej wymieniono.

e. Lista rozkazów

  --------------------------------------------------------------------------
  --------------------------------------------------------------------------
  - odczyt słowa statusowego

    dotyczy:    wszystkich paneli

    rozkaz:             C4<EOL>
    odpowiedź:          C4:xxxx<EOL>
       xxxx - cztery cyfry hexadecymalne kodujące status, bity:
         0  - błąd pomiaru temperatury
         1  - błąd pomiaru wilgotności
         2  - błąd wyznaczenia punktu rosy
         3  - błąd wyznaczenia wilgotności bezwzględnej [ppm_obj]
         4  - brak/błąd zegara czasu rzeczywistego
         5  - zarezerwowane
         6  - zegar czasu rzeczywistego nieustawiony
         7  - zarezerwowane
         8  - zarezerwowane
         9  - błąd pamięci danych kalibracyjnych (błąd hardware)
         10 - błąd danych kalibracyjnych (błąd logiczny)(błąd kalibracji)
         11 - zarezerwowane
         12 - brak sondy
         13 - zarezerwowane
         14 - brak/błąd pamięci rejestrującej
         15 - zarezerwowane

    przykład:           C4<EOL>
                        C4:400F<EOL>    - brak pamięci oraz błąd wszystkich
                                          pomiarów

    uwagi:      priorytet sygnalizacji użytkownikowi błędów powinien być
                następujący:
                 1. bit 9  == uszkodzenie sondy
                 2. bit 12 == brak sondy
                 3. bit 10 == błąd kalibracji, implikuje błąd wszystkich
                    pomiarów
                 4. bity 0..3 == błędy pomiarowe, przy czym ustawienie
                    bitu 0 lub bitu 1 implikuje ustawienie bitów 2 oraz 3.

                należy sygnalizować użytkownikowi błąd zegara bit 6
                (niefatalny)

                ustawienie bitów 4 i 14 nie należy traktować jako błąd,
                ale informację o tym, że nie został zainstalowany zegar
                i/lub pamięć rejestrująca.
  --------------------------------------------------------------------------
  - inicjacja panelu

    dotyczy:    wszystkich paneli

    rozkaz:             DC<EOL>

    dla:        LB-702 v: 3.20, 3.21
                LB-705 v: 1.20, 1.21
                LB-725 v: 2.20, 2.21
    odpowiedź:          brak odpowiedzi !


    dla:        LB-702 v > 3.21
                LB-705 v > 1.21
                LB-725 v > 2.21
    odpowiedź:          DC<EOL>

    uwagi:     przyrząd wykonuje inicjację co może poskutkować nawet
               kilkusekundowym brakiem możliwości skomunikowania się.
  --------------------------------------------------------------------------
  - identyfikacja panelu

    dotyczy:    wszystkich paneli
    
    rozkaz:             EX<EOL>
    odpowiedź:          LB-aaa Vb.bb<EOL>
       aaa  - symbol urządzenia
       b.bb - wersja software

    przykład:           EX<EOL>
                        LB-705 V1.22<EOL>
  --------------------------------------------------------------------------
  - identyfikacja sondy (termohigrometru LB-701)

    dotyczy:    wszystkich paneli

    rozkaz:             EY<EOL>
    odpowiedź:          EY:xx<EOL>
       xx  - wersja sondy: `02', `03', `04'

    przykład:           EY<EOL>
                        EY:03<EOL>      - sonda LB-701p3

    uwagi:      numer wersji sondy można jako informację podać użytkownikowi,
                nazwa sondy jest konstruowana jak w przykładzie: LB-701pV
  --------------------------------------------------------------------------
  - odczytanie ustawień użytkownika

    dotyczy:    wszystkich paneli

    rozkaz:             @a<EOL>
    odpowiedź:          @a:bb<EOL>
       a  - numer lokacji ustawień użytkownika
       bb - wartość zapisana heksadecymalnie

    uwagi:      adresy lokacji i sens odczytywanych wartości będą podane
                w oddzielnych punktach
  --------------------------------------------------------------------------
  - zapisanie ustawień użytkownika

    dotyczy:    wszystkich paneli

    rozkaz:             @abb<EOL>
    odpowiedź:          @a:bb<EOL>
       a  - numer lokacji ustawień użytkownika
       bb - wartość zapisana heksadecymalnie

    uwagi:      adresy lokacji i sens zapisywanych wartości będą podane
                w oddzielnych punktach
  --------------------------------------------------------------------------
  - odczytanie ustawień użytkownika z pamięci stałej do operacyjnej

    dotyczy:    wszystkich paneli

    rozkaz:             @R<EOL>
    odpowiedź:          @R<EOL>

    uwagi:      Wpisanie niektórych parametrów pracy dokonuje się tylko
                do pamięci stałej i nie ma natychmiastowego skutku w
                działaniu panelu. Wysłanie tego rozkazu powoduje uaktualnienie
                zawartości pamięci operacyjnej. Bez wysłania rozkazu nowe
                wartości parametrów odczytane zostałyby dopiero przy inicjacji
                panelu. Konieczność użycia rozkazu `@R' będzie sygnalizowana w
                odpowiednich punktach.
  --------------------------------------------------------------------------
  - odczytanie bajtu z tablicy kalibracji

    dotyczy:    wszystkich paneli

    rozkaz:             Aa<EOL>
    odpowiedź:          Aa:bb<EOL>
       a  - numer lokacji tablicy kalibracji (0..F)
       bb - wartość zapisana heksadecymalnie

    uwagi:      adresy lokacji i sens odczytywanych wartości będą podane
                w oddzielnych punktach
  --------------------------------------------------------------------------
  ---   rozkazy odczytu pomiarów   -----------------------------------------
  --------------------------------------------------------------------------
  uwagi dla czterech następnych rozkazów:
    - w zależności od wersji software wiodące zera w odpowiedziach mogą
      być zastąpione spacjami
    - pierwsza litera odpowiedzi sygnalizuje poprawność wyniku pomiaru,
      stan ten jest identyczny z bitami 0..3 słowa statusowego
  --------------------------------------------------------------------------
  - odczyt wartości temperatury

    dotyczy:    wszystkich paneli

    rozkaz:             F0<EOL>
    odpowiedź:          xTAsab.c<EOL>
       x - status: dla wyniku poprawnego 'N', dla błędnego 'O'
       s - znak '+' albo '-'
       a - dziesiątki wartości temperatury w [st C]
           albo 'spacja' (którą należy traktować jak znak `0')
       b - jedności wartości temperatury w [st C]
       c - dziesiąte wartości temperatury w [st C]

    przykład:           F0<EOL>
                        NTA- 4.1<EOL>   - temperatura -4.1 st C
  --------------------------------------------------------------------------
  - odczyt wartości wilgotności względnej

    dotyczy:    wszystkich paneli

    rozkaz:             F1<EOL>
    odpowiedź:          xRH ab.c<EOL>
       x - status: dla wyniku poprawnego 'N', dla błędnego 'O'
       a - dziesiątki wartości wilgotności w [%]
           albo 'spacja' (którą należy traktować jak znak `0')
       b - jedności wartości wilgotności w [%]
       c - dziesiąte wartości wilgotności w [%]

    przykład:           F1<EOL>
                        ORH 99.9<EOL>   - błąd wartości wilgotności
  --------------------------------------------------------------------------
  - odczyt wartości temperatury punktu rosy

    dotyczy:    wszystkich paneli

    rozkaz:             F2<EOL>
    odpowiedź:          xDPsab.c<EOL>
       x - status: dla wyniku poprawnego 'N', dla błędnego 'O'
       s - znak '+' albo '-'
       a - dziesiątki wartości temperatury w [st C]
           albo 'spacja' (którą należy traktować jak znak `0')
       b - jedności wartości temperatury w [st C]
       c - dziesiąte wartości temperatury w [st C]

    przykład:           F2<EOL>
                        NDP+ 15.3<EOL>  - temp. punktu rosy 15.3 st C
  --------------------------------------------------------------------------
  - odczyt wartości wilgotności bezwzględnej  - zawartości pary wodnej
                                                w [ppm obj]
    dotyczy:    wszystkich paneli

    rozkaz:             F3<EOL>
    odpowiedź:          xPMabcde<EOL>
       x - status: dla wyniku poprawnego 'N', dla błędnego 'O'
       a, b, c, d, e - kolejne cyfry zapisanego dziesiętnie
                       wyniku w [ ppm'ach objętościowych ],
                       wiodące zera mogą być zastąpione spacjami

    przykład:           F3<EOL>
                        NPM 9745<EOL>  - wilgotność 9745 ppm obj.
  --------------------------------------------------------------------------
  ---   obsługa zegara czasu rzeczywistego   -------------------------------
  --------------------------------------------------------------------------
  uwagi dla rozkazów obsługi zegara:
    - zegar sprzętowy (rtc) jest układem scalonym odmierzającym czas
      rzeczywisty i wymaga podtrzymania bateryjnego - jeśli rtc nie
      miał ciągłego podtrzymania, to gubi swą zawartość i zgłasza
      błąd: `zegar nieustawiony'
    - zainstalowanie rtc jest opcjonalne w panelach LB-702 i LB-705,
      w LB-725 jest zainstalowany zawsze (stąd błąd braku zegara w LB-725
      należy traktować jako uszkodzenie)
    - panele mają zaimplementowane programowe odmierzanie czasu - zegar
      systemowy
    - zegar systemowy jest inicjowany najpierw na 1 stycznia, godz. 00:00:00,
      potem jeśli zdetekowany został rtc (i jest ustawiony) następuje
      ewentualna synchronizacja
    - rozkazy `F4' i `F5' czytają zawartość zegara systemowego
    - rozkazy `BH', `BM', `BY', `BO' zapisują wartość do rtc - nie ma
      możliwości zapisu do zegara systemowego
    - rtc nie liczy lat
    - rtc liczy sekundy ale nie ma możliwości ich odczytania - przy
      synchronizacji licznik sekund zegara systemowego jest ustawiony na zero
    - przy zapisie nowej wartości czasu licznik sekund rtc jest zerowany
  --------------------------------------------------------------------------
  - odczyt czasu zegara panelu

    dotyczy:    wszystkich paneli

    rozkaz:             F4<EOL>
    odpowiedź:          Tx hh:mm:ss<EOL>
       x - status zegara: jeśli zainstalowany jest zegar sprzętowy 'h',
           jeśli zegar programowy 's' (brak zegara sprzętowego sygnalizowany
           jest również w słowie statusowym)
       hh - godzina (dziesiętnie)
       mm - minuty  (dziesiętnie)
       ss - sekundy (dziesiętnie)

    uwagi:      jeśli zegar sprzętowy jest nieustawiony bądź nie zainstalowany
                to zegar programowy startuje od 00:00:00 przy każdej inicjacji

    przykład:           F4<EOL>
                        Th 15:34:11<EOL>
  --------------------------------------------------------------------------
  - odczyt daty zegara panelu

    dotyczy:    wszystkich paneli

    rozkaz:             F5<EOL>
    odpowiedź:          Dx dd.mm<EOL>
       x - status zegara: jeśli zainstalowany jest zegar sprzętowy 'h', jeśli
           tylko programowy 's'
       dd - numer dnia (dziesiętnie 1 .. 31)
       mm - numer miesiąca (dziesiętnie 1 .. 12)

    uwagi:      jeśli zegar sprzętowy jest nieustawiony bądź nie zainstalowany
                to zegar programowy startuje od 01.01 przy każdej inicjacji

    przykład:           F5<EOL>
                        Dh 10.08<EOL>
  --------------------------------------------------------------------------
  - ustawienie minut zegara czasu rzeczywistego

    dotyczy:    wszystkich paneli

    rozkaz:             BMxx<EOL>
    odpowiedź:          BM:xx<EOL>
       xx - minuty zapisane decymalnie (0 .. 59)

    przykład:           BM22<EOL>
                        BM:22<EOL>
  --------------------------------------------------------------------------
  - ustawienie godziny zegara czasu rzeczywistego

    dotyczy:    wszystkich paneli

    rozkaz:             BHxx<EOL>
    odpowiedź:          BH:xx<EOL>
       xx - godzina zapisana decymalnie (0 .. 23)

    przykład:           BH09
                        BH:09<EOL>
  --------------------------------------------------------------------------
  - ustawienie numeru dnia zegara czasu rzeczywistego

    dotyczy:    wszystkich paneli

    rozkaz:             BYxx<EOL>
    odpowiedź:          BY:xx<EOL>
       xx - numer dnia zapisany decymalnie (1 .. 31)

    przykład:           BY11<EOL>
  --------------------------------------------------------------------------
  - ustawienie miesiąca zegara czasu rzeczywistego

    dotyczy:    wszystkich paneli

    rozkaz:             BOxx<EOL>
    odpowiedź:          BO:xx<EOL>
       xx - miesiąc zapisane decymalnie (1 .. 12)

    przykład:           BH06<EOL>
  --------------------------------------------------------------------------
  - synchronizacja zegara sprzętowego i zegara systemowego

    dotyczy:    wszystkich paneli

    rozkaz:             BZ<EOL>
    odpowiedź:          BZ<EOL>

    uwagi:              rozkaz powinien zostać wywołany po ustawieniu zegara
                        rtc
  --------------------------------------------------------------------------
  ---   rozkazy do obsługi pamięci rejestrującej w LB-702 i LB-705   -------
  --------------------------------------------------------------------------
  uwagi dotyczące pamięci rejestrującej:
    - organizacja pamięci rejestrującej w panelach LB-702 i LB-705 jest
      identyczna, inną organizacją charakteryzuje się LB-725
    - możliwe są 3 warianty: brak zainstalowanej pamięci, pamięć 24C02 (która
      daje możliwość zapisu ca 80 punktów pomiarowych (pp)), pamięć 24C16
      (640pp)
    - pamięć jest zorganizowana w 256B strony: 80pp posiada 1 stronę, 640pp
      posiada 8 stron (odczytywać pamięć można po 1 stronie)
    - niezależnie od ilości stron zapisy traktują pamięć jako obszar ciągły
    - pierwsza lokacja pamięci addr:0x000 (1B) zawiera zakodowany aktualnie
      ustawiony interwał rejestracji, od adresu:0x001 zaczyna się obszar
      rejestracji
    - kod interwału 0x00 oznacza blokadę rejestracji
    - maksymalna wartość kodu interwału wynosi 0xEF
    - występują dwa formaty rekordów zapisywanych do pamięci: format nagłówka i
      format danych
    - przy każdej inicjacji panelu (jeśli rejestracja jest aktywna) zapisywany
      jest nagłówek z informacjami o czasie startu rejestracji i interwale
    - pierwszy rekord danych zapisywany jest 1 minutę po starcie, następne w
      zależności od interwału.
    - całość ważnego obszaru danych terminowana jest bajtem 0xFF, który nie
      pojawia się w innym kontekście.

  format nagłówka:
    - bajt: 0xF0 (wartość 0xF0 nie występuje w innym kontekście)
    - bajt: minuty startu rejestracji
    - bajt: godzina startu rejestracji
    - bajt: dzień startu rejestracji
    - bajt: miesiąc startu rejestracji
    - bajt: interwał rejestracji - kodowanie interwału opisano przy
                                   rozkazie `@4'

  format rekordu danych (3 bajty rozpisane na bity):
    - 0 TA.10 TA.9  TA.8  RH.7  TA.7  RH.9  RH.8
    - 0 TA.6  TA.5  TA.4  TA.3  TA.2  TA.1  TA.0
    - 0 RH.6  RH.5  RH.4  RH.3  RH.2  RH.1  RH.0
   gdzie TA oznacza temperaturę a RH wilgotność, numer po kropce jest numerem
   bitu (liczonym od 0). Zdekodowana wartość wilgotności względnej podana jest
   w promilach. Zdekodowana wartość temperatury jest zawyżona o 400 i podana w
   dziesiątych stopnia C. Po zdekodowaniu otrzymuje się wartości zapisane
   binarnie.
  --------------------------------------------------------------------------
  - odczyt typu pamięci rejestrującej

    dotyczy:    LB-702, LB-705

    rozkaz:             GT<EOL>
    odpowiedź:          GT:xx<EOL>
       xx - `02' dla pamięci o pojemności 80pp i `16' dla pamięci
            o pojemności 640pp

    przykład:           GT:16<EOL>

    uwagi:      przed wydaniem tego rozkazu (jak i innych dotyczących pamięci)
                należy sprawdzić w słowie statusowym, czy pamięć została
                zainstalowana -- jeśli nie -- nie wydawać rozkazów
  --------------------------------------------------------------------------
  - odczytanie interwału rejestracji

    dotyczy:    LB-702, LB-705

    rozkaz:             @4<EOL>
    odpowiedź:          @4:xx<EOL>
       xx - kod interwału zapisana jako dwie cyfry hexadecymalne
            kod '00' wyłącza rejestrację, max. kod to `EF'

    przykład:           @43E<EOL>
                        @4:3E<EOL>

    uwagi:
    dla:        LB-702  3.20 <= v <= 3.24
                LB-705  1.20 <= v <= 1.23
              interwał rejestracji jest wielokrotnością 10min -- kod 0x01
              oznacza 10min, 0x02 - 20min, etc... , aż do 0xEF - 2390min.

    dla:        LB-702 v > 3.24
                LB-705 v > 1.23
              od 1min do 90min kwant interwału wynosi 1min, powyżej 90min kwant
              wynosi 10min, czyli: kod 0x01 to interwał 1min, 0x02 to 2min,
              ..., 0x5A to 90min, 0x5B to 100min, 0x5C to 110min, ..., 0xEF to
              1590min.
  --------------------------------------------------------------------------
  - ustawienie nowego interwału rejestracji

    dotyczy:    LB-702, LB-705

    rozkaz:             GIxx<EOL>
    odpowiedź:          GI:xx<EOL>
      xx - kod nowego interwału zapisany jako dwie cyfry hexadecymalne
           w zakresie  0x00..0xEF, wartość '00' wyłącza rejestrację

    przykład:           GI3E<EOL>
                        GI:3E<EOL>

    uwagi:      Zapis nowego interwału dokonuje się do pamięci stałej nie
                zmieniona zostaje jednak wartość interwału zapisana w
                pamięci operacyjnej, jeśli więc nie zostanie wykonana inicjacja
                panelu, to rejestracja będzie się odbywać ze starym interwałem.
                Można wykonać rozkaz odczytania ustawień użytkownika (do
                których zalicza się wartość interwału rejestracji) `@R', ale
                to spowoduje tylko tyle, że panel przyjmie nową wartość
                interwału i jeśli będzie ona inna od poprzedniej to zablokuje
                rejestrację. Można przyjąć następującą procedurę: wpisujemy
                nowy interwał rozkazem `GI', wykonujemy rozkaz `@R',
                informujemy użytkownika, że zmiana interwału spowoduje blokadę
                rejestracji i niech sam zdecyduje czy ją teraz wykonać.

                Co prawda interwał należy do ustawień użytkownika i odczytuje
                się go komendą `@4' ale zapis interwału nie może być wykonany
                komplementarną komendą `@4xx' tylko `GIxx'.
  --------------------------------------------------------------------------
  - kasowanie zawartości pamięci rejestrującej

    dotyczy:    LB-702, LB-705

    rozkaz:             GC<EOL>
    odpowiedź:          GC<EOL>


    uwagi:      po skasowaniu pamięci rejestracja jest blokowana do momentu
                ponownej inicjacji panelu (na przykład rozkazem 'DC') - o tym
                powinien poinformować program użytkownika po wykonaniu
                kasowania
  --------------------------------------------------------------------------
  - odczyt strony pamięci rejestrującej

    dotyczy:    LB-702, LB-705

    rozkaz:             GSxx<EOL>
    odpowiedź:          GS:xx dd dd ... dd<EOL>
       xx - numer 256 bajtowej strony pamięci zapisany jako dwie cyfry
            hexadecymalne (numerowane od zera).
       dd - kolejne lokacje pamięci zapisane hexadecymalnie (256 lokacji)

    przykład:           GS00<EOL>
                        GS:00 23 F0 12 44 .... 44 71<EOL>
                              ----------------------
                                     256 wartości

    uwagi:      wysłanie rozkazu odczytu nieistniejącej strony spowoduje
                trwały błąd odczytu pamięci, tzn. panel będzie sygnalizował
                brak pamięci -- aż do ponownej inicjacji
  --------------------------------------------------------------------------
  uwaga dotycząca ustawiania czasu rtc podczas aktywnej rejestracji:
    - ponieważ format rejestracji zakłada jednokrotny zapis bloku nagłówka
      zawierającego datę i godzinę, to zmiana czasu podczas trwania rejestracji
      nie zostanie uwzględniona aż do momentu przeinicjowania panelu, o czym
      należy poinformować użytkownika
  --------------------------------------------------------------------------
  --------------------------------------------------------------------------
  - zmiana trybu wyświetlania czas <--> zaw. pary wodnej

    dotyczy:    LB-702

    polega na:  zmianie wartości 7-mego bitu 3-ciej lokacji ustawień
                użytkownika

    procedura:  odczytać 3-cią lokacje rozkazem `@3'
                zmienić stan 7-mego bitu
                zapisać lokację rozkazem `@3'
                wymusić odczytanie ustawień użytkownika rozkazem `@R'

    przykład:           rozkaz:         @3<EOL>
                        odp:            @3:94<EOL>
                        rozkaz:         @314<EOL>
                        odp:            @3:14<EOL>
                        rozkaz:         @R
                        odp:            @R

    uwagi:      nie należy zmieniać wartości innych bitów
  --------------------------------------------------------------------------
  - odczytanie numeru seryjnego sondy

    dotyczy:    wszystkich paneli

    polega na:  odczytaniu lokacji 0xD i 0xE tablicy kalibracji

    procedura:  odczytać lokacje 0xD i 0xE przy pomocy rozkazów: AD i AE, numer
                z przedziału 0 .. 9999 jest zapisany w postaci BCD przy czym w
                lokacji 0xE znajduje się bardziej znacząca jego część
  --------------------------------------------------------------------------
  - odczytanie daty ostatniej kalibracji

    dotyczy:    wszystkich paneli

    polega na:  odczytaniu lokacji 0xC tablicy kalibracji

    procedura:  odczytać lokację 0xC przy pomocy rozkazu AC, rok zapisany jest
                w starszej połowie bajtu jako (4-bitowa) liczba lat od roku
                1993, numer miesiąca zapisany w młodszej połowie przy czym
                styczniowi odpowiada 0
  --------------------------------------------------------------------------
  - odczytanie zakresu pomiaru wilgotności

    dotyczy:    wszystkich paneli

    polega na:  odczytaniu lokacji 0xA tablicy kalibracji

    procedura:  odczytać lokację 0xA przy pomocy rozkazu AA, rodzaj czujnika
                zainstalowanego w sondzie identyfikuje się na podstawie
                wartości zapisanej w dolnej połowie bajtu: 1 dla zakresu
                rozszerzonego, 2 dla zakresu podstawowego, 0 brak informacji na
                temat zakresu

    uwagi:      jeśli zdetekowano wersję sondy p2 to zawartość tej lokacji nie
                ma znaczenia - sonda ta nie posiada informacji o obsługiwanym
                zakresie
  --------------------------------------------------------------------------
  --------------------------------------------------------------------------


  --------------------------------------------------------------------------
  ---   rozkazy do obsługi pamięci rejestrującej w LB-725   ----------------
  --------------------------------------------------------------------------
  - odczyt typu pamięci rejestrującej

    dotyczy:    LB-725

    rozkaz:             GT<EOL>
    odpowiedź:          GT:xx<EOL>
       xx - `80' dla pamięci o pojemności 4000pp

    przykład:           GT<EOL>
                        GT:80<EOL>

    uwagi:      panel LB-725 zawsze posiada pamięć rejestrującą, do obecnej
                wersji jest to zawsze pamięć mieszcząca 4000 punktów
                rejestracji pomiarów
  --------------------------------------------------------------------------
  - odczytanie interwału rejestracji

    dotyczy:    LB-725

    rozkaz:             @4<EOL>
    odpowiedź:          @4:xx<EOL>
       xx - kod interwału zapisana jako dwie cyfry hexadecymalne
            kod '00' wyłącza rejestrację, max. kod to `EF'

    przykład:           @43E<EOL>
                        @4:3E<EOL>

    uwagi:
              interwał rejestracji jest wielokrotnością 10min -- kod 0x01
              oznacza 10min, 0x02 - 20min, etc... , aż do 0xEF - 2390min.
  --------------------------------------------------------------------------
  - ustawienie nowego interwału rejestracji

    dotyczy:    LB-725

    rozkaz:             GIxx<EOL>
    odpowiedź:          GI:xx<EOL>
      xx - kod nowego interwału zapisany jako dwie cyfry hexadecymalne
           w zakresie  0x00..0xEF, wartość '00' wyłącza rejestrację

    przykład:           GI3E<EOL>
                        GI:3E<EOL>

    uwagi:      Zapis nowego interwału dokonuje się do pamięci stałej nie
                zmieniona zostaje jednak wartość interwału zapisana w pamięci
                operacyjnej. Należy wykonać rozkaz odczytania ustawień
                użytkownika (do których zalicza się wartość interwału
                rejestracji) `@R'. Panel LB-725 (w odróżnieniu od LB-702 i
                LB-705) nie blokuje rejestracji po zmianie interwału

                Co prawda interwał należy do ustawień użytkownika i odczytuje
                się go komendą `@4' ale zapis interwału nie może być wykonany
                komplementarną komendą `@4xx' tylko `GIxx'.
  --------------------------------------------------------------------------
  - kasowanie zawartości pamięci rejestrującej

    dotyczy:    LB-725

    rozkaz:             GC<EOL>
    odpowiedź:          GC<EOL>


    uwagi:      po skasowaniu pamięci rejestracja jest blokowana do momentu
                ponownej inicjacji panelu (na przykład rozkazem 'DC') - o tym
                powinien poinformować program użytkownika po wykonaniu
                kasowania
  --------------------------------------------------------------------------
  uwagi nt. pamięci rejestrującej w LB-725:
    - Pamięć rejestrująca przyrządu jest fragmentem pamięci ram zainstalowanej
      w panelu. Numer pierwszej strony pamięci przeznaczonej na rejestrację
      należy odczytać rozkazem `GB'. Koniec obszaru aktualnie zapełnionego
      ważnymi danymi należy odczytać rozkazem `GP'. Na podstawie wartości
      uzyskanych przy pomocy ww. rozkazów można obliczyć liczbę rekordów
      rezydujących w pamięci.
    - Długość rekordu jest stała = 8B.
    - Format rekordu:
        1. numer dnia (1B) - binarnie
        2. numer miesiąca (1B) - binarnie (+ znacznik power fail)
        3. godzina (1B) - binarnie
        4. minuty (1B) - binarnie
        5. temperatura (2B)
        6. wilgotność (2B)  (+ bity kontrolne)

        ad 2.) - do numeru miesiąca należy uwzględnić bity 0..6
               - wartość 1 oznacza styczeń
               - na 7. bicie kodowany jest znacznik `zaniku zasilania'
                 (1=nastąpił zanik zasilania)
        ad 5.) - temperatura zapisana binarnie w dziesiątych stopnia
                 w kodzie U2, pierwszy bajt = MSB
        ad 6.) - do wilgotności należy uwzględnić bity 0..11
               - wilgotność zapisana binarnie w promilach, pierwszy bajt = MSB
               - najstarsze 4 bity zawierają sumę kontrolna rekordu obliczoną
                 jako zanegowaną bitowo sumę po pozostałych nibblach rekordu
  --------------------------------------------------------------------------
  - odczyt strony pamięci rejestrującej

    dotyczy:    LB-725

    rozkaz:             GSxx<EOL>
    odpowiedź:          GS:xx dd dd ... dd<EOL>
       xx - numer 256 bajtowej strony pamięci zapisany jako dwie cyfry
            hexadecymalne (numerowane od zera).
       dd - kolejne lokacje pamięci zapisane hexadecymalnie (256 lokacji)

    przykład:           GS03<EOL>
                        GS:03 23 F0 12 44 .... 44 71<EOL>
                              ----------------------
                                     256 wartości
  --------------------------------------------------------------------------
  - odczytanie numeru pierwszej strony pamięci rejestrującej

    dotyczy:    LB-725

    rozkaz:             GB<EOL>
    odpowiedź:          GB:xx<EOL>
       xx - numer pierwszej strony (hexadecymalnie) pamięci rejestrującej

    uwagi:      ten numer jest zawsze większy niż 0x00, aktualnie zawsze
                jest równy 0x03
  --------------------------------------------------------------------------
  - odczytanie aktualnego wskaźnika zapisu do pamięci rejestrującej

    dotyczy:    LB-725

    rozkaz:             GP<EOL>
    odpowiedź:          GP:xxxx<EOL>
       xxxx - adres aktualnego wskaźnika zapisu do pamięci rejestrującej
              (hexadecymalnie)

    uwagi:      Starszy bajt jest numerem strony. Wskaźnik pokazuje na rekord
                następny do zapisu -- a więc jeszcze nieaktualny. Przy każdym
                zapisie wskaźnik jest zwiększany o 8 (rozmiar rekordu
                rejestracji).
  --------------------------------------------------------------------------
  --------------------------------------------------------------------------
  ---   rozkazy do obsługi progów regulacji LB-725   -----------------------
  --------------------------------------------------------------------------
  uwagi nt. progów regulacji:
    - istnieją 3 tryby regulacji:
      0 - regulacja wyłączona - wszystkie urządzenia (regulowane) wyłączone
      1 - regulacja z wykorzystaniem progów: tn~, tn_, to~, to_,
                                             Hn~, Hn_, Ho~, Ho_
      2 - regulacja z wykorzystaniem progów: t0, d, H,
                                             Hn~, Hn_, Ho~, Ho_
    - każdy próg zajmuje 2B
    - progi temperatury kodowane są w U2, wilgotności bez znaku
    - wartości wilgotności i temperatury podane są w dziesiątych [%] i [st.C]
    - przyjęta jest konwencja `big endian'
    - oprócz progów w tablicy zapamiętany jest aktualny tryb regulacji
      (też 2 bajty) oznaczany jako SET
    - tablica progów jest ulokowana na 1. stronie pamięci panelu i zaczyna
      się od pierwszego bajtu (od adresu 0x0100), progi regulacji zaczynają
      się od adresu 0x0104
    - długość tablicy można odczytać rozkazem `IL'
    - ostatnią lokację tablicy zajmuje nastawa trybu regulacji SET
    - kolejność progów regulacji w tablicy:
        0x0100 .. 0x0103    zarezerwowane
        0x0104     tn~      włączenie nagrzewacza
        0x0106     tn_      wyłączenie nagrzewacza
        0x0108     to~      włączenie ochładzacza
        0x010a     to_      wyłączenie ochładzacza
        0x010c     H        histereza kompresora
        0x010e     d        histereza zaworu
        0x0110     t0       temperatura stabilizowana
        0x0112     Hn~      włączenie nawilżacza
        0x0114     Hn_      wyłączenie nawilżacza
        0x0116     Ho~      włączenie osuszacza
        0x0118     Ho_      wyłączenie osuszacza
        .....      obszar zarezerwowany o dlugosci wynikającej z odczytu
                   rozkazem `IL' (np. w wersji 2.22 dlugość jest 0)
        ostatnia lokacja   SET  tryb regulacji (np. w wersji 2.22 jest
                                                to adres 0x011a)
    - program użytkownika powinien zapewnić poprawność wartości progów
      wpisanych do panelu:
         -40.0 < tn~ <= to_ <= tn_ <= to~ < 85.0
         0.0 < Hn~ <= Ho_ <= Hn_ <= Ho~ < 100.0
         0.0 < H <= d < 85.0
         -40.0 < t0 < 85.0
    - zapis nowych wartości progów do panelu wymaga odpowiedniej sekwencji
      rozkazów: wyłączenie sprawdzania sumy kont. tablicy `IM', wysłanie
      nowych nastaw `IW', obliczenie nowej sumy kontrolnej i włączenia
      sprawdzania `IS'.
  --------------------------------------------------------------------------
  --------------------------------------------------------------------------
  - odczyt strony pamięci zawierającej tablicę progów regulacji

    dotyczy:    LB-725

    rozkaz:             GS01<EOL>
    odpowiedź:          GS:01 dd dd ... dd<EOL>
       dd - kolejne lokacje pamięci zapisane hexadecymalnie (256 lokacji)
  --------------------------------------------------------------------------
  - odczyt długości tablicy progów regulacji

    dotyczy:    LB-725

    rozkaz:             IL<EOL>
    odpowiedź:          IL:xx<EOL>
       xx - liczba bajtow tablicy progów regulacji (hexadecymalnie)

    uwagi:      jest to bajtów a nie liczba pozycji tablicy
  --------------------------------------------------------------------------
  - nałożenie blokady sprawdzania sumy kontr. tablicy progów

    dotyczy:    LB-725

    rozkaz:             IM<EOL>
    odpowiedź:          IM<EOL>

    uwagi:      rozkaz należy wysłać przed rozpoczęciem uaktualniania
                tablicy
  --------------------------------------------------------------------------
  - wysłanie bajtu do tablicy progów regulacji

    dotyczy:    LB-725

    rozkaz:             IWxx<EOL>
    odpowiedź:          IW:xx<EOL>
      xx - wartość bajtu (hexadecymalnie)

    uwagi:      Po wysłaniu rozkazu `IM' należy wysłać zawartość wyedytowanej
                tablicy progów regulacji. Każdy rozkaz `IW' przenosi jeden
                bajt tej tablicy. Należy wysłać dokładnie tyle bajtów, ile
                wynika z odpowiedzi na rozkaz `IL'. W obecnej wersji można
                edytować 11 progów i wartość określającą tryb regulacji (SET),
                aby zachować zgodność z ewentualnymi przyszłymi wersjami
                program użytkownika powinien wysyłać pozostałe wartości tablicy
                (jeśli takie będą) tak jak je odczytał. Bezpośrednio po
                wysłanie wszystkch bajtów tablicy należy wysłać rozkaz `IS'
  --------------------------------------------------------------------------
  - obliczenie sumy kontrolnej nowej tablicy progów regulacji i włączenie
    kontroli poprawności tej sumy

    dotyczy:    LB-725

    rozkaz:             IS<EOL>
    odpowiedź:          IS<EOL>

    uwagi:      rozkaz należy wysłać bezpośrednio po wysłaniu ostatniego
                bajtu tablicy progów regulacji
  --------------------------------------------------------------------------
  - odczytanie stanu przekaźników panelu i aktualnego trybu regulacji

    dotyczy:    LB-725

    rozkaz:             IR<EOL>
    odpowiedź:          IR:yx<EOL>
       y - numer trybu regulacji (hexadecymalnie)
       x - stan przekaźników (hexadecymalnie), bity:
         0 - włączony przekaźnik chłodzenia
         1 - włączony przekaźnik nawilżania
         2 - włączony przekaźnik osuszania
         3 - włączony przekaźnik nagrzewania / kompresora

    uwagi:      w 2. trybie sterowania bit 3 opisuje stan przekaźnika
                kompresora w 1. trybie nagrzewania (tak powinny być opisane
                przekaźniki w programie użytkownika)
  --------------------------------------------------------------------------

Dodatki:

// ---------------------------------------------------------------------------
// Funkcja sprawdza poprawnosc sumy kontrolnej w rekordzie rejestracji LB-725
// zwraca: 0-OK, 1-zle
// ---------------------------------------------------------------------------
int test_chsum ( unsigned char * t ) {
unsigned        a = 0;
int             i;

for ( i=0 ; i<8 ; i++ ) {
  a += t[i] & 0x0f;
  if (i != 6)  a += (t[i] & 0xf0) >> 4;  }
a ^= 0xffff;  a &= 0x000f;
return  (a << 4) != (t[6] & 0xf0); }
// ---------------------------------------------------------------------------


// ---------------------------------------------------------------------------
//  zwraca: wartosc interwalu rejestracji w minutach na podstawie kodu
// ---------------------------------------------------------------------------
int  decode_interval (
        int v,                  // wartosc kodu interwalu [0..255]
        int thtype,             // jeden z 702, 705, 725
        int softv               // wersja software panelu
                     ) {
int r = 0;

if ( ( (thtype == 705) && (softv >= 124) ) ||
     ( (thtype == 702) && (softv >= 325) ) )
  {
    if ( v > 90 )         r = (v-90) * 10 + 90;
    else                  r = v;
  }

else  r = 10 * v;

return r; }
// ---------------------------------------------------------------------------
//  dekodowanie zawartosci pamieci rejestrujacej dla LB-702 i LB-705
//  zwraca: ilosc zdekodowanych rekordow
// ---------------------------------------------------------------------------
enum { H_SKIP, H_MIN, H_HOUR, H_DAY, H_MON, H_INTERV, M_PARTS, M_TA, M_RH };

struct memo_record {
  time_t        ti;
  float         rh, ta; };
// ---------------------------------------------------------------------------
int memo_decode_702 (
        unsigned char * mt,     // tablica z obrazem pamieci panelu
        int l,                  // dlugosc ww. tablicy
        memo_record * memotab,  // docelowa tablica z wynikami
        int thtype,             // jeden z 702, 705, 725
        int softv               // wersja software panelu
                    ) {

int             i=1, next=H_SKIP, recno=0, j=0;
time_t          ti;     // time_t jest zdefiniowane jako long i ma wymiar
                        // sekund, co bede dalej wykorzystywal w obliczeniach
struct tm       st;
long            iv;
int             cta, crh;

while ( i < l )
  {

  if( mt[i] == 0xf0 ) { next = H_MIN;  i++;  continue; }
  if( mt[i] == 0xff ) break;

  switch (next)
    {
    case H_SKIP:
      i++;  break;
    case H_MIN:
      ti = time( NULL );
      memmove( &st, localtime( &ti ), sizeof(struct tm) );
      st.tm_min = mt[i++];   next = H_HOUR;  break;
    case H_HOUR:
      st.tm_hour = mt[i++];  next = H_DAY;  break;
    case H_DAY:
      st.tm_mday = mt[i++];  next = H_MON;  break;
    case H_MON:
      st.tm_sec = 0;
      st.tm_mon = mt[i++]-1;  next = H_INTERV;
      ti = mktime( & st ) + 60L;  break;
    case H_INTERV:
      iv = 60L * (long) decode_interval ( mt[i++], thtype, softv );
      next = M_PARTS;  break;
    case M_PARTS:
      cta = 256 * ( mt[i] >> 4 );
      crh = 256 * ( mt[i] & 0x03 );
      if( mt[i] & 0x08 )    crh += 128;
      if( mt[i++] & 0x04 )  cta += 128;
      next = M_TA; break;
    case M_TA:
      cta += mt[i++];  next = M_RH;  break;
    case M_RH:
      crh += mt[i++];  next = M_PARTS;
      memotab[j].ti = ti;
      memotab[j].rh = crh;
      memotab[j++].ta = cta;
      ti += iv;  recno ++;
      break;
    }
  }

return recno; }
// ---------------------------------------------------------------------------

Uzupełnienia:

  --------------------------------------------------------------------------
  ---  rozkazy związane z ulepszonym pomiarem temperatury ------------------
  --------------------------------------------------------------------------
  - odczyt statusu kalibracji sondy LB-701p4

    dotyczy:    LB-702: v >= 3.27
                LB-705: v >= 1.25
                LB-725: v >= 2.24

    opis:       Jeżeli podłączona jest sonda LB-701 w wersji p4, to istnieje
                możliwość, że została skalibrowana w procedurze rozszerzonej
                kalibracji temperatury jest wtedy sens czytać wynik pomiaru
                ze zwiększoną rozdzielczością (do 0.01). Odczyt (i prezentacja
                w programie użytkownika) wyniku temperatury z rozdzielczością
                0.01 jest sugerowana przy ustawionym 7. bicie 9. lokacji
                tablicy kalibracji termohigrometru LB-701p4 (odczytać
                rozkazem 'A9').

    uwagi:      Oczywiście ustalenie stanu 7. bitu 9. lokacji jest możliwe
                również w starszych wersjach paneli i dla sond innych niż
                LB-701p4, ale znaczenie tego bitu może być zupełnie różne.
  --------------------------------------------------------------------------
  - odczyt wyniku temperatury z rozdzielczością 0.01

    dotyczy:    LB-702: v >= 3.27
                LB-705: v >= 1.25
                LB-725: v >= 2.24

    rozkaz:             F6<EOL>
    odpowiedź:          xTEsab.cd<EOL>
       x - status: dla wyniku poprawnego 'N', dla błędnego 'O'
       s - znak '+' albo '-'
       a - dziesiątki wartości temperatury w [st C]
           albo 'spacja' (którą należy traktować jak znak `0')
       b - jedności wartości temperatury w [st C]
       c - dziesiąte wartości temperatury w [st C]
       c - setne wartości temperatury w [st C]

    przykład:           F6<EOL>
                        NTA- 4.12<EOL>   - temperatura -4.12 st C

    uwagi:      Odczyt temperatury z rozdzielczością 0.01 ma sens tylko
                dla sondy LB-701p4 i tylko wtedy, gdy status kalibracji
                sugeruje taki odczyt, patrz: 'odczyt statusu kalibracji
                sondy LB-701p4'.
  --------------------------------------------------------------------------
  --------------------------------------------------------------------------


  --------------------------------------------------------------------------
  ---   nowe rozkazy dla LB-702 wer >= 3.30 - (obsługa barometru)  ---------
  --------------------------------------------------------------------------
  - odczyt słowa statusowego barometru

    dotyczy:    LB-702: v >= 3.30

    rozkaz:             JV<EOL>
    odpowiedź:          JV:xxxx<EOL>
       xxxx - cztery cyfry hexadecymalne kodujące status, bity:
         0   - koduje jednostkę prezentacji ciśnienia: jeśli ustawiony
               to [mmHg], jeśli zgaszony to [hPa]
         2,1 - kodują sposób wykorzystania 4. pola wyświetlacza
               0,0 - brak 4. parametru
               0,1 - temperatura punktu rosu
               1,0 - zawartość pary wodnej
               1,1 - czas
         3   - zarezerwowany
         4   - zarezerwowany
         5   - zarezerwowany
         6   - zarezerwowany
         7   - zarezerwowany
         8   - sygnalizuje, że moduł barometru został zainstalowany
         9   - sygnalizuje błąd pomiaru/obliczeń ciśnienia
         10  - sygnalizuje błąd (hardware'owy) pamięci kalibracji
               barometru
         11  - sygnalizuje błąd sumy kontrolnej pamięci kalibracji
               barometru
         12  - zarezerwowany
         13  - zarezerwowany
         14  - zarezerwowany
         15  - zarezerwowany

    uwagi:      brak ustawionego 8. bitu oznacza, że moduł baro nie został
                zamontowany i zawartość innych bitów słowa statusowego
                traci sens oraz to, że nie należy wydawać innych poleceń
                dla barometru (rozkazów z grupy Jx)

                jeżeli moduł baro jest zamontowany to traci ważność
                ustawienie 'czas <-> zaw.pary wodnej' 7.bit wartości
                czytanej/pisanej rozkazem '@3' na rzecz ustawień
                wykonywanych rozkazem 'JV'
  --------------------------------------------------------------------------
  - ustawienia użytkownika dotyczące barometru

    dotyczy:    LB-702: v >= 3.30

    rozkaz:             JVxx<EOL>
    odpowiedź:          JV:xx<EOL>
       xx - dwie cyfry hexadecymalne kodujące ustawienia, których
            sens jest identyczny z LSB rozkazu 'JV<EOL>' (bity 0..7)

    uwagi:      bity określone jako 'zarezerwowane' powinny pozostać
                nie zmienione w stosunku do odczytanych rozkazem 'JV<EOL>'
  --------------------------------------------------------------------------
  - odczyt numeru cyklu pomiarowego barometru

    dotyczy:    LB-702: v >= 3.30

    rozkaz:             JL<EOL>
    odpowiedź:          JL:yy<EOL>
       yy   - dwie cyfry hexadecymalne kodujące numer cyklu pomiarowego
              barometru - numeracja modulo 16
  --------------------------------------------------------------------------
  - odczyt danych kalibracyjnych z pamięci stałej do ram

    dotyczy:    LB-702: v >= 3.30

    rozkaz:             JR<EOL>
    odpowiedź:          JR<EOL>

    uwagi:      rozkaz zapisu danych kalibracyjnych powoduje zapis
                do pamieci stałej bez uwzględnienia nowej kalibracji
                w procesie obliczeniowym, ten rozkaz odczytuje
                dane z pamieci stalej do ram, co umożliwia ich uwzglednianie
                przy obliczaniu ciśnienia, alternatywnie można użyć rozkazu
                inicjacji 'DC'
  --------------------------------------------------------------------------
  - odczyt bajtu z wektora kalibracji barometru

    dotyczy:    LB-702: v >= 3.30

    rozkaz:             Jx<EOL>
    odpowiedź:          Jx:yy<EOL>
        x  - numer lokacji zapisany jako jedna cyfra hex z zakresu
             0..B
        yy - wartość bajtu spod lokacji 'x' zapisana jako dwie cyfry hex

    uwagi:      w programie użytkownika może zaistnieć potrzeba odczytania
                jakiegoś parametru kalibracji i zinterpretowania go - taka
                konieczność będzie sygnalizowana w osobnych punktach
  --------------------------------------------------------------------------
  - odczyt wartości ciśnienia w [hPa]

    dotyczy:    LB-702: v >= 3.30

    rozkaz:             F7<EOL>
    odpowiedź:          xPRabcd.e<EOL>
       x - status: dla wyniku poprawnego 'N', dla błędnego 'O'
       a - tysiące wartości ciśnienia w [hPa]
           albo 'spacja' (którą należy traktować jak znak '0')
       b - setki wartości ciśnienia w [hPa]
       c - dziesiątki wartości ciśnienia w [hPa]
       d - jedności wartości ciśnienia w [hPa]
       e - dziesiąte wartości ciśnienia w [hPa]

    przykład:           F7<EOL>
                        NPR 998.3<EOL>  - ciśn. 998.3 hPa
  --------------------------------------------------------------------------
  - odczyt wartości ciśnienia w [mmHg]

    dotyczy:    LB-702: v >= 3.30

    rozkaz:             F8<EOL>
    odpowiedź:          xPGabcd.e<EOL>
       x - status: dla wyniku poprawnego 'N', dla błędnego 'O'
       a - tysiące wartości ciśnienia w [mmHg]
           albo 'spacja' (którą należy traktować jak znak '0')
       b - setki wartości ciśnienia w [mmHg]
       c - dziesiątki wartości ciśnienia w [mmHg]
       d - jedności wartości ciśnienia w [mmHg]
       e - dziesiąte wartości ciśnienia w [mmHg]

    przykład:           F8<EOL>
                        NPG 741.4<EOL>  - ciśn. 741.4 mmHg
  --------------------------------------------------------------------------
  --------------------------------------------------------------------------


  --------------------------------------------------------------------------
  --- rozszerzenia w obsłudze pamięci rejestrującej LB-702/LB-705 ----------
  --------------------------------------------------------------------------
    dotyczy:    LB-702: v >= 3.30

  To co napisano w punkcie 'rozkazy do obsługi pamięci rejestrującej
  w LB-702 i LB-705' pozostaje w mocy. Dodano nowy format rejestracji
  dla panelu wyposażonego w moduł barometryczny. Odróżnienie formatu
  rozszerzonego o ciśnienie możliwe jest przy interpretacji początkowego
  bajtu nagłówka.

  format nagłówka:
    - bajt: 0xF1 (wartość 0xF1 nie występuje w innym kontekście)
    - bajt: minuty startu rejestracji
    - bajt: godzina startu rejestracji
    - bajt: dzień startu rejestracji
    - bajt: miesiąc startu rejestracji
    - bajt: interwał rejestracji - kodowanie interwału opisano przy
                                   rozkazie `@4'

  format rekordu danych (5 bajtów rozpisanych na bity):
    - 0 TA.10 TA.9  TA.8  RH.7  TA.7  RH.9  RH.8
    - 0 TA.6  TA.5  TA.4  TA.3  TA.2  TA.1  TA.0
    - 0 RH.6  RH.5  RH.4  RH.3  RH.2  RH.1  RH.0
    - 0 PR.7  PR.13 PR.12 PR.11 PR.10 PR.9  PR.8
    - 0 PR.6  PR.5  PR.4  PR.3  PR.2  PR.1  PR.0

   gdzie TA oznacza temperaturę, RH wilgotność a PR ciśnienie, numer po
   kropce jest numerem bitu (liczonym od 0). Zdekodowana wartość
   wilgotności względnej podana jest w promilach. Zdekodowana wartość
   temperatury jest zawyżona o 400 i podana w dziesiątych stopnia C.
   Zdekodowana wartość ciśnienia podana jest w dziesiątych hPa. Po
   zdekodowaniu otrzymuje się wartości zapisane binarnie.

   W pojedynczej sesji odczytu pamięci rejestrującej możliwe jest
   odczytanie bloków danych w formacie TA/RH i TA/RH/PR, co za tym idzie
   należy po każdym nagłówku rejestracji pamiętać jaki jest format rekordu
   danych.
  --------------------------------------------------------------------------
  --------------------------------------------------------------------------
  

  --------------------------------------------------------------------------
  --- ustalenie zgodności wstecz dla interpretacji rozkazów  ---------------
  --------------------------------------------------------------------------
  - odczyt wersji zgodności rozkazów użytkownika

    dotyczy:    LB-702: v >= 3.30

    rozkaz:             KU<EOL>
    odpowiedź:          KU:v.rr<EOL>
        v.rr - numer wersji panelu (równy albo niższy niż bieżący)
               z którą format i znaczenie rozkazów użytkownika są
               zgodne w bieżącej wersji

    uwagi:      przykład: jeżeli pracujemy z panelem LB-702 w wersji
                3.32 a z rozkazu 'KU' dowiadujemy się, że występuje zgodność
                z wersją 3.30, to można założyć, że wszystkie rozkazy
                użytkownika ważne w wersji 3.30 będą tak samo poprawne
                w 3.32.
  --------------------------------------------------------------------------
  --------------------------------------------------------------------------


  --------------------------------------------------------------------------
  ---   nowe rozkazy dla LB-705 wer >= 1.26 --------------------------------
  --------------------------------------------------------------------------
  Dodane zostały rozkazy pojawiające się w LB-702 v.3.30. Oto szczegóły:
  - rozkazy 'KU' i 'KC', działają tak jak opisano dla LB-702.
  - interpretowany jest rozkaz 'JV' mimo, że LB-705 nie przewiduje
    obsługi modułu barometrycznego; odpowiedź na ten rozkaz wykazuje
    brak zainstalowanego modułu baro (8. bit jest wyzerowany).
  - interpretowane są rozkazy 'F7' i 'F8' i zwracają status 'OPR' i 'OPG'.

  Format rekordu rejestracji z bajtem nagłówkowym 0xf1 (jak opisano dla
  LB-702 v.3.30) jest obowiązujący również dla LB-705 od v.1.26. Pojawiają
  się również nowe formaty o których dalej.
  --------------------------------------------------------------------------
  - odczyt zakresu pomiarowego temperatury

    dotyczy:    LB-705: v >= 1.26

    opis:       Panel LB-705 od wersji 1.26 może współpracować z sondą
                przeznaczoną do pomiaru temperatury w szerokim zakresie
                (-200..+550 stC). W tym zakresie temperatur może pracować
                tylko sonda LB-701p4 (sprawdzić rozkazem 'EY'), z ustawionym
                3. bitem w 0xb. lokacji wektora kalibracji (sprawdzić
                rozkazem 'AB').
  --------------------------------------------------------------------------
  - odczyt temperatury w szerokim zakresie

    dotyczy:    LB-705: v >= 1.26

    rozkaz:             F9<EOL>
    odpowiedź:          xTXsabc.de<EOL>
       x - status: dla wyniku poprawnego 'N', dla błędnego 'O'
       s - znak '+' albo '-'
       a - setki wartości temperatury w [st C]
           albo 'spacja' (którą należy traktować jak znak `0')
       b - dziesiątki wartości temperatury w [st C]
           albo 'spacja' (którą należy traktować jak znak `0')
       c - jedności wartości temperatury w [st C]
       d - dziesiąte wartości temperatury w [st C]
       e - setne wartości temperatury w [st C]

    przykład:           F9<EOL>
                        NTX-174.15<EOL>   - temperatura -174.15 st C

    uwagi:      Rozkazu tego można używać w zastępstwie 'F0' i 'F6'.
                Podawana jest wartość temperatury z dwoma miejscami
                po przecinku niezależnie od statusu kalibracji sondy
                i niezależnie od wersji sondy.
                Jeżeli do panelu podłączona została sonda p2 albo p3,
                albo status kalibracji sondy p4 nie sugeruje wyświetlania
                wyniku pomiaru temperatury ze zwiększoną precyzją, program
                użytkownika powinien zaokrąglić wynik pomiaru do jednego
                miejsca po przecinku.
                Jeżeli sonda ma ustawiony bit szerokiego zakresu pomiarowego
                to tylko ten rozkaz daje w pełni poprawną wartość tempera-
                tury. Dla sondy szerokozakresowej nie należy używać rozkazów
                'F0' i 'F6', ponieważ format ich odpowiedzi nie jest
                w stanie przenieść pełnej wartości temperatury. Przy
                ustawionym bicie szerokiego zakresu odpowiedź na rozkaz
                'F0' i 'F6' ma zawsze status 'O' mimo, że wartość może
                być poprawna.
  --------------------------------------------------------------------------
  - odczyt aktywnoci toru pomiarowego

    dotyczy:    LB-705: v >= 1.26

    opis:       Panel LB-705 od v.1.26 interpretuje ustawienie bitu:
                - 5. w 0xb. lokacji wektora kalibracji jako wyłączenie
                  toru pomiarowego wilgotności
                - 4. w 0xb. lokacji wektora kalibracji jako wyłączenie
                  toru pomiarowego temperatury

    uwagi:      Reakcją programu użytkownia na wyłączenie toru pomiarowego
                powinno być wygaszenie wyświetlacza adekwatnej wartości albo
                inna sygnalizacja, różna od sygnalizacji błędu. Opisana
                interpretacja bitów zachodzi jedynie dla sondy LB-701p4.
                Odczyt wartości pomiaru z wyłączonego toru rozkazami 'Fx'
                daje w odpowiedzi status 'O', również odpowiednie bity
                słowa statusowego (rozkaz 'C4') pozostają ustawione.
  --------------------------------------------------------------------------
  - odczyt strony pamięci rejestrującej z sumą kontrolną

    dotyczy:    LB-705: v >= 1.26

    rozkaz:             GXxx<EOL>
    odpowiedź:          GX:xx dd dd ... dd ss<EOL>
       xx - numer 256 bajtowej strony pamięci zapisany jako dwie cyfry
            hexadecymalne (numerowane od zera).
       dd - kolejne lokacje pamięci zapisane hexadecymalnie (256 lokacji)
       ss - suma kontrolna transmisji zapiasana jako dwie cyfry
            hexadecymalne

    przykład:           GX00<EOL>
                        GX:00 23 F0 12 44 .... 44 71 F2<EOL>
                              ----------------------
                                     256 wartości

    uwagi:      suma kontrolna ma taką wartość, że suma po wszystkich
                wartościach lokacji na stronie plus wartość sumy kontrolnej
                modulo 256 daje wartość 0xff, co można przedstawić tak:

                    (dd[0] + dd[1] + .. + dd[0xff] + ss) % 0x100 == 0xff

                wysłanie rozkazu odczytu nieistniejącej strony spowoduje
                trwały błąd odczytu pamięci, tzn. panel będzie sygnalizował
                brak pamięci -- aż do ponownej inicjacji
  --------------------------------------------------------------------------

  --------------------------------------------------------------------------
  --- rozszerzenia w obsłudze pamięci rejestrującej LB-702/LB-705 ----------
  --------------------------------------------------------------------------
    dotyczy:    LB-705: v >= 1.26

  To co napisano w punkcie 'rozkazy do obsługi pamięci rejestrującej
  w LB-702 i LB-705' pozostaje w mocy. Dodano nowy format rejestracji
  dla panelu wyposażonego w sonde LB-701p4 z ustawioną flagą szerokiego
  zakresu pomiaru temperatury (-200..+550). Odróżnienie formatu możliwe
  jest przy interpretacji początkowego bajtu nagłówka.

  format nagłówka:
    - bajt: 0xF2 (wartość 0xF2 nie występuje w innym kontekście)
    - bajt: minuty startu rejestracji
    - bajt: godzina startu rejestracji
    - bajt: dzień startu rejestracji
    - bajt: miesiąc startu rejestracji
    - bajt: interwał rejestracji - kodowanie interwału opisano przy
                                   rozkazie `@4'

  format rekordu danych (2 bajty rozpisane na bity):
    - 0    0  TX.7  TX.12 TX.11 TX.10 TX.9  TX.8
    - 0 TX.6  TX.5  TX.4  TX.3  TX.2  TX.1  TX.0

   gdzie TX oznacza temperaturę, numer po kropce jest numerem bitu
   (liczonym od 0). Zdekodowana wartość temperatury jest zawyżona
   o 2000 i podana w dziesiątych stopnia C. Po zdekodowaniu otrzymuje
   się wartości zapisane binarnie.

   W pojedynczej sesji odczytu pamięci rejestrującej możliwe jest
   odczytanie bloków danych w różnych formatach, co za tym idzie
   należy po każdym nagłówku rejestracji pamiętać jaki jest format
   rekordu danych.
  --------------------------------------------------------------------------


  --------------------------------------------------------------------------
  ---   nowe rozkazy dla LB-725 wer >= 2.26 --------------------------------
  --------------------------------------------------------------------------
  Dodane zostały rozkazy pojawiające się w LB-702 v.3.30:
  - rozkazy 'KU' i 'KC', działają tak jak opisano dla LB-702.
  --------------------------------------------------------------------------

  --------------------------------------------------------------------------
  ---   nowe rozkazy dla LB-702 wer >= 3.31 - (obsługa barometru)  ---------
  --------------------------------------------------------------------------
  - odczyt słowa statusowego barometru (zmiana odpowiedzi rozkazu)

    dotyczy:    LB-702: v >= 3.31

    rozkaz:             JV<EOL>
    odpowiedź:          JV:xxxx<EOL>
       xxxx - cztery cyfry hexadecymalne kodujące status, bity:
         0..14  - jak w poprzedniej definicji
         15     - zezwolenie na brak sondy LB-701

    uwagi: jak w poprzedniej definicji

           Zezwolenie na brak sondy jest parametrem konfigurowanym podczas
           produkcji panelu - przy braku sondy LB-701 panel nie sygnalizuje
           'braku sondy'. Program użytkownika powinien testować ten bit i
           jeśli jest ustawiony, to nie sygnalizować braku sondy LB-701
           jako błąd mimo, że sondy faktycznie nie podłączono.

           Jeśli ustawione jest zezwolenie na brak sondy i występuje brak
           sondy, to stosuje się inny format wyswietlania wyników:
           ciśnienia w hPa, mmHg oraz zegar i bity 0..2 nie mają znaczenia.
  --------------------------------------------------------------------------