16. Ðåñóðñû â ñèñòåìå OpenSCADA (Res, ResAlloc, AutoHD)
Áîëüøèíñòâî óçëîâ è ïîäñèñòåì ñèñòåìû OpenSCADA ÿâëÿþòñÿ äèíàìè÷åñêèìè, ò.å. äîïóñêàþò ñîçäàíèå/óäàëåíèå/êîíôèãóðàöèþ â ïðîöåññå ôóíêöèîíèðîâàíèÿ ñèñòåìû. Ó÷èòûâàÿ ìíîãîïîòî÷íîñòü ñèñòåìû, äàííàÿ ôóíêöèîíàëüíîñòü íàêëàäûâàåò æåñòêèå òðåáîâàíèÿ ê ñèíõðîíèçàöèè ïîòîêîâ. Äëÿ ñèíõðîíèçàöèè â ñèñòåìå èñïîëüçóþòñÿ ðåñóðñû, ôóíêöèè êîòîðûõ ëîêàëèçîâàíû â îáúåêòàõ <Res> è <ResAlloc>. Îáúåêò <Res> ïðåäîñòàâëÿåò õðàíèëèùå ðåñóðñà, ïðåäóñìàòðèâàþùåãî ôóíêöèè çàõâàòà/îñâîáîæäåíèÿ íà ÷òåíèå è çàïèñü.  îáúåêòå <ResAlloc> ðåàëèçîâàíû ôóíêöèè àâòîìàòè÷åñêîãî îñâîáîæäåíèÿ ðåñóðñà. Àâòîìàòè÷åñêèé ðåñóðñ ïîäðàçóìåâàåò ñîçäàíèå ëîêàëüíîãî îáúåêòà ðåñóðñà ñ àâòîìàòè÷åñêèì åãî îñâîáîæäåíèåì ïðè ðàçðóøåíèè (â äåñòðóêòîðå). Èñïîëüçîâàíèå àâòîìàòè÷åñêèõ ðåñóðñîâ çíà÷èòåëüíî óïðîùàåò ðàáîòó ñ ðåñóðñàìè ïðè èñïîëüçîâàíèè èñêëþ÷åíèé.
Ëþáîé äèíàìè÷åñêèé îáúåêò ñèñòåìû íàñëåäóåòñÿ îò îáúåêòà TCntrNode, êîòîðûé ñîäåðæèò ìåõàíèçì ïîäêëþ÷åíèÿ ÷åðåç øàáëîí AutoHD. Îñíîâíîé ôóíêöèåé øàáëîíà ÿâëÿåòñÿ õðàíåíèå ññûëêè íà îáúåêò è çàõâàò ðåñóðñà, èñêëþ÷àþùåãî óäàëåíèå îáúåêòà íà ìîìåíò èñïîëüçîâàíèÿ. Øàáëîí ïîääåðæèâàåò êîïèðîâàíèå ðåñóðñà è àâòîìàòè÷åñêîå åãî îñâîáîæäåíèå â ñëó÷àå ðàçðóøåíèÿ îáúåêòà øàáëîíà. Äëÿ íàãëÿäíîñòè äîñòóïà ê îáúåêòàì ïîðîæä¸ííûì îò TCntrNode øàáëîí AutoHD ïîääåðæèâàåò ïðèâåäåíèå òèïîâ, îñíîâàííîå íà äèíàìè÷åñêîì ïðèâåäåíèè.
16.1. Îáúåêò ðåñóðñà (Res)
Ïóáëè÷íûå ìåòîäû:
- Res( ); -- Èíèöèàëèçàöèÿ ðåñóðñà.
- static void resRequestW( long tm = 0 ); -- Çàïðîñ ðåñóðñà íà çàïèñü/ìîäèôèêàöèþ ñ òàéìàóòîì îæèäàíèÿ <tm> (â ìèëëèñåêóíäàõ).
- static void resRequestR( long tm = 0 ); -- Çàïðîñ ðåñóðñà íà ÷òåíèå ñ òàéìàóòîì îæèäàíèÿ <tm> (â ìèëëèñåêóíäàõ).
- static void resRelease( ); -- Îñâîáîæäåíèå ðåñóðñà.
16.2. Îáúåêò ðåñóðñà (ResAlloc)
Ïóáëè÷íûå ìåòîäû:
- ResAlloc( Res &rid ); -- Èíèöèàëèçàöèÿ àâòîìàòè÷åñêè îñâîáîæäàþùåãîñÿ ðåñóðñà äëÿ ðàíåå âûäåëåííîãî èäåíòèôèêàòîðà <rid>.
- ResAlloc( Res &rid, bool write, long tm = 0 ); -- Èíèöèàëèçàöèÿ àâòîìàòè÷åñêè îñâîáîæäàþùåãîñÿ ðåñóðñà äëÿ ðàíåå âûäåëåííîãî èäåíòèôèêàòîðà <rid>. Ñ óêàçàíèåì òèïà ðåñóðñà <write> (÷òåíèå/çàïèñü).
- void request( bool write = false, long tm = 0 ); -- Çàïðîñ ðåñóðñà â óêàçàííîì ðåæèìå <write> (÷òåíèå/çàïèñü).
- void release( ); -- Îñâîáîæäåíèå ðåñóðñà.
16.3. Øàáëîí (AutoHD)
Ïóáëè÷íûå ìåòîäû:
- AutoHD( ); -- Èíèöèàëèçàöèÿ áåç ïðèâÿçêè ê îáúåêòó.
- AutoHD( ORes *node, const string &who = "" ); -- Èíèöèàëèçàöèÿ ñ ïðèâÿçêîé ê îáúåêòó <node>. Îáúåêò äîëæåí ñîäåðæàòü ôóíêöèþ AHDConnect() è AHDDisConnect().
- AutoHD( const AutoHD &hd ); -- Êîïèðóþùèé êîíñòðóêòîð.
- template <class ORes1> AutoHD( const AutoHD<ORes1> &hd_s, bool nosafe = false ); -- Êîíñòðóêòîð ïðèâåäåíèÿ òèïîâ â áåçîïàñíîì èëè ïðÿìîì ðåæèìå ïðèâåäåíèÿ <nosafe>.
- ORes &at( ) const; -- Ïîëó÷åíèå îáúåêòà çà ðåñóðñîì.
- void operator=( const AutoHD &hd ); -- Êîïèðîâàíèå ðåñóðñîâ.
- void free( ); -- Îñâîáîæäåíèå ðåñóðñà.
- bool freeStat( ) const; -- Ïðèçíàê «Ðåñóðñ ñâîáîäåí».
16.4. Îáúåêò ñòðîêè ñ äîñòóïîì, ðàçäåë¸ííûì ðåñóðñîì (ResString)
Ïóáëè÷íûå ìåòîäû:
- ResString( const string &vl = "" ); -- Èíèöèàëèçàöèÿ ñòðîêè ñ óêàçàííûì çíà÷åíèåì <vl>.
- void setVal( const string &vl ); -- Óñòàíîâêà çíà÷åíèÿ ñòðîêè â <vl>.
- const string &getVal( ); -- Ïîëó÷åíèå çíà÷åíèÿ ñòðîêè.
Ïóáëè÷íûå àòðèáóòû:
- res -- Ðåñóðñ ñòðîêè.
- str -- Ñòðîêà.