3.2 Využití alarmů programu owfs


PIC


Obrázek 3.3: Příklad vyplnění konfiguračního dialogu pro alarm

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




Tabulka 3.1: Stavový automat zpracování alarmů