NVT-CW-driver (Web51driver) je ovladač do prostředí Control Web pro zařízení HW group, která komunikují po ethernetu pomocí příkazů NVT. Jedná se například o produkty I/O Controller, modul Charon I, PortBox, PortStore a další.
Control Web je otevřený komponentový průmyslový řídicí a informační systém reálného času pro operační systémy Windows.
Popis ovladače
NVT-CW-driver (starší název Web51driver) je velice jednoduchý driver s jedním vystupním a jedním vstupním kanálem. Komunikace mezi jádrem ControlWebu a driverem je velmi zjednodušená. Hlavní kostra driveru vychází v příkladů, které se nainstalují do adresáře „.\DDK“ v průběhu instalace aplikace ControlWeb.
Driver je psán v jazyce C++ . Byl přeložen v Microsoft Visual C++ ver. 6.0
Instalace driveru
Soubor Web51driver.dmf kopírovat do adresare DFM, soubor Web51driver.par do adresáře PAR a Web51driver.dll (driver) do hlavního adresáře aplikace.
Pro vlasní instalaci se následně osvědčil následující postup - smažte soubor „drivers.ini“ a spusťe ControlWeb. Aplikace prohledá dostupné ovladače a vytvoří si nový soubor „drivers.ini“.
Funkce Init (inicializace)
-
ze souboru „Web451driver.par“ načte IP adresu a číslo portu
- vytvoří a spustí pro driver vlastní vlákno. To se pokusí navázat TCP spojení s modulem. Hlavním úkolem vlákna je zpracovávat přijaté zprávy. Pro nás je nejdůležitější zpráva WM_STARTOUTPUT, která do TCP spojeni odešle data z fronty „WriteBuffer“
- počítadlo počtu odeslaných NVT příkazů se nuluje
Funkce Done - ukončí vlákno driveru
Funkce Zápis
Kanál 6 – odeslani NVT příkazu, který naství LEDky modulu. Do otevřeného TCP spojení odešle NVT příkaz FF FA 2C 33 XX FF F0. Zároveň se inkrementuje počítadlo „OutputCount“ počtu odeslaných NVT příkazů. Hodnotu této proměné je možno číst prostřednictvím vstupního kanálu driveru. Používají tyto procedury ovladače:
- OutputRequest – do fronty „WriteBuffer“ uloží odesílaný NVT příkaz
- OutputRequestCompleted – zašle zprávu vláknu driveru. Po příjetí zprávy vláknem jsou data odeslana do spojení.
- OutputFinalized - vždy vrací 1, tudíž se nečeká na dokončení operace a není potřeba volat funkci DriverCallBack
Funkce Čtení
Kanál 2 – nedochází ke čtení dat z TCP spojení. Jádru ControlWebu se předává pouze hodnota proměnné „OutputCount“. Používají tyto procedury ovladače:
-
InputRequest a InputRequestCompleted – neprovádí nic
- InputFinalized - vždy vrací 1, tudíž není potřeba čekat na dokončení operace (požadovaná hodnota je k dispozici v promené „OutputCount“) a také není potřeba volat funkci DriverCallBack
- GetInput – předá jádru ControlWebu požadovanou hodnotu „OutputCount“ prostřednictvím proměné InputValue typu pointer na TValue.

Součástí driveru je i velmi jednoduchá aplikace, která demonstruje použití driveru a počítá počet odeslaných NVT příkazů.
Co je to ControlWeb
ControlWeb2000 je univerzální nástroj pro vývoj a nasazování vizualizačních a řídicích aplikací, aplikací sběru, ukládání a vyhodnocování dat, aplikací rozhraní člověk-stroj. Unikátní objektově-orientovaná komponentová architektura zajišťuje aplikacím systému ControlWeb2000 nejširší rozsah nasazení od prostých časově nenáročných vizualizací až po řídicí aplikace reálného času.
Hlavním cílem návrhu systému ControlWeb2000 je učinit realizaci běžných úkolů snadnou a neobvyklých, komplikovaných úkolů možnou. Samozřejmě při respektování všech existujících standardů pro běh programů a jejich uživatelské rozhraní, výměnu dat a přístup k databázím, komunikaci po počítačových sítích a spolupráci s hardware pro sběr dat a řízení. ControlWeb2000 pracuje v prostředí operačních systémů implementujících aplikační programové rozhraní Win32 a podporuje řadu průmyslových standardů a de-facto standardů.
Vzhled aplikace
Grafické uživatelské rozhraní (Graphical User Interface — GUI) způsobilo nejen revoluci ve způsobu práce spočítačem, ale i zásadní změny ve tvorbě aplikací grafické rozhraní využívající. Na rozdíl od programů pracujících v textovém módu s příkazovým řádkem, kdy se uživatel musí dopředu seznámit s příkazy a možnostmi aplikace, grafické uživatelské rozhraní nabízí své funkce uživateli v podobě menu, tlačítek a jiných grafických prvků.
Tomu se musí přizpůsobit i konstrukce aplikace. Program nemůže prostě analyzovat data zadaná uživatelem, provést akci a skončit nebo čekat na další povel. Množství akcí uživatele je totiž obrovské a nelze je podchytit v jediném algoritmu. Řešení se ukázalo v podobě tzv. událostmi řízených programů. V aplikaci neběží žádný "hlavní program", namísto toho existuje množství malých podprogramů reagujících na specifické události, např. na stisk klávesy nebo pohyb myši. Tyto podprogramy jsou vždy spojeny s jednotlivými grafickými objekty zobrazenými na obrazovce — jinak reaguje na stisk klávesy povelové tlačítko a jinak reaguje editační řádek. Vizuální struktura aplikace je tedy důsledně svázána sjejí funkčností nebo alespoň sfunkčností jejího uživatelského rozhraní.

Elementárním stavebním kamenem aplikace systému ControlWeb je virtuální přístroj. Virtuální přístroje tvoří nejen funkční kostru celé aplikace, ale i jednotlivé elementy grafického uživatelského rozhraní aplikace. Ne každý virtuální přístroj ale musí být viditelný a některé přístroje ani viditelné být nemohou.
Ovladače a kanály
Díky technologii kanálů, komunikuje prostředí vizualizace s reálným zařízením prostřednictvým kanálů. Kanály jsou datové elementy, které mají vztah k reálným snímačům nebo řídicím prvkům.
- je-li kanál připojen na snímač, jde o kanály vstupní (určené k měření)
- je-li kanál připojen řídicí prvek, jde o výstupní (určené k zápisu dat do technologie)
Obousměrné kanály jsou kombinací vstupního a výstupního kanálu a systém se k nim chová podle situace, v níž jsou použity. Obousměrný kanál použitý jako vstup bude měřen, obousměrný kanál použitý jako výstup bude zapisován
Veškerá komunikace kanálů aplikace probíhá pomocí ovladačů, každý ovladač je spjat snějakým "svým" zařízením, se kterým dokáže komunikovat a je schopen předávat vstupně/výstupnímu zařízení požadavky aplikace.
Každý kanál má své číslo — číslo kanálu v ovladači — které se používá při definici kanálu v aplikaci. Pomocí tohoto čísla tedy dochází k logickému propojení pojmenovaného kanálu — datového elementu s kanálem — částí ovladače. Číslo kanálu v ovladači je základní informace, která se při výměně dat mezi jádrem a ovladačem používá k rozlišení kanálu. Toto číslo je jedním z parametrů funkcí rozhraní ovladače (OutputRequest, GetInput,...).
Textový soubor *.dfm (mapový soubor) obsahuje popis dostupnych kanálů v ovladači. Každý řádek definuje číslo kanálu ovladače (případně interval), datový typ kanálu a směr kanálu. Příklad souboru "Web51driver.dmf" :
begin
2 integer input
6 shortcard output
end.
textový soubor *.par (parametrický soubor) obsahuje parametry ovladače. Príklad souboru "Web51driver.par":
begin
IP=192.168.1.8
PORT=23
end.
Parametry se načítají nejčastěji pro inicializaci ovladače během spouštení aplikace. Jádro komunikuje s ovladačem pomocí procedur ovladače. Pro vstup i výstup je určena samostatná sada procedur, ovladač v principu pracuje tak, že přijímá od jádra požadavky na měření a zápis kanálů, a tyto požadavky postupně vyřizuje.
Ovladače tvoří samostatné komponenty systému, které se do systému ControlWeb zařazují jako dynamicky linkované knihovny (DLL). Každá taková knihovna proto musí mít jednotné rozhraní (interface), které je tvořeno skupinou procedur a funkcí.
Nejdůležitějsí funkce nutné k pochopení komunikace
-
Init - volá se po zavedení ovladače do paměti a slouží k inicializaci ovladače
- Done - volá se při ukončení činnosti ovladače, tj. při zastavení aplikace nebo při odinstalování ovladače spuštěného samostatně, ale také po chybě při inicializaci ovladače
- InputRequest - procedura slouží k předání požadavku na získání hodnoty kanálu ovladače. Volá se postupně pro všechny požadované kanály.
Zadávání požadavků se ukončí voláním procedury InputRequestCompleted.
- InputRequestCompleted - procedura ukončí zadávání požadavků na čtení kanálů ovladače (InputRequest). V tomto okamžiku může ovladač zahájit činnost vedoucí k získání všech požadovaných hodnot (zahájení měření, komunikace apod.)
- InputFinalized - volá se po zadání požadavků na čtení kanálů a zahájení operací čtení (InputRequestCompleted) postupně pro všechny požadované kanály. Vrací hodnotu 1, je-li operace ukončena. Nejsou-li hodnoty kanálů ještě k dispozici, vrátí hodnotu 0. V tomto případě je nutno po doměření zavolat proceduru DriverCallback. To způsobí opětovné volání procedury InputFinalized, která může nyní vrátit hodnotu 1.
- GetInput - pomocí této procedury se přečte hodnota kanálu z ovladače a zapíše se do tabulky aktuálních hodnot kanálů, kde je k dispozici pro všechny virtuální přístroje. Hodnota kanálu se přenáší proměnnou ChannelValue, která je typu TValue (viz. soubor "cwdriver.h" v adresáři "ddk").
- OutputRequest - procedura slouží k předání požadavku na zápis hodnoty kanálu do ovladače. Volá se postupně pro všechny požadované kanály. Zadávání požadavků se ukončí voláním procedury OutputRequestCompleted.
- OutputRequestCompleted - procedura ukončí zadávání požadavků na zápis kanálů do ovladače po volání OutputRequest. V tomto okamžiku může ovladač zahájit činnost vedoucí k zápisu všech požadovaných hodnot
- OutputFinalized - volá se po zadání požadavků na zápis kanálů a zahájení operace zápis (OutputRequestCompleted) postupně pro všechny požadované kanály. Vrací hodnotu 1, je-li operace ukončena. Nejsou-li hodnoty kanálů ještě zapsány, vrátí hodnotu 0. V tomto okamžiku je nutno po dokončení zápisu zavolat proceduru DriverCallback.
- DriverCallback - tato procedura slouží k tomu, aby ovladač signalizoval do systému dokončení vyvolané akce nebo k vyvolání vyjímky ovladače
Další funkce
- Version - vrací číslo verze rozhraní (API) ovladače.
- GetDriverInfo - vrací jméno ovladače pro zobrazení v inspektoru ovladačů
- Check - volá se po zavedení DLL knihovny pro zjištění kompatibility ovladače s API
- DisposeDriver - volá se při ukončení aplikace nebo při odinstalování ovladače, který byl spuštěn samostatně. Toto volání následuje za voláním procedury Done.
- MakeDriver
- BufferInfo
- SetBufferAddr
- DriverProc
- QueryProc
- GetInput2 = GetInput (Rozšíření v Control Web 2000)
- OutputRequest2 = OutputRequest (Rozšíření v Control Web 2000)
Popis komunikace z originálního Helpu
Výměna dat mezi jádrem a ovladačem je při čtení i zápisu velmi podobná. Protokol těchto výměn je vobou případech shrnut do tří významově shodných kroků, které jsou realizovány pomocí pěti (nebo čtyř) procedur.
Při čtení dat (měření) používá jádro tyto procedury ovladače (všechny procedury kromě InputRequestCompleted zpracovávají jeden kanál a všechny proto mají v jednom svém parametru jeho číslo).
- InputRequest — proceduru jádro volá ovladači jednotlivě pro každý kanál, který si přeje změřit. Procedura je volána tak dlouho, dokud jádro ovladači neoznámí všechny kanály, které potřebuje. Jádro proceduru volá ve všech případech, kdy zahajuje vstupní komunikaci — tedy i během přerušované aktivace. Dokud ovladač neukončí komunikaci daného kanálu pomocí procedury InputFinalized, není InputRequest pro daný kanál volána i přesto, že aplikace požaduje novou hodnotu tohoto kanálu opakovaně.
- InputRequestCompleted — po dokončení všech volání procedury InputRequest jádro voláním této procedury ovladači oznamuje, že již nemá další požadavky a že tudíž ovladač může začít měřit.
- InputFinalized — proceduru jádro ovladači volá jednotlivě pro každý dosud nezměřený kanál bezprostředně po volání procedury InputRequestCompleted.
Jádro InputFinalized volá pro daný kanál poprvé vždy po volání procedury InputRequestCompleted. Pokud kanál není doměřen, může jádro tuto proceduru volat opakovaně v případě, kdy buď probíhá jiný (nový) časový krok jádra a nebo když je ovladačem požádáno, aby dokončilo komunikaci doměřených kanálů. Jinými slovy, dokud není kanál doměřen, volá jádro tuto proceduru "v příhodných okamžicích".
Ovladač musí podle aktuálního stavu komunikace daného kanálu jádru podat korektní informaci. Má-li ovladač kanál změřen, musí vrátit hodnotu true, nemá-li ovladač kanál změřen, musí vrátit hodnotu false. V prvém případě jádro okamžitě změřenou hodnotu zovladače vyčítá procedurou GetInput. Ve druhém případě, kdy ovladač ještě nemá data k dispozici, jádro pouze kanál vnitřně zařadí do seznamu nezměřených kanálů.
Ovladač může komunikaci kanálu ukončit chybou (například chyba vypršení času, chyba převodu hodnoty, ...). Tehdy musí procedura InputFinalized vrátit hodnotu true a navíc musí být její návratový parametr sčíslem chyby naplněn nenulovou hodnotou. Informace ochybě je zapsána do okna zpráv a do diagnostických informací kanálu a ovladače. Hlášení chyby není povinné a ovladač je nemusí implementovat.
Ovladač návratem hodnoty false zároveň jádru říká, že sám jádru doměření hodnoty oznámí. Koznámení doměření ovladač musí použít proceduru DriverCallBack skódem dfcDriverInputFinalized. Vokamžiku přijetí této zprávy jádro zajistí opětovné volání InputFinalized pro dosud nezměřené kanály.
Dokud není daný kanál procedurou InputFinalized potvrzen, nebude pro tento kanál volána ani procedura InputRequest ani procedura GetInput. Vpřípadě programové chyby ovladače se proto může stát, že nepotvrzený kanál již nikdy nebude změřen.* Vrátí-li procedura pro alespoň jeden kanál požadovaný vaktuálním měření hodnotu false, čeká jádro po stanovenou dobu na dokončení komunikace. Po tuto dobu aplikace neběží a ovladač může průběžně dodávat nově doměřená data. Pokud komunikační prodleva vyprší, pokračuje jádro saktivací přístrojů a použijí se naposledy změřené hodnoty. Prodleva je vypočítána jako maximum ze všech prodlev jednotlivých nedoměřených kanálů, přičemž se nikdy neuplatní hodnoty prodlev kanálů nepotvrzených již v předchozích měřeních.
- GetInput — vrátí-li procedura InputFinalized hodnotu true a není-li nastaven žádný chybový kód, volá jádro jednu z těchto procedur pro vyčtení hodnoty kanálu zovladače
DriverCallBack skódem dcfDriverInputFinalized — proceduru volá ovladač vpřípadě, že doměřil kanály (jeden nebo více), které jádru dosud nepotvrdil (při volání procedury InputFinalized vrátil ovladač hodnotu false). Jedno volání této procedury může signalizovat více doměřených kanálů, je proto neefektivní volat tuto proceduru pro každý kanál zvlášť. Pokud ovladač DriverCallBack nezavolá (zapomene na něj) nemusí jádro vurčitých případech (záleží to na konstrukci aplikace) již nikdy
daný kanál po ovladači požadovat. Je proto důležité vovladači zajistit, aby každému nepotvrzenému kanálu odpovídal nějaký DriverCallBack v okamžiku doměření kanálu.
Při zápisu dat (měření) používá jádro tyto procedury ovladače (všechny procedury
kromě OutputRequestCompleted zpracovávají jeden kanál a všechny proto mají vjednom svém parametru jeho číslo).
- OutputRequest — proceduru jádro volá ovladači jednotlivě pro každý kanál, který si přeje přenést do technologie. Současně sinformací o zápisu kanálu jádro předává proceduře ihodnotu kanálu, kterou potřebuje zapsat. Procedura je volána tak dlouho, dokud jádro ovladači neoznámí všechny zapisované kanály. Jádro proceduru volá ve všech případech, kdy zahajuje výstupní komunikaci — tedy iběhem přerušované aktivace.
- OutputRequestCompleted — po dokončení všech volání procedury OutputRequest jádro voláním této procedury ovladači oznamuje, že již nemá další požadavky a že tudíž ovladač může začít zapisovat do technologie.
- OutputFinalized — proceduru jádro ovladači volá jednotlivě pro každý dosud
nepotvrzený (nezapsaný) kanál bezprostředně po volání procedury
- OutputRequestCompleted.
Jádro OutputFinalized volá pro daný kanál poprvé vždy po volání procedury OutputRequestCompleted. Pokud kanál není dosud zapsán, může jádro tuto proceduru volat opakovaně buď vpřípadě zápisu nového požadavku, nebo probíhá-li jiný (nový) časový krok jádra a nebo když je jádro ovladačem požádáno, aby dokončilo komunikaci zapsaných kanálů. Jinými slovy, dokud není kanál zapsán, volá jádro tuto proceduru "v příhodných okamžicích".
Ovladač musí podle aktuálního stavu komunikace daného kanálu jádru podat korektní informaci. Má-li ovladač kanál zapsán, musí vrátit hodnotu true, nemá-li ovladač kanál zapsán, musí vrátit hodnotu false. Ve druhém případě, kdy ovladač ještě nemá zápis dat do technologie potvrzen, jádro pouze kanál vnitřně zařadí do seznamu nezapsaných kanálů.
Ovladač může zápis kanálu ukončit chybou (například chyba vypršení času, chyba převodu hodnoty, ...). Tehdy musí procedura OutputFinalized vrátit hodnotu true a navíc musí být její návratový parametr sčíslem chyby naplněn nenulovou hodnotou. Informace ochybě je zapsána do okna zpráv a do diagnostických informací kanálu a ovladače. Hlášení chyby není povinné a ovladač je nemusí implementovat.
Ovladač návratem hodnoty false zároveň jádru říká, že sám jádru potvrzení zápisu oznámí. Kpotvrzení zápisu ovladač musí použít proceduru DriverCallBack skódem dfcDriverOutputFinalized. Vokamžiku přijetí této zprávy jádro zajistí opětovné volání OutputFinalized pro dosud nezapsané kanály.
I v případě, že není daný kanál procedurou OutputFinalized potvrzen, může jádro pro tento kanál nově volat proceduru OutputRequest. Jinými slovy, jádro do ovladače zapisuje vždy aktuální hodnotu výstupního kanálu bez ohledu na výsledek jeho předešlé komunikace.
Vrátí-li procedura pro alespoň jeden kanál zapisovaný vdaném komunikačním cyklu hodnotu false, čeká jádro po stanovenou dobu na dokončení komunikace. Po tuto dobu aplikace neběží a ovladač může průběžně potvrzovat nově zapsané kanály. Pokud komunikační prodleva vyprší, pokračuje jádro dále ve svém časovém kroku. Prodleva je vypočítána jako maximum ze všech prodlev jednotlivých nepotvrzených kanálů, přičemž se nikdy neuplatní hodnoty prodlev kanálů nezapsaných již vpředchozích komunikacích.
DriverCallBack s kódem dcfDriverOutputFinalized — proceduru volá ovladač vpřípadě, že obdržel ztechnologického zařízení potvrzení ozápisu kanálů (jednoho nebo více), které jádru dosud nepotvrdil (při volání procedury OutputFinalized vrátil ovladač hodnotu false). Jedno volání této procedury může signalizovat více zapsaných kanálů, je proto neefektivní volat tuto proceduru pro každý kanál zvlášť.
Literatura
Poznámka: Některé části jsou opsány doslova...
- Help aplikace ControlWeb 2000
- Kniha ControlWeb 2000, Computer PRESS Praha, 1999
Download & odkazy
- Control Web 2000
Control Web je otevřený komponentový průmyslový řídicí a informační systém reálného času pro operační systémy Windows 95 a vyšší a Windows NT 4.0 a vyšší. (více..)
- NVT-CW-driver
- /DemoCW = soubory ukázkové aplikace (Web51demo.cw, Web51demo.IDE)
- /Driver = Soubory samotného driveru (Web51driver.dll, Web51driver.dmf, Web51driver.par).
- /Driver_src = Zdrojové kódy driveru pro MSVC verze 6
|