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> (â ìèëëèñåêóíäàõ).
- bool resTryW( ); - Ïîïûòêà çàõâàòà ðåñóðñà íà çàïèñü/ìîäèôèêàöèþ. Ïðè óñïåøíîì çàõâàòå âîçâðàùàåò "true" èíà÷å "false".
- static void resRequestR( long tm = 0 ); - Çàïðîñ ðåñóðñà íà ÷òåíèå ñ òàéìàóòîì îæèäàíèÿ <tm> (â ìèëëèñåêóíäàõ).
- bool resTryR( ); - Ïîïûòêà çàõâàòà ðåñóðñà íà ÷òåíèå. Ïðè óñïåøíîì çàõâàòå âîçâðàùàåò "true" èíà÷å "false".
- 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)
Ïóáëè÷íûå ìåòîäû:
- explicit ResString( const string &vl = "" ); - Èíèöèàëèçàöèÿ ñòðîêè ñ óêàçàííûì çíà÷åíèåì <vl>.
- ResString &operator=( const string &val ); - Ôóíêöèÿ íåÿâíîãî ïðåîáðàçîâàíèÿ èç std::string.
- operator string( ); - Ôóíêöèÿ íåÿâíîãî ïðåîáðàçîâàíèÿ â std::string.
- size_t size( ); - Ðàçìåð ñòðîêè.
- bool empty( ); - Ñòðîêà ïóñòà.
- void setVal( const string &vl ); - Óñòàíîâêà çíà÷åíèÿ ñòðîêè â <vl>.
- const string &getVal( ); - Ïîëó÷åíèå çíà÷åíèÿ ñòðîêè.
- const string &getValRef( ); - Ïîëó÷åíèå ïðÿìîé ññûëêè íà ñòðîêó std::string. Ðåñóðñ èãíîðèðóåòñÿ â ñëó÷àå èñïîëüçîâàíèÿ ýòîé ôóíêöèè!