3.2 Využití alarmů programu owfs
Práce s alarmy patří mezi pokročilé techniky a vyžaduje dobrou znalost owfs a programu owserver. Alarmy doporučujeme použít teprve tehdy, když je odezva ovladače příliš dlouhá (pomalá).
Konfigurace jednoho alarmu je pro případ 1-Wire zařízení založeného na obvodu DS2408 patrná z obr. 3.3. Cesta k signálu (Sensor/Actuator path) se zadává bez počáteční složky /alarm. Po volbě Alarm se zadávají další řetězce. Před spuštěním ovladače se zadané hodnoty předzpracují a uloží do pracovních proměnných pro každý alarm:
- sPath – cesta k zařízení, zde: /29.066418000000. Pro čtení nebo zápis hodnot se před tuto cestu může přidat adresář /alarm a za ni znak / a hodnota některého z řetězců uvedených v následujících položkách
- sSensed – soubor se čtenou hodnotou, zde: sensed.BYTE
- sLatch – soubor s příznakem změny, zde: latch.BYTE
- sAlarmPor – soubor indikující zapnutí napájení daného zařízení, zde: por
- sSet – soubor, do kterého se má zapsat hodnota, určující, kdy se bude alarm generovat (první část položky Set Alarm až ke znaku =), zde: set_alarm
- sSetVal – hodnota, která se má zapsat do souboru sSet (druhá část položky Set Alarm za znakem =), zde: 133333333
- sLatchRes – soubor, do kterého se má zapsat hodnota, určující, že byl alarm obsloužen (první část položky Reset Latch až ke znaku =), zde: latch.BYTE
- sLatchResVal – hodnota, která se má zapsat do souboru sLatchRes (druhá část položky Reset Latch za znakem =), zde: 0
Pro zpracování alarmů je v ovladači OwsDrv použit stavový automat s následujícími stavy:
- NOT_USED – V konfiguraci ovladače není uveden žádný alarm.
- INIT – Počáteční stav automatu.
- ALARM_DIR – Zjišťování obsahu adresáře /alarm.
- ALARM_PROCESS – Začátek zpracování každého alarmu.
- ALARM_POR_READ – Zjišťování zda dané zařízení neprovedlo svou inicializaci po zapnutí napájení (power-on reset) pomocí čtení souboru, jehož jméno je uloženo v řetězci sAlarmPor.
- ALARM_POR_READ_WAIT – Čekání na dokončení čtení zahájeného ve stavu ALARM_POR_READ.
- ALARM_SET – Nastavení generování alarmu na daném zařízení po zapnutí napájení. Do souboru, jehož jméno je určeno řetězcem sSet se zapíše hodnota řetězce sSetVal.
- ALARM_SET_WAIT – Čekání na dokončení zápisu zahájeného ve stavu ALARM_SET. Poté se začnou procházet všechny výstupy (Output). Pokud se najde výstup, jehož cesta začíná řetězcem sPath, zapíše se do příslušného souboru hodnota specifikovaná v položce Init. Value (viz obr. 3.3).
- ALARM_INIT_WRITE_WAIT – Čekání na dokončení každého jednotlivého zápisu počáteční hodnoty z předchozího stavu.
- ALARM_POR_RESET – Smazání příznaku inicializace po zapnutí napájení (power-on reset). Do souboru, jehož jméno je určeno řetězcem sAlarmPor, se zapíše hodnota 0.
- ALARM_POR_RESET_WAIT – Čekání na dokončení smazání příznaku inicializace po zapnutí napájení.
- ALARM_LATCH – Zjištění, zda dané zařízení indikuje výskyt alarmu. V tomto stavu se pošle příkaz na čtení obsahu souboru, jehož jméno je určeno řetězcem sLatch. Pokud je obsah nenulový nebo se v seznamu položek vyskytuje alespoň jedna nenulová, je zdetekován výskyt alarmu od posledního čtení.
- ALARM_LATCH_WAIT – Čekání na dokončení čtení zahájeného ve stavu ALARM_LATCH.
- ALARM_SENSED – Čtení hodnoty signálu po výskytu alarmu. Pokud byl zdetekován výskyt alarmu ve stavu ALARM_LATCH, zahájí se čtení souboru v adresáři /alarm, jehož jméno je určeno řetězcem sSensed.
- ALARM_SENSED_WAIT – Čekání na dokončení čtení zahájeného ve stavu ALARM_SENSED.
- ALARM_LATCH_RESET – Smazání příznaku výskytu alarmu. V tomto stavu se do souboru ve složce /alarm, jehož jméno je určeno řetězcem sLatchRes zapíše hodnota uložená v řetězci sLatchResVal.
- ALARM_LATCH_RESET_WAIT – Čekání na dokončení smazání příznaku výskytu alarmu zahájeného ve stavu ALARM_LATCH_RESET.
- SENSED – Čtení hodnoty signálu, který se mohl změnit ještě před smazáním příznaku výskytu alarmu ve stavu ALARM_LATCH_RESET. V tomto stavu se zahájí čtení obsahu souboru, jehož jméno je určeno řetězcem sSensed.
- SENSED_WAIT – Čekání na dokončení čtení zahájeného ve stavu SENSED.
- ALARM_BYPASS – Stav umožňující mezi obsluhou alarmů provést jeden zápis nebo čtení jiného signálu.
Přechody mezi jednotlivými stavy se řídí tabulkou 3.1. V prvním sloupci je uveden aktuální stav, ve druhém sloupci může být pro každý aktuální stav uvedena jedna nebo několik podmínek, ve třetím sloupci pak je uveden stav, do kterého automat přejde, pokud je splněna příslušná podmínka z druhého sloupce. Pro daný aktuální stav jsou podmínky vyhodnocovány shora dolů.
Č. | Stav | Podmínky přechodu | Nový stav |
-1 | NOT_USED | Při otvírání ovladače nalezen alespoň jeden alarm | INIT |
0 | INIT | Zahájení čtení adresáře /alarm | ALARM_DIR |
1 | ALARM_DIR | Při čtení adresáře /alarm se dojde na jeho konec | ALARM_PROCESS |
2 |
ALARM_PROCESS | Je-li již souvisle přečteno nMaxConsAlarms, pak | ALARM_BYPASS |
Je-li souvisle přečteno méně než nMaxConsAlarms, pak | ALARM_POR_READ | ||
Na konci cyklu alarmů se přiřadí iAlarmPos = -1. Pak | ALARM_BYPASS | ||
3 |
ALARM_POR_READ | Není-li sAlarmPor definován, pak další alarm | ALARM_PROCESS |
Je-li sAlarmPor prázdný, pak | ALARM_LATCH | ||
Po úspěšném přečtení sAlarmPor | ALARM_POR_READ_WAIT | ||
4 |
ALARM_POR_READ_WAIT | Je-li proměnná por různá od nuly | ALARM_SET |
Není-li proměnná por různá od nuly | ALARM_LATCH | ||
5 |
ALARM_SET | Není-li sSet nebo sSetVal definován, pak další alarm | ALARM_PROCESS |
Je-li sSet nebo sSetVal prázdný, pak | ALARM_POR_RESET | ||
iAlarmInitPos = -1; Po úspěšném zápisu pak | ALARM_SET_WAIT | ||
6 |
ALARM_SET_WAIT | Procházení iAlarmInitPos. Pro nalezené zápisy pak | ALARM_INIT_WRITE_WAIT |
Na konci iAlarmInitPos = -1; pak | ALARM_POR_RESET | ||
7 |
ALARM_INIT_WRITE_WAIT | Pokud je iAlarmInitPos < 0, pak | ALARM_POR_RESET |
Jinak | ALARM_SET_WAIT | ||
8 |
ALARM_POR_RESET | Není-li sAlarmPor definován, pak další alarm | ALARM_PROCESS |
Je-li sAlarmPor prázdný, pak | ALARM_LATCH | ||
Po úspěšném zápisu | ALARM_POR_RESET_WAIT | ||
9 | ALARM_POR_RESET_WAIT | Po dokončení požadavku | ALARM_LATCH |
10 |
ALARM_LATCH | Není-li sLatch definován nebo je prázdný, pak další alarm | ALARM_PROCESS |
Po úspěšném přečtení | ALARM_LATCH_WAIT | ||
11 |
ALARM_LATCH_WAIT | Je-li proměnná latch různá od nuly, pak | ALARM_SENSED |
Jinak další alarm | ALARM_PROCESS | ||
12 |
ALARM_SENSED | Není-li sSensed definován, pak další alarm | ALARM_PROCESS |
Je-li sSensed prázdný, pak | ALARM_LATCH_RESET | ||
Po úspěšném přečtení | ALARM_SENSED_WAIT | ||
13 | ALARM_SENSED_WAIT | Po dokončení požadavku | ALARM_LATCH_RESET |
14 |
ALARM_LATCH_RESET | Není-li sLatchRes nebo sLatchResVal definován, pak | ALARM_PROCESS |
Je-li sLatchRes nebo sLatchResVal prázdný, pak | SENSED | ||
Po úspěšném zápisu | ALARM_LATCH_RESET_WAIT | ||
15 | ALARM_LATCH_RESET_WAIT | Po dokončení požadavku | SENSED |
16 |
SENSED | Není-li sSensed definován nebo je prázdný, pak další alarm | ALARM_PROCESS |
Po úspěšném přečtení | SENSED_WAIT | ||
17 | SENSED_WAIT | Po dokončení požadavku | ALARM_PROCESS |
18 |
ALARM_BYPASS | Je-li iAlarmPos >= 0, pak další alarm | ALARM_PROCESS |
Jinak pokračuj od začátku | INIT | ||
[Předchozí] [Na začátek] [Výše] [Další]