TCP/IP ovladač - CWNETDRV

Ovladač je určen pro spojení několika aplikací systému Control Web, které běží na různých počítačích. Tyto počítače jsou propojeny v rámci počítačové sítě nebo se dají spojit přes telefonní linky pomocí modemů. Ke komunikaci se používá síťový protokol TCP/IP. Jméno souboru ovladače je 'cwnetdrv.dll'

Vlastnosti ovladače

Ovladač se funkčně skládá ze dvou částí. První část je ta, která poskytuje data (hodnoty kanálů) pro jiné aplikace - server. Druhou část tvoří klient, který komunikuje s jedním nebo několika servery. Jeden ovladač můžete nakonfigurovat tak, že je buď server nebo klient, anebo současně server i klient. V rámci jednoho ovladače může klient komunikovat s více servery. Následující obrázky znázorňují základní varianty konfigurace ovladače.

Nejjednodušší je propojení dvou ovladačů, kde jeden je definován jako klient a druhý jako server. Klient zapisuje a čte hodnoty kanálů na straně serveru.

Propojení klient - server

Propojení klient - server


Další možností je propojení jednoho serveru s více klienty. Všichni klienti zapisují a čtou hodnoty kanálů na straně serveru.

Dva klienti, společný server

Dva klienti komunikují se společným serverem


Jiný způsob konfigurace je připojení jednoho klienta k více serverům. Klient čte a zapisuje data na různé servery.

Jeden klient, dva servery

Jeden klient komunikuje se dvěma servery


Každý ovladače je nakonfigurován současně jako klient i jako server a vzájemně je propojena serverová a klientská část.

Současně klient - server proti sobě

Dva ovladače současně jako klient a server


Z těchto základních variant lze odvodit i libovolné další způsoby propojení, které jsou jejich kombinacemi.

Princip komunikace

Server má vlastní prostor kanálů, které poskytuje jednotlivým připojeným klientům. Aplikace do těchto kanálů zapisuje nebo je čte. Toto čtení nebo zápis do kanálů serveru ze strany aplikace nevyvolá vlastní komunikaci. Server v sobě pouze udržuje aktuální hodnoty kanálů a dává je k dispozici klientům až na jejich požadavky. Klienti si kanály serveru mapují do vlastního prostoru kanálů podle vlastní definice. Obecně se dá říci, že veškerou komunikaci vyvolává klient. Požadavky na čtení nebo zápis kanálů od aplikace na straně klienta se transformují na požadavky pro daný server. Server požadavek zpracuje a podle potřeby vrátí klientovi data nebo oznámí své aplikaci, že data v něm byla změněna. Server také může poslat ostatním klientům zprávu, že jeho data byla změněna, když do jeho kanálů zapsal jiný klient nebo vlastní aplikace. Následující obrázek ukazuje, co se děje při čtení dat z ovladače na straně klienta:

Čtení dat

Čtení dat z ovladače


  1. aplikace dá požadavek na čtení kanálů svému klientovi
  2. klient přemapuje čísla kanálů a vyšle požadavek serveru
  3. server načte své aktuální hodnoty kanálů a pošle je klientovi
  4. klient předá hodnoty kanálů do aplikace

Zápis kanálů do ovladače na straně klienta znázorňuje obrázek:

Zápis dat

Zápis dat do ovladače


  1. aplikace dá požadavek na zápis kanálů svému klientovi a předá mu hodnoty kanálů
  2. klient přemapuje čísla kanálů a vyšle požadavek s daty serveru
  3. server si uloží hodnoty kanálů a vygeneruje výjimku do aplikace
  4. podle nastavení server pošle zprávu o změně dat ostatním klientům

Část server

Server má svoji množinu kanálů, které čte/zapisuje jednak aplikace nebo jednotliví klienti. Při zápisu dat z klienta bude do aplikace vygenerována výjimka ovladače a také ostatní klienti mohou být upozorněni na změnu. Pomocí parametrů se pro daný server definuje síťový port, síťové jméno nebo síťová adresa. Dále seznam klientů, se kterými může komunikovat (jejich jméno nebo adresa a popřípadě identifikační řetězec). U každého klienta můžete definovat, jestli bude serverem upozorněn na změnu svých dat. Klient, který způsobil změnu dat na serveru, nebude samozřejmě na změnu upozorněn. Místo seznamu klientů, které server akceptuje si můžete zvolit, že server bude odpovídat každému klientovi, který se k němu připojí. Kanály se definují jako seznam bloků různých délek a typů. Server sám nezahajuje komunikaci. Pouze čeká na spojení a odpovídá na požadavky klientů.

Část klient

Klient má definován jeden nebo více vzdálených serverů s jejich množinou kanálů, které může číst nebo zapisovat. Každý server má zadán svůj síťový port a síťové jméno nebo síťovou adresu. Můžete si zvolit, jestli se bude klient spojovat se serverem v rámci startu aplikace nebo až s prvním požadavkem na čtení nebo zápis kanálu. Tam, kde máte síťové propojení počítačů realizováno v rámci lokální sítě (LAN), probíhá spojování zcela automaticky bez jakéhokoliv zásahu uživatele.

Spojení pomocí modemů

Pro výměnu dat mezi aplikacemi systému Control Web můžete využít také spojení přes telefonní modemy (Dial-Up Networking) při použití služeb vzdáleného přístupu (Remote Access Service - RAS). Podmínkou je, že máte na počítači na straně serveru nainstalovány a spuštěny služby RAS. Na straně klienta nenastává žádný problém. Klient může pracovat v prostředí Windows 95, Windows 98 i ve Windows NT nebo Windows 2000. Pro realizaci spojení je nutno nainstalovat a nakonfigurovat patřičné ovladače, protokoly a služby. Způsob použití serveru se liší podle operačního systému:

Stručný výčet nutných součástí, které je třeba nainstalovat a nakonfigurovat:

Windows 95/98

Windows NT, Windows 2000

Při použití modemů k přenosu dat je nutné spojování se serverem řídit. Pomocí Driver Query Metod (DQM), což jsou volání nativní procedury system.DriverQueryProc s různými parametry, můžete řídit ovladač při spojování se serverem přes telefonní linky. Voláním DQM DialUp a HangUp můžete navázat nebo zrušit spojení se serverem. Jméno aktuálního spojení se zadá pomocí DQM SetEntryName. Je-li zadán prázdný řetězec, zahájí se nebo ukončí spojení s prvním serverem ze seznamu. DQM SetUserName slouží k zadání uživatelského jména a DQM SetPassword slouží k zadání přihlašovacího hesla pro možnost automatického spojení a přihlášení ke vzdálenému serveru. O průběhu spojování se můžete dovědět z výjimek od ovladače vyčtením jejich stavů. Je-li již spojení uskutečněno pomocí jiné aplikace ve Windows nebo ručně pomocí prostředků telefonického propojení, volání DQM DialUp způsobí napojení na již existující spojení s tím, že pak není možno z aplikace spojení zrušit pomocí DQM HangUp. Toto spojení zruší aplikace, která je vytvořila.

Způsob ošetření výjimek ovladače

Ovladač při své činnosti generuje do aplikace výjimky, pomocí nichž se aplikace může dovědět o změnách a stavech ovladače. Výjimka ovladače se generuje pouze, je-li předchozí výjimka zpracována a explicitně povolena zápisem hodnoty true na kanál č.6 nebo volaním DQM EnableException. Jinak se výjimky zařazují do fronty o maximální velikosti dané parametrem max_exceptions (implicitně nastavené na 128). Vznikne-li výjimka, je nutné nejdříve vyčíst příslušné kanály, a pak povolit vygenerování nové zápisem na kanál nebo volaním DQM.

Stavy výjimek a chybové kódy

Při vzniku výjimky máte k dispozici dva údaje, které tuto výjimku blíže specifikují. Kanál č.5 obsahuje stav výjimky a kanál č.7 případný chybový kód.

Stav výjimky

1 = stError - nastala chyba komunikace. Možné chybové kódy jsou:
0 = erOK - všechno je v pořádku
1 = erTimeout - komunikace se nezdařila do stanoveného času
2 = erConAbort - spojení se rozpadlo
3 = erDialUp - obecná chyba při spojování přes modem
4 = erDialUpInit - chyba při inicializaci spojování přes modem
5 = erDialRecursed - pokus o spojení přes modem přes probíhající spojování
6 = erRasDial - chyba při navazování spojení přes modem (ověřování přístupu a podobně)
7 = erDialUpGetIPAdr - není možno získat IP adresu od serveru
8 = erDialUpNoEntry - není nadefinována položka telefonického spojení.
2 = stConnected - došlo k navázání spojení mezi klientem a serverem. Kanál č.9 obsahuje identifikační řetězec připojeného klienta resp. serveru. Tento řetězec je definován v souboru parametrů.
3 = stDataChanged - došlo ke změně dat na serveru. Kanál č.9 obsahuje identifikační řetězec serveru. Tento řetězec je definován v souboru parametrů.
4 = stDialEvent - přišla událost při spojování přes modem. Čtením kanálu č.8 dostanete řetězec, který popisuje tuto událost.
5 = stDialUpConnected - signalizace ustavení spojení přes modem
6 = stDialUpDisconnected - signalizace ukončení spojení přes modem

Kanály ovladače

Ovladač nemá pevně definovanou množinu kanálů kromě těch, které slouží k poskytování stavových informací o probíhající komunikaci. Kanály, které přenášejí data mezi aplikacemi se definují v parametrickém souboru a je na vás, kolik jich použijete a jaké jim přidělíte čísla a typy. Samozřejmě, že se čísla datových kanálů nesmí krýt s čísly stavových kanálů.

Stavové kanály ovladače

Mapovací soubor ovladače

Mapovací soubor ovladače obsahuje popis typů stavových kanálů, který je předem dán a dále popis typů kanálů, které si sami nadefinujete. Datové kanály se definují v parametrickém souboru.

Příklad mapovacího souboru

  begin
    1 - 5       real input
    6           boolean output
    7           real input
    8           string input
    9           string input
    1000 - 1999 real input
    2000 - 2999 real output
    3000        string bidirectional
  end.

Parametrický soubor ovladače

Soubor parametrů slouží ke konfiguraci ovladače. Je to textový soubor, který můžete editovat běžným textovým editorem. Parametry jsou podle významu uspořádány do několika sekcí.

Sekce [local_server]

V této sekci se definuje část server. Sekce může být v souboru zapsána pouze jednou. Následuje způsob zápisu parametrů:

[local_server]
port = <n>
client = <ip_adr> | <name> | any [notify] [id:<id>]
client = ..
..
block = <first_channel>, <last_channel>, <type>, <direction>
block = ..
..

Sekce [remote_server_x]

V této sekci se definuje část klient. Každý vzdálený server musí mít svoji vlastní sekci. Jména jednotlivých sekcí vzdálených serverů jsou tvořena spojením klíčového slova remote_server_ a pořadového čísla. Pořadová čísla musí tvořit souvislou řadu a musí začínat od jedné.

[remote_server_x]
port = <n>
server = <ip_adr> | <name>
server_id = <id>
dial_up_entry = <entry>
dial_up_get_adr = true | false
timeout = <n>
connect_on_startup = true | false
auto_connect = true | false
block = block = <first_channel>, <last_channel>, <remote_channel>, <type>, <direction>
block = ..
..

Sekce [options]

V této sekci se definují další parametry, které ovlivňují chování ovladače.

[options]
max_exceptions = <n>

Význam jednotlivých parametrů

Hodnoty parametrů

Poznámka: Pro práci s řetězci může být v bloku nadefinován pouze jeden kanál.

Příklad parametrického souboru ovladače jako serveru

[options]
 max_exceptions = 130

[local_server]
 port = 8900
 client = any
 block = 1000, 1999, real, input
 block = 2000, 2999, real, output
 block = 3000, 3000, string, bidirect

Příklad parametrického souboru ovladače jako klienta, využívajícího síťového propojení počítačů:

[options]
 max_exceptions = 130

[remote_server_1]
 ;Local area network
 port = 8900
 server = 127.0.0.1
 server_id = Server1
 timeout = 5000
 connect_on_startup = false
 auto_connect = true
 block = 1000, 1999, 2000, real, input
 block = 2000, 2999, 1000, real, output
 block = 3000, 3000, 3000, string, bidirect

Příklad parametrického souboru ovladače jako klienta, využívajícího spojení počítačů přes modemy:

[options]
 max_exceptions = 130

[remote_server_1]
 ;Dial-up network
 port = 8900
 dial_up_entry = Entry1
 dial_up_get_adr = true
 timeout = 5000
 connect_on_startup = false
 auto_connect = true
 block = 1000, 1999, 2000, real, input
 block = 2000, 2999, 1000, real, output
 block = 3000, 3000, 3000, string, bidirect

DQM ovladače

Již jsme se zmínili o možnosti použití metod ovladače, které můžete volat přes nativní proceduru system.DriverQueryProc( drv, Param1, &Param2 ) s různými parametry. Parametr Param1 je typu string a obsahuje jméno metody, parametr Param2 obsahuje vstupní nebo návratovou hodnotu metody. Jeho použití a typ se liší podle významu metody. Zde je celkový výčet metod a význam parametru Param2:

Příklad použití DQM v aplikaci:

  switch SwDial;
    owner = panel_1;
    position = 316, 413, 105, 24;
    mode = text_button;
    true_text = 'Dial';
    false_text = 'Dial';
    logic = set_true;
    
    procedure OnOutput( Output : boolean );
    begin
      Mon.WrStr( 'Dialing...' );
      Mon.Write( '  Entry = ', EntryName );
      Mon.Write( '  User  = ', User );
      system.DriverQueryProc( 'cwnet', 'SetEntryName', EntryName );
      system.DriverQueryProc( 'cwnet', 'SetUserName', User );
      system.DriverQueryProc( 'cwnet', 'SetPassword', Password );
      system.DriverQueryProc( 'cwnet', 'DialUp', 0 );
    end_procedure;
    
  end_switch;

Ovladač nemá žádné okno pro nastavení parametrů.