FULL-C: OneWire

Verze z 19. 3. 2021, 11:07, kterou vytvořil Adamn (diskuse | příspěvky)
(rozdíl) ← Starší verze | zobrazit aktuální verzi (rozdíl) | Novější verze → (rozdíl)
Tato stránka popisuje programovací jazyk FULL-C, který je dostupný na vybraných zařízeních SDS. 
Některá zařízení používají SDS-C, pro který máme návody jinde na této WiKi.

1-W

Zařízení SDS (OnlineTechnology.cz) druhé produktové řady poskytují komunikační rozhraní OneWire(TM), zkráceně 1-W.

Velmi podobé funkce nabízí i SDS první produktové řady, ale s jistými odlišnostmi, které na této stránce nejsou uvedeny, protože tato stránka se specificky věnuje jen SDS druhé produktové řady.


Funkce 1-W v SDS

Zařízení SDS (2. produktová řada) automaticky obsluhuje obě své 1-W sběrnice. Na každé sběrnici může být trvale připojeno až 64 zařízení, takže na jedno SDS může být připojeno nejvíce 128 OneWire zařízení (za předpokladu, že napájení každého z těchto zařízení neklesne pod výrobcem stanovenou mez, což se může stát z různých fyzikálních důvodů - a není to samozřejme problém řešit, např. doplňkovými napájecími zdroji).

Pod pojmem OneWire zařízení si lze představit jakékoliv zařízení, které splňuje normu 1-Wire. Specificky pro SDS, je nutné říct že na SDS 1-W sběrnice lze připojit skutečně jakékoliv kompatibilní zařízení (a nic se "nerozbije" nebo nepřestane komunikovat), ale jen některá z nich budou schopna být i programově obslouženy (a ty která SDS "nezná" tak je ignoruje - přeskočí).

Typicky, zařízení SDS (FW 2017) podporuje různé teploměrné chipy (samozřejmě každý typ má jiné vlastnosti, zejména přesnost měření teploty):

  • DS18S20
  • DS18B20 (doporučený chip)
  • DS1822
  • MAX31826
  • DS28EA00

A dále lze připojit chip DS1990(A) jehož jedinou funkcí je "ohlásit svou přítomnost (připojení ke sběrnici)". Toto je tzv. "i-Button chip", tzn. dynamicky připojitelný chip, který se používá pro identifikaci (uživatele, věci, výrobku, atd.) v rámci např. přístupových systémů.


Zařízení SDS tedy automaticky komunikuje s každým připojeným zařízení, přičemž postupuje "krok-za-krokem" - tedy - obslouží první zařízení, po něm druhé, pak třetí, atd. až na konec (64) a pak zase od začátku, a pořád dokola, bez přerušení. Protože jsou k dispozici dvě nezávislé sběrnice, děje se tato činnost paralelně (první zařízení na sběrnici A a první zařízení na sběrnice B, a tak dále).

Stav této činnosti je stále k dispozici, a dá se získat různými způsoby. Vždy je vidět na vybrané webové stránce (webová administrace SDS), a dále je k dispozici pro FULL-C program, který si může tyto údaje zjistit dotazem přes příslušnou funkci.

Data ze 1-W sběrnic jsou tedy k diposizici i na specifických datových souborech (M2M soubory), které lze z SDS stáhnout:

  • onewire.xml
  • onewire.csv
  • temp.xml
  • temp.txt


FULL-C: Stav sběrnice 1-W

V první řadě váš FULL-C program potřebuje vědět, v jakém stavu je samotný systém SDS - jestli má schopnost pracovat se svými 1-W sběrnicemi. Pokud nemá, nemají všechny další kroky smysl.

-----------+---------+------+----------------------------------------------
  index    | i\u\f\a | směr |  popis 
-----------+---------+------+----------------------------------------------
 2998      | u       |  GET |  general 1-W Master Chip status: 1/2/4/8/16
 2998      |         |  SET |  n/a (read-only)
-----------+---------+------+----------------------------------------------
 2999      | u       |  GET |  general 1-W Master Chip status: detection-retry countdown
 2999      |         |  SET |  n/a (read-only)
-----------+---------+------+----------------------------------------------

Index 2998 udává stav systému:

1   = systém se teprve spouští (ověřování stavu hardware uvnitř SDS - detekce 1-W Master chipů)
2   = porucha - ale bude ješte následovat další pokus o spuštění (po 10 vteřinách) (max 4 pokusy)
4   = porucha - už nebudou další pokusy
8   = VŠE V POŘADKU - vše funguje
16  = obě sběrnice 1-W jsou zakázany (vypnuty) uživatelem

Samozřejmě je žádoucí vidět index 2998 s hodnotou 8, tj. vše funguje.

Speciální hodnota 16 je tam pouze v případě že vy ve vašem FULL-C programu zavoláte speciální funkci SDS_disable_onewire() - což je vždy žádoucí pokud 1-W sběrnice nevyužíváte (příklad: OEM aplikace modulu SDS-STSW, kde 1-W není fyzicky použita).

Pro případ hodnoty 2, se systém SDS pokusí o opakování spuštění obsluhy 1-W sběrnice. Pokud se to ani po několikaterém opakování nepovede, zůstane 1-W vypnuta, až do restartu (kdy se SDS opět po svém spuštění pokusí svůj interní 1-W hardware inicilizovat). Pokud uvidíte hodnotu 4, tak to obvykle znamená poruchu hardware, a SDS bude potřeba opravit nebo vyměnit.

Pro hodnotu 2 (stále index 2998) je k dispozici doplňkový údaj v indexu 2999, který ukazuje počet zbývajících násobků 10msec času, do dalšího pokusu.


FULL-C: jednotlivé zařízení na 1-W

Pro každé z celkem 2x 64 zařízení udržuje SDS svou vnitřní stavovou strukturu. K té je se možné dostat různými způsoby, a to jak ve formě interpretovaných dat v M2M datových souborech (viz výše) nebo na webové administraci SDS, tak také pomocí funkcí FULL-C a dále je v programu zpracovat.

Každé 1-W zařízení má uvnitř SDS tyto čtyři datové body:

  • Konfigurační Struktura s těmito údaji:
    • ROM-CODE identifikace připojeného zařízení
    • Uživatelský název (jen pro "orientaci" bez vlivu na vnitřní funkci SDS, např. "Čidlo Venkovní Teploty")
  • stav respektive aktuální akce od SDS - např. "Start převodu teploty"
  • Základní přečtená hodnota (např. Změřená teplota z teplotního čidla)
  • Doplňková přečtená hodnota (využívá se podle typu 1-W zařízení, u těch zařízení, které při čtení vracejí více než jednu hodnotu)

Ke každemu z těchto bodů se přistupuje specificky, pomocí FULL-C funkcí pro čtení hodnot.

-----------+---------+------+----------------------------------------------
  index    | i\u\f\a | směr |  popis 
-----------+---------+------+----------------------------------------------
 2000..2063| u   (a) |  GET |  [1-W BUS (A)] device status
 2000..2063|         |  SET |  n/a (reserved)
-----------+---------+------+----------------------------------------------
 2100..2163| a       |  GET |  [1-W BUS (A)] konfigurační Struktura
 2100..2163|         |  SET |  n/a (reserved)
-----------+---------+------+----------------------------------------------
 2200..2263| i   (a) |  GET |  [1-W BUS (A)] přečtená hodnota (základní)
 2200..2263|         |  SET |  n/a (reserved)
-----------+---------+------+----------------------------------------------
 2300..2363| i   (a) |  GET |  [1-W BUS (A)] přečtená hodnota (doplňková)
 2300..2363|         |  SET |  n/a (reserved)
-----------+---------+------+----------------------------------------------
 2500..2563| u   (a) |  GET |  [1-W BUS (B)] device status
 2500..2563|         |  SET |  n/a (reserved)
-----------+---------+------+----------------------------------------------
 2600..2663| a       |  GET |  [1-W BUS (B)] konfigurační Struktura
 2600..2663|         |  SET |  n/a (reserved)
-----------+---------+------+----------------------------------------------
 2700..2763| i   (a) |  GET |  [1-W BUS (B)] přečtená hodnota (základní)
 2700..2763|         |  SET |  n/a (reserved)
-----------+---------+------+----------------------------------------------
 2800..2863| i   (a) |  GET |  [1-W BUS (B)] přečtená hodnota (doplňková)
 2800..2863|         |  SET |  n/a (reserved)
-----------+---------+------+----------------------------------------------

Nejprve si všimněte důležitého detailu, a to, že k jednotlivým 1-W sběrnicím (sběrnice A a sběrnice B) se přistupuje odděleně. V následujícím textu provedeme popis pro 1-W sběrnici A, přičemž vše platí i pro sběrnici B, jen je potřeba použít jiné čísla indexů (viz tabulka), což je jediný rozdíl.


Indexy 2100 až 2163 (respektive 2600 až 2663) vracejí data konfigurační struktury s tímto obsahem:

struct OW_DEVICE_CFG_t {
  unsigned char ROMcode[8];
  unsigned char DeviceName[16+1];
};

Příklad FULL-C kódu je k dispozici na stránce FULL-C: set and get: detailed.

Pozn. při každé žádosti o 1-W Konfigurační Strukturu sahá SDS do pevné paměti (DF) aby přečetl DeviceName. SDS používá cache, ale pouze na čtyři tyto pole textu, které jsou v rámci jedné DF stránky (tj. 0,1,2,3 jsou spolu, pak 3,4,5,6 jsou spolu, a tak dále). Proto je doporučeno optimalizovat přístup (dotazy) tak, aby se četlo postupně, výrazně se tím celý proces zrychlí (využije se cache a načítání z DF bude jen jednou za čtyři postupné dotazy). Samozřejmě není zde jakékoliv omezení pro jakkoliv náhodný přístup k těmto datům, jde zde jen o tip jak být optimální při psaní kódu pro SDS.

Pokud není na dané pozici připojené zařízení, je ROMcode buď celý nastaven na 0x00 nebo na 0xFF. Pokud je tedy celé pole ROMcode souvisle vyplněno jednou z těchto hodnot, může se FULL-C program spolehnout že na dané 1-W sběrnici a na dané pozici nic připojeno není.


Indexy 2000 až 2063 (respektive 2200 až 2263) vracejí aktuální živý status pro každé připojené zařízení.

Hodnota využívá slovo o délce 17 bitů, a tyto bity jsou použity následovně:

LOCKBIT WS WS WS WS WS WS WS WS DS DS DS DS DS DS DS DS
     16 15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0

Takže:

  • LOCKBIT = pouze 16. bit
  • WS = 15. bit až 8. bit včetně (je to potřeba "vykrojit" a "posunout")
  • DS = 7. bit až 0. bit včetně (je to potřeba "vykrojit")

Parametry WS a DS jsou čísla o hodnotě 0 až 255 - což je zřejmé, protože každý parametr je vyjádřen osmi bity. Je potřeba umět ty hodnoty vyjmout z celého slova, např. takto:

uint32_t hodnota;
uint8_t WS, DS;
uint32_t Lock;
//
hodnota = SDS_get_u32(2000); // index zvolte dle pozice čidla, zde 2000 pro úplně první čidlo
//
WS = hodnota & 0x000000FF; 
DS = (hodnota & 0x0000FF00) >> 8;
Lock = hodnota & 0x10000;
//

// příklady vyhodnocení
if (5 == WS) printf("výsledek převodu teploty je k dispozici\n");
if (3 == DS) printf("zřejmě chyba na sběrnici, opravte si ji\n");
if (0 != Lock) printf("čidlo je zamčeno\n");

Plný popis hodnot:

Parametr WS (po extrakci - bitovém posunu na 0. bit) má tyto možné dekadické hodnoty:

  • Teplotní čidla (DS18B20 a podobné)
    • 0 = prvotní start (po zapnutí SDS, teprve se chystá něco dělat)
    • 1 = spouští se převod teploty
    • 2 = převod spušten (příkaz poslán přes 1-W sběrnici do 1-W zařízení), čeká se na dokončení měření a převodu teploty na digitální údaj
    • 3 = porucha (nepovedlo se spustit převod)
    • 4 = SDS se chystá přečíst výsledek (čtení dat přes 1-W sběrnici ze 1-W zařízení)
    • 5 = výsledek měření a převodu teploty byl úspěšně přečten a je k dispozici
    • 6 = chyba čtení výsledku, data nejsou k dispozici
    • 15 = teploměrný chip nenalezen (na dané pozici na sběrnici)

Parametr DS (po extrakci) má tyto možné dekadické hodnoty:

  • 0 = nic (se neděje)
  • 1 = SDS ví že by na dané pozici mělo být 1-W zařízení, ale ještě s ním nekomunikoval (toto je stav po zapnutí SDS)
  • 2 = stala se generická, blíže neurčená chyba (podívejte se na hodnotu WS)
  • 3 = stala se chyba CRC (neplatné data) při komunikaci na sběrnici (rušení, porucha kabeláže, chybné čidlo, nízké napájecí napětí, chybějící čidlo, atd.)
  • 8 = SDS pracuje (tzn. sběrnice je aktivní, probíhá komunikace), sledujte hodnotu WS
  • 10 = pouze pro Teploměrná Čidla: poslední pokus o komunikaci s teploměrným čidlem selhal
  • 11 = pouze pro Teploměrná Čidla: poslední pokus o komunikaci s teploměrným čidlem byl úspěšný, hodnoty jsou k dispozici a jsou platné

Parametr LOCKBIT - je buď nastaven (log1) nebo ne (log0) a jen informuje o konfiguraci dané pozice (zda-li uživatel danou pozici "uzamkl" tzn. nebude při 1-W Rescan akci přepsána).


Indexy 2200 až 2263 (respektive 2700 až 2763) vracejí aktuální živou hodnotu přečtenou ze zařízení - napŕ. teplotu z teplotního čidla.

Tato hodnota je reprezentována jako "signed int" (32-bit se znaménkem), takže je často "upravena" tak, aby mohla (trikem) přenést desetinná čísla.

Příklad: Teplotní čidlo změří teplotu -15.89 stupňů Celsia. Hodnota pak bude zapsána tak, že ji SDS nejprve vnitřně vynásobí 100, a až pak dá k dispozici FULL-C programu - takže pro tento příklad, hodnota bude -1589.

Samozřejmě závisí na typu konkrétního připojeného 1-W zařízení na dané pozici - např. převod hodnoty násobení 100 aplikuje SDS jen u teplotních čidel (viz seznam výše). Vždy závisí na daném zařízení a firmware v SDS.


Další dotazy

Pokud je dále něco nejasné, napište to na naše Fórum.