OQL (Operation Query Language) jest deklaratywnym DSL do testów sprzętu diagnostycznego (aparaty oddechowe Dräger, piADC, pompy DRI0050, zawory Modbus, płuca TIC249, itd.).
Przed uruchomieniem scenariusza w trybie realnym użyj preflightu sprzętowego:
oqlctl doctor
oqlctl detect
doctor porównuje lokalną detekcję USB/serial/I2C/Modbus z oqlos.yaml i
firmware bridge. Jeśli wykryje niezgodność parametrów Modbus, oqlctl doctor
--fix może bezpiecznie zaktualizować tylko plugins.modbus-io.connection_params
po wcześniejszym utworzeniu oqlos.yaml.bak.
Wersja 3 radykalnie upraszcza składnię:
pump-main, nie 'pump-main').= — każda komenda zna swoją strukturę argumentów, więc
parser nie musi zgadywać.IF/ELSE/ENDIF. Warunki to CHECK min <= sensor <= max unit.MACRO wywoływane przez CALL.°, ³, μ są legalne w nazwach.SET pump-main 5.0 l/min
│ │ │ │
│ │ │ └─ UNIT opcjonalny, może zawierać '/'
│ │ └──────── VALUE liczba (int | float | ujemna)
│ └──────────────── TARGET identyfikator
└────────────────────────── CMD zawsze UPPERCASE
| Komenda | Składnia | Działanie |
|---|---|---|
SET |
SET target value [unit] |
Ustaw peryferium lub zmienną |
GET |
GET sensor |
Odczytaj sensor (alias READ) |
WAIT |
WAIT duration |
3s, 500ms, 3000 (bare = ms) |
SAVE |
SAVE label |
Zapisz bieżący wynik do protokołu |
CHECK |
CHECK min <= sensor <= max unit |
Range assertion |
MIN |
MIN sensor value unit |
Dolna granica |
MAX |
MAX sensor value unit |
Górna granica |
SAMPLE |
SAMPLE sensor START\|STOP [interval] |
Sampling w tle |
LOG |
LOG "wiadomość" |
Wiadomość informacyjna |
ERROR |
ERROR "wiadomość" |
Przerwij z błędem |
CALL |
CALL macro-name [arg1 arg2 …] |
Wywołanie makra |
INCLUDE |
INCLUDE "ścieżka.oql" |
Dołącz bibliotekę makr |
GOAL: — blok wykonawczy (cel testowy). Nazwa ustawiana przez SET NAME 'nazwa' wewnątrz bloku.GOAL name: — stara składnia, nadal obsługiwana dla kompatybilności wstecznej.CONFIG name: — blok inicjalizacyjny; semantycznie identyczny z GOAL,
ale oznaczony [CONFIG] w logach.MACRO name: — definicja makra (ciało rozwijane przy CALL).Nazwa bloku GOAL może być ustawiona przez SET NAME 'nazwa' (nowa składnia) lub
bezpośrednio w nagłówku (stara składnia). Dla nazw ze spacjami użyj SET NAME 'Nazwa wielowyrazowa'.
Poza blokami można zdefiniować metadane (klucz UPPER_SNAKE, wartość tekstowa):
SCENARIO: Test szczelności maski
DEVICE_TYPE: BA
DEVICE_MODEL: PSS 7000
MANUFACTURER: Dräger
DESCRIPTION: Pełen test leak-test dla PSS 7000
CATEGORY: env
Parser nie zgaduje — każda komenda zna swoją strukturę:
split(None, 1)) — pierwszy token to nazwa
komendy, reszta idzie do parsera komendy.WAIT — jedyna komenda, gdzie value i unit mogą być sklejone:
3s → (3, 's'), 3000 → (3000, 'ms').SET/MIN/MAX — unit to wszystko po pierwszej liczbie; może zawierać
/ i Unicode: l/min, °C, %RH, m³/h.CHECK — ma własne regex (NUM) <= (IDENT) <= (NUM) (UNIT)?.if/elif, każda komenda ma własną
funkcję parsującą. Dodanie komendy = dopisanie jednej funkcji + wpis
w słowniku.Unicode dozwolone. Reguła: identyfikator to token bez białego znaku i
bez znaków składniowych (#, :, =, ", ', [, ]).
pump-main # OK
ciśnienie-NC # OK (polskie znaki)
valve-bo06 # OK
AI01 # OK
Kanoniczny zapis SET używa pojedynczych cudzysłowów dla nazwy i wartości:
SET 'pompa głównego obiegu' '5 l/min'
SAVE [wynik testu maski]
Int, float, ujemne. Przecinek i kropka obsługiwane:
0, 5.0, -10.5, 145, 3,14.
Jeden token po liczbie; może zawierać /, Unicode, cyfry:
bar, mbar, l/min, °C, %RH, m³/h, Pa.
3s, 500ms, 60s, 3000 (bare = ms), 2m, 1h.
Tylko w LOG, ERROR, INCLUDE (wiadomości i ścieżki):
LOG "Rozpoczynam fazę 2"
ERROR "Ciśnienie poza zakresem"
INCLUDE "lib/hardware.oql"
Obsługiwane "..." i '...'; escape \" / \\.
MACRO hw-pump-smoke:
SET pump-main 5 l/min
WAIT 2s
SET pump-main 0
GOAL diagnostyka:
CALL hw-pump-smoke
Makro może używać placeholders $1, $2, … (tekstowe podstawienie
wykonywane przed tokenizacją):
MACRO set-pump-lpm:
SET pump-main $1 l/min
WAIT $2
GOAL ramp:
CALL set-pump-lpm 3 500ms
CALL set-pump-lpm 5 500ms
CALL set-pump-lpm 0 200ms
INCLUDE "ścieżka" rozwiązywane względem:
oqlos/scenarios/ (korzeń).Makra z włączonych plików stają się dostępne w aktualnym dokumencie. Definicje lokalne mają pierwszeństwo.
Targety rozwiązywane przez interpreter do adapterów sprzętowych:
valve-nc, valve-sc, valve-wc, valve-1 … valve-8,
valve-bo04, valve-bo05, valve-bo06.pump-main (DRI0050), pompa-1 (alias).lung-main (TIC249).AI01 (NC), AI02 (SC), AI03 (WC).SCENARIO: PSS 7000 — Test szczelności maski
DEVICE_TYPE: BA
DEVICE_MODEL: PSS 7000
MANUFACTURER: Dräger
INCLUDE "lib/peripherals.oql"
CONFIG reset:
CALL init-all
GOAL:
SET NAME 'Test statyczny SC'
SET pump-main 0
WAIT 3s
GET AI02
SAVE ciśnienie-sc
IF AI02 6.0 .. 8.0 bar
CORRECT 'Ciśnienie SC w normie'
ERROR 'Ciśnienie SC poza zakresem'
GOAL:
SET NAME 'Ciśnienie otwarcia automatu'
SET pump-main 5.0 l/min
SET valve-bo06 1
WAIT 8s
GET AI01
SAVE ciśnienie-nc-min
IF AI01 -29.0 .. -5.0 mbar
CORRECT 'Ciśnienie otwarcia w normie'
ERROR 'Ciśnienie otwarcia poza zakresem'
GOAL:
SET NAME 'Koniec'
CALL stop-all
LOG "Test zakończony"
SAVE test-done
Interpreter detektuje automatycznie składnię:
GOAL: + SET NAME 'nazwa' / CONFIG name: / MACRO name: / INCLUDE "...".GOAL name: nadal działa dla kompatybilności wstecznej.GOAL: Name + 'target' 'value'.Nowa składnia GOAL: + SET NAME 'nazwa' jest zalecana dla wszystkich nowych
scenariuszy. Pliki v1/v2 działają na starej ścieżce parsera (deprecated).
docs/oql-grammar-anatomy.htmloqlos/scenarios/lib/README.mdoqlos/scenarios/OQL-CHEATSHEET.mdoqlos/core/oql_parser.pyoqlos/core/_oql_adapter.py