# 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

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 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 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.

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 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 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:

- Windows NT / Windows 2000 - RAS server je součástí systému
- Windows 98 - jako server musíte nainstalovat "Server telefonického připojení", který je součástí instalační skupiny "Komunikace". Jeho konfiguraci pak naleznete ve složce "Tento počítač / Telefonické připojení sítě", v menu "Připojení".
- Windows 95 - neobsahují podporu serveru. Tu je možno do systému zabudovat, když si nainstalujete rozšíření "Microsoft Plus!" a v rámci tohoto rozšíření "Dial-Up Server pro Windows 95". Více informací souvisejících s problematikou nastavení komunikace naleznete v souboru nápovědy na instalačním CD systému Windows 95. Jméno a cesta k souboru je 'WIN_95_CD:\admin\reskit\helpfile\win95rk.hlp'.

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

Windows 95/98

- ovladač pro modem - "Ovládací panely / Systém / Správce zařízení / Modem"
- telefonní adaptér - "Ovládací panely / Systém / Správce zařízení / Síťové adaptéry"
- telefonní adaptér - "Ovládací panely / Síť - adaptéry"
- TCP/IP dial-up - "Ovládací panely / Síť - protokoly"
- položky spojení - "Tento počítač / Telefonické připojení sítě"

Windows NT, Windows 2000

- ovladač pro modem
- telefonní adaptér přes TCP/IP
- služby RAS
- položky spojení
- příchozí spojení
- uživatele

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

- kanál č.1 - vrací počet přijatých zpráv
- kanál č.2 - vrací počet vyslaných zpráv
- kanál č.3 - vrací počet událostí, které ovladač zachytil od síťové vrstvy
- kanál č.4 - vrací počet neošetřených výjimek ve frontě
- kanál č.5 - vrací stav výjimky ovladače
- kanál č.6 - zápisem hodnoty true povoluje další výjimku ovladače
- kanál č.7 - obsahuje chybový kód
- kanál č.8 - vrací popis stavů při spojování přes modemy
- kanál č.9 - vrací identifikační jméno klienta nebo serveru při vzniku výjimky ovladače (navázání spojení, změna dat, chyba atd.)

## 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ů

- port - číslo portu, na kterém se otevírá síťové spojení. Musí být větší než 5500 a musí být unikátní pro obě strany.
- client - jméno nebo IP adresa klienta, kterého server akceptuje a případně upozorňuje na změnu. Použije-li se klíčové slovo any, pak server akceptuje všechny připojené klienty a všechny ostaní definice klientů se ignorují. Definice klienta může dále obsahovat parametr notify, který určuje, jestli bude klient informován o změnách dat na serveru. Tento parametr je nepovinný. Pomocí parametru id:<id> je možno definovat identifikační řetězec klienta. Tento řetězec je nepovinný a slouží pro snadnější identifikaci daného klienta v aplikaci. Tento řetězec je dostupný při vzniku výjimky ovladače na kanále č.9.
- server - jméno nebo IP adresa serveru.
- server_id - identifikační řetězec serveru. Tento řetězec je nepovinný a slouží pro snadnější identifikaci daného serveru v aplikaci. Tento řetězec je dostupný při vzniku výjimky ovladače na kanále č.9.
- block - definice bloků kanálů.
- dial_up_entry - jméno spojení při spojování přes modemy. Parametr connect_on_startup je ignorován.
- dial_up_get_adr - automatické získání adresy při spojení přes modemy. Parametr server je ignorován.
- timeout - čas čekání na odezvu serveru v milisekundách.
- connect_on_startup - příznak pro navázání spojení se serverem při spuštění aplikace. Není-li parametr zadán, je nastaven na hodnotu false.
- auto_connect - příznak automatického navázání spojení se serverem. Je-li tento parametr nastaven na hodnotu true, klient se pokusí navázat spojení se serverem automaticky při požadavku na přenos kanálů, pokud spojení ještě není navázáno. Je-li nastaven na hodnotu false, je třeba spojení se serverem navázat pomocí volání DQM Connect. Není-li parametr zadán, je nastaven na hodnotu false
- max_exceptions - délka fronty pro výjimky ovladače. Nejsou-li výjimky od ovladače potvrzovány, řadí se do fronty až do jejího zaplnění.

#### Hodnoty parametrů

- <n> - číslo
- <ip_adr> - IP adresa počítače. Zadává se jako skupina 4 čísel oddělených tečkami, např. 127.0.0.1. IP adresu počítače můžete zjistit z Windows - "Ovládací panely / Síť / Konfigurace / TCP/IP / Vlastnosti / IP adresa".
- <name> - jméno počítače. Zadává se jako textový řetězec. Jméno počítače můžete zjistit z Windows - "Ovládací panely / Síť / Identifikace"
- <id> - libovolné jméno. Slouží pro identifikaci klienta nebo serveru při vzniku výjimky od ovladače.
- <entry> - jméno ze seznamu telefonních spojení. Jednotlivá spojení jsou definována ve Windows - "Plocha / Tento počítač / Telefonické připojení sítě". Pokud není vytvořena žádná položka, musíte si ji vytvořit sami.
- <first_channel> - číslo prvního kanálu bloku
- <last_channel> - číslo posledního kanálu bloku
- <remote_channel> - číslo prvního odpovídajícího kanálu bloku na straně serveru. Klient tímto způsobem mapuje svoje kanály do prostoru kanálů serveru.
- <type> - typ kanálu : real, shortreal, boolean, string, shortint, integer, longint, shortcard, cardinal, longcard
- <direction> - směr kanálu : input, output, bidirect

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:

- GetVersion - vrací v Param2 řetězec popisující jméno a verzi ovladače. Param2 je typu string.
- EnableException - voláním metody se povolí další výjimka od ovladače. Param2 nemá žádný význam.
- Connect - voláním této metody se klient pokusí navázat spojení se serverem. Param2 obsahuje identifikační řetězec serveru.
- Disconnect - voláním této metody klient zruší spojení se serverem. Param2 obsahuje identifikační řetězec serveru.
- SetEntryName - pomocí této metody nastavíte aktuální jméno telefonního spojení. Param2 je typu string a obsahuje jméno telefonního spojení.
- DialUp - zahájení spojování přes modemy. Param2 nemá žádný význam.
- HangUp - zrušení spojení přes modemy. Param2 nemá žádný význam.
- SetPassword - Param2 je typu string a obsahuje heslo pro ověření spojení.
- SetUserName - Param2 je typu string a obsahuje jméno uživatele pro ověření spojení.

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ů.