# Co to je OPC

OPC Foundation je nezisková organizace, která na základě OLE/COM standartu stanovila protokol pro rychlejší a bezpečnější přenos technologických dat. OPC (OLE for process control) je množina OLE/COM rozhraní které zpostředkovávají výměnu informací mezi klientem a serverem.

## Klient

Prostřednictvím OPC klienta jsou aplikace schopny komunikovat s libovolným OPC serverem. Nikde naní stanoveno, jakým způsobem bude klient komunikovat s aplikací. Rovněž není nikde stanoveno, jakým spůsobem bude server komunikovat s v/v zařízením. Avšak způsob komunikace server — client je pevně stanoven OPC protokolem. Proto existuje-li pro danou aplikaci OPC klient, je možno v ní spracovávat data z libovolného v/v zařízení pro které existuje OPC server (OPC servery dnes existují pro drtivou většinu všech v/v zařízení).

## Server

Server je program, který získává data z konkrétního v/v zařízení. Klientovi je poskytuje ve formě tzv. položek. To znamená, že mapuje paměťové místo v/v zařízení na položku ke které má přístup klient. Položka je tedy symbolické jméno, proměnná, která ukazuje na konkrétní místo v paměti v/v zařízení. Správu položek, to znamená jejich přidávání, odebírání a editaci má na starosti server.

## Struktura OPC

Jak bylo uvedeno výše, data jsou v OPC předávána pomocí položek. Položky jsou združovány do skupin. Každá skupina má tři základní parametry.

update rate — Tento parametr určuje frekvenci obnovování všech položek v dané skupině. percent deadband — Tento parametr je aplikován pouze na položky, které obsahují dwEUType of anolog informaci (určuje server). Server potom předá klientovi pouze tu informaci, která bude splňovat následující podmínku:

    abs(last cached value - current value) >
    pPercentDeadband * (EU_High - EU_Low)

time bias — Data mohou být zpracovávána zařízením, které pracuje s jiným časem a tato hodnota slouží k tomu, aby časová informace, kterou od serveru obdrží klient byla správně prezentována.

Ke každé položce jsou kromě její hodnoty poskytovány doprovodné informace. Ty jsou:

kvalita — Může být DOBRÁ, ŠPATNÁ nebo NEURČITÁ , informaci o kvalitě získává klient od serveru Kvalita je špatná, když se nějakým způsobem serveru nedaří komunikovat s v/v zařízením. Neurčitá je, když o ní klient nemá k dispozici informaci (většinou je to tím že na danou položku nebyl žádný požadavek na čtení nebo zápis.) čas — Je to doba od předání požadavku serveru do jeho vybavení. Je udána v milisekundách.

Schéma propojení plikace v systému Control Web a v/v zařízení prostřenictvím OPC.

Schéma propojení aplikace a v/v zařízení

## Komunikace klient-server

Každý OPC server má datové rozhraní pomocí kterého klient uplatňuje požadavky na čtení nebo zápis. Čtení nebo zápis dat může vůči klientovi probíhat buď synchronně, nebo asynchronně. 'Požadavek na čtení nebo zápis' znamená v podstatě volání procedury serveru. Pokud je tedy použita komunikace synchronní, zavolá klient proceduru serveru a program nebude pokračovat do té doby, dokud server nezíská požadovaná data. To můžou být řádově sekundy. Při použití asynchronní komunikace po zavolání procedury serveru program pokračuje bez přestávky dál. Až server získá požadovaná data, informuje o tom klienta pomocí návratového volání.

Rozdíl mezi použitím synchronní a asynchronní komunikace

Synchronní komunikace

1. Požadavek na čtení dat
2. Vyslání požadavku do klienta
3. Zpracování požadavku klientem
4. Zaslání požadavku serveru a čekání na odpověď
5. Zpracování odpovědi serveru a poslání do aplikace

Asynchronní komunikace

1. Požadavek na čtení dat
2. Vyslání požadavku do klienta
3. Zpracování požadavku klientem
4. Zaslání požadavku serveru, program pokračuje v činnosti
5. Server poslal odpověď — zpracování odpovědi a poslání do aplikace

## Komunikace se vzdáleným serverem

OPC umožňuje klientovi komunikovat se serverem na vzdáleném počítači prostřednictvím rozhraní DCOM (distributed COM). Pro přenos dat pomocí OPC mezi dvěma počítači musí být splněny tyto podmínky:

1. Na obou dvou počítačích musí být nainstalovaný DCOM. Ve WinNT4.0 je součástí systému, u Win95 se musí nainstalovat dodatečně.
2. Uživatel se musí z počítače, na kterém je klient přihlásit na počítač, na kterém je server jako ADMINISTRÁTOR (mít administrátorská práva, to znamená mimo jiné přístup do systémového registru). Tohoto přihlášení lze dosáhnout například z Exploreru.
3. DCOM u serveru musí být nastavený tak aby ho směl spouštět daný vzdálený uživatel. Nejjednodušší cesta je nastavit Every One u všech práv. Toto nastavení lze provést aplikací 'dcomcnfg.exe', která je součástí systému. Kromě obecných musí být nastavena i práva u aplikace, která obsahuje samotný server.

## Popis OPC rozhraní

Na straně serveru musí být implementovány 3 základní objekty, obsahující příslušná rozhraní. Jsou to:

OPCServer

IOPCServer — práce se skupinami.

- HRESULT AddGroup( szName, bActive, dwRequestedUpdateRate, hClientGroup, pTimeBias, pPercentDeadband, dwLCID, phServerGroup, pRevisedUpdateRate, riid, ppUnk );
- HRESULT GetErrorString( dwError, dwLocale, ppString );
- HRESULT GetGroupByName( szName, riid, ppUnk );
- HRESULT GetStatus( ppServerStatus );
- HRESULT RemoveGroup( hServerGroup, bForce );
- HRESULT CreateGroupEnumerator( dwScope, riid, ppUnk );

IOPCServerPublicGroups (nepovinný) — práce se sdílenými skupinami.

- HRESULT GetPublicGroupByName( szName, riid, ppUnk );
- HRESULT RemovePublicGroup( hServerGroup, bForce );

IOPCBrowseServerAddressSpace (nepovinný) — procházení adresního prostoru serveru (získání seznamu definovaných položek).

- HRESULT QueryOrganization( pNameSpaceType );
- HRESULT ChangeBrowsePosition( dwBrowseDirection, szString );
- HRESULT BrowseOPCItemIDs( dwBrowseFilterType, szFilterCriteria, vtDataTypeFilter, dwAccessRightsFilter, ppIEnumString );
- HRESULT GetItemID( szItemDataID, szItemID );
- HRESULT BrowseAccessPaths( szItemID, ppIEnumString );

IPersistFile (nepovinný) — nahrávání a ukládání konfiguračních souborů.

- HRESULT IsDirty();
- HRESULT Load( pszFileName, dwMode);
- HRESULT Save( pszFileName, fRemember);
- HRESULT SaveCompleted( pszFileName);
- HRESULT GetCurFileName( ppszFileName);

OPCGroup

IOPCGroupStateMgt — získání informací o vlastnostech skupin, popřípadě jejich změna.

- HRESULT GetState( pUpdateRate, pActive, ppName, pTimeBias, pPercentDeadband, pLCID, phClientGroup, phServerGroup);
- HRESULT SetState( pRequestedUpdateRate, pRevisedUpdateRate,
  pActive, pTimeBias, pPercentDeadband, pLCID, phClientGroup);
- HRESULT SetName( szName);
- HRESULT CloneGroup( szName, riid, ppUnk);

IOPCPublicGroupStateMgt (nepovinný) — získání informací o vlastnostech sdílených skupin, popřípadě jejich změna.

- HRESULT GetState( pPublic);
- HRESULT MoveToPublic( void );

IOPCSyncIO — synchronní zápis / čtení dat.

- HRESULT Read( dwSource, dwNumItems, phServer, ppItemValues,
  ppErrors);
- HRESULT Write( dwNumItems, phServer, pItemValues, ppErrors);

IOPCAsyncIO — asynchronní zápis / čtení dat.

- HRESULT Read( dwConnection, dwSource, dwNumItems, phServer,
  pTransactionID, ppErrors )
- HRESULT Write( dwConnection, dwNumItems, phServer, pItemValues, pTransactionID, ppErrors );
- HRESULT Cancel( dwTransactionID );
- HRESULT Refresh( dwConnection, dwSource, pTransactionID );

IOPCItemMgt — přidělování položek do skupin.

- HRESULT AddItems( dwNumItems, pItemArray, ppAddResults, ppErrors );
- HRESULT ValidateItems( dwNumItems, pItemArray, bBlobUpdate, ppValidationResults, ppErrors );
- HRESULT RemoveItems( dwNumItems, phServer, ppErrors );
- HRESULT SetActiveState( dwNumItems, phServer, bActive, ppErrors );
- HRESULT SetClientHandles( dwNumItems, phServer, phClient, ppErrors );
- HRESULT SetDatatypes( dwNumItems, phServer, pRequestedDatatypes, ppErrors );
- HRESULT CreateEnumerator( riid, ppUnk );

IDataObject — připojení klienta (pro asynchronní komunikaci).

- HRESULT DAdvise( pFmt, adv, pSnk, pConnection );
- HRESULT DUnadvise( Connection );

EnumOPCItemAttributes

IEnumOPCItemAttributes — atributy položek.

- HRESULT Next( celt, ppItemArray, pceltFetched );
- HRESULT Skip( celt );
- HRESULT Reset( void );
- HRESULT Clone( ppEnumItemAttributes );

Na straně klienta musi být implementováno jedno rozhraní sloužící pro asynchronní komunikaci.

IAdviseSink

- HRESULT OnDataChange(pFE, pSTM);

Poznámka : Metody rozhraní jsou zapsané v jazyce C++.

## Potřebná podpora

Aby na vašem počítači mohla probíhat OPC komunikace, musí být zaregistrovány tyto knihovny 'opccomn_ps.dll' a 'opcproxy.dll'. Jejich instalace je většinou součástí instalace serveru. Pokud tomu tak není, jsou k dispozici ke stažení u OPC Foundation na adrese http://www.opcfoundation.org kde je popsán i postup jejich instalace.