This is an old revision of
Doc/OPCUA from 2016-01-29 13:03:16..
Ìîäóëè "OPC-UA", ïîäñèñòåì "Ñáîð äàííûõ" è "Òðàíñïîðòíûå ïðîòîêîëû"
Ïàðàìåòð Ìîäóëü 1 Ìîäóëü 2 Áèáëèîòåêà
ID: OPC_UA OPC_UA libOPC_UA
Èìÿ: Êëèåíò OPC-UA Ñåðâåð OPC-UA Áèáëèîòåêà ðåàëèçàöèè OPC-UA â OpenSCADA
Òèï: Ñáîð Äàííûõ Ïðîòîêîë Áèáëèîòåêà
Èñòî÷íèê: daq_OPC_UA.so daq_OPC_UA.so libOPC_UA.{h,cpp}
Âåðñèÿ: 1.6.2 1.6.6 1.0.1
Àâòîð: Ðîìàí Ñàâî÷åíêî
Îïèñàíèå: Ïðåäîñòàâëÿåò ðåàëèçàöèþ OPC-UA êëèåíòñêîãî ñåðâèñà. Ïðåäîñòàâëÿåò ðåàëèçàöèþ OPC-UA ñåðâèñà ñåðâåðà. Ïðåäîñòàâëÿåò ðåàëèçàöèþ ïðîòîêîëà OPC-UA â ÷àñòè êëèåíòà è ñåðâåðà, â âèäå îòäåëüíîé áèáëèîòåêè.
Ëèöåíçèÿ: GPL2 GPL2 LGPL3
Contents
Ââåäåíèå
OPC (OLE for Process Control) — ýòî ñåìåéñòâî ïðîòîêîëîâ è òåõíîëîãèé, ïðåäîñòàâëÿþùèõ åäèíûé èíòåðôåéñ äëÿ óïðàâëåíèÿ îáúåêòàìè àâòîìàòèçàöèè è òåõíîëîãè÷åñêèìè ïðîöåññàìè. Ñîçäàíèå è ïîääåðæêó ñïåöèôèêàöèé OPC êîîðäèíèðóåò ìåæäóíàðîäíàÿ íåêîììåð÷åñêàÿ îðãàíèçàöèÿ OPC Foundation , ñîçäàííàÿ â 1994 ãîäó âåäóùèìè ïðîèçâîäèòåëÿìè ñðåäñòâ ïðîìûøëåííîé àâòîìàòèçàöèè.
 âèäó òîãî, ÷òî çíà÷èòåëüíîå âëèÿíèå â îðãàíèçàöèè OPC Foundation èìååò êîðïîðàöèÿ Microsoft, ïðîòîêîëû OPC äî ïîñëåäíåãî âðåìåíè áûëè îäíîïëàòôîðìåííûìè è çàêðûòûìè, ïî ïðè÷èíå ïðèâÿçêè ê çàêðûòûì òåõíîëîãèÿì MS Windows. Îäíàêî, ñ íåäàâíèõ ïîð, îðãàíèçàöèåé OPC Foundation áûëè ñîçäàíû òàêèå ìíîãîïëàòôîðìåííûå ðåøåíèÿ, êàê OPC XML-DA è OPC-UA. Íàèáîëüøèé èíòåðåñ èç íèõ ïðåäñòàâëÿåò OPC-UA, êàê óíèôèöèðóþùèé âñå ïðîòîêîëû ðàííèõ âåðñèé â ðàìêàõ îòêðûòûõ è ìíîãîïëàòôîðìåííûõ òåõíîëîãèé.
Äàííûé ìîäóëü ðåàëèçóåò ïîääåðæêó èíòåðôåéñà è ïðîòîêîëà OPC-UA êàê â âèäå êëèåíòñêîãî ñåðâèñà, òàê è â âèäå ñåðâåðà OPC-UA. Êëèåíòñêèé ñåðâèñ OPC-UA ðåàëèçóåòñÿ îäíîèì¸ííûì ìîäóëåì ïîäñèñòåìû "Ñáîð äàííûõ", à ñåðâåð ðåàëèçóåòñÿ ìîäóëåì ïîäñèñòåìû "Ïðîòîêîëû". Âåñü êîä ðåàëèçàöèè ýòèì ìîäóëåì ñïåöèôèêè ïðîòîêîëà OPC-UA áûë âûíåñåí, ïî ïðîñüáå ïîëüçîâàòåëåé, â îòäåëüíóþ áèáëèîòåêó, êîòîðàÿ ðàñïðîñòðàíÿåòñÿ ïîä ëèöåíçèåé LGPL3.
 òåêóùåé âåðñèè äàííûõ ìîäóëåé è áèáëèîòåêè ðåàëèçóþòñÿ áèíàðíàÿ ÷àñòü ïðîòîêîëà è áàçîâûå ñåðâèñû â íåáåçîïàñíîì ðåæèìå è áåçîïàñíûõ ðåæèìàõ ïîëèòèê "Base128Rsa15" è "Base256".  ïîñëåäñòâèè ïëàíèðóåòñÿ ðàñøèðåíèå ìîäóëÿ äëÿ ðàáîòû ÷åðåç HTTP/SOAP è ðåàëèçàöèè îñòàëüíûõ ñåðâèñîâ OPC-UA, ïî ïîòðåáíîñòè.
Õîòÿ ïðîòîêîë OPC-UA è ÿâëÿåòñÿ ìíîãîïëàòôîðìåííûì, åãî ñïåöèôèêàöèÿ è SDK íå ÿâëÿþòñÿ ñâîáîäíîäîñòóïíûìè, à ïðåäîñòàâëÿþòñÿ òîëüêî ÷ëåíàì îðãàíèçàöèè OPC Foundation. Ïî ýòîé ïðè÷èíå ðåàëèçàöèÿ äàííûõ ìîäóëåé ñòîëêíóëàñü ñî çíà÷èòåëüíûìè ïðåïÿòñòâèÿìè è ïðîáëåìàìè.
Âî ïåðâûõ, ïðîòîêîë OPC-UA ñëîæåí è ðåàëèçàöèÿ åãî âîîáùå áåç ñïåöèôèêàöèè êðàéíå òðóäî¸ìêà. Ïî ýòîé ïðè÷èíå ðàáîòû íàä äàííûìè ìîäóëÿìè äîëãîå âðåìÿ íå íà÷èíàëàñü, è òîëüêî áëàãîäàðÿ ñïîíñîðñêîé ïîìîùè îäíîé èç îðãàíèçàöèé-÷ëåíà OPC Foundation ïðîåêò OpenSCADA ïîëó÷èë äîêóìåíòàöèþ ñïåöèôèêàöèè. Ïðè ýòîì SDK è èñõîäíûå òåêñòû ANSIÑ-API ïðîòîêîëà OPC-UA ïîëó÷åíû íå áûëè ïî ïðè÷èíå íåñîâìåñòèìîñòè èõ ëèöåíçèè ñ GPL è, êàê ñëåäñòâèå, ïîòåíöèàëüíîé óãðîçû íàðóøåíèÿ ëèöåíçèè ïðè ðàáîòå ñ èñõîäíûìè òåêñòàìè, ÷òî ìîãëî ïðèâåñòè ê ïîñëåäóþùèì þðèäè÷åñêèì ïðîáëåìàì ïðè ñâîáîäíîì ðàñïðîñòðàíåíèè äàííûõ ìîäóëåé.
Âî âòîðûõ, äàæå íàëè÷èå ñïåöèôèêàöèè íå ïîçâîëÿåò ðåøèòü ðÿä òåõíè÷åñêèõ âîïðîñîâ áåç ïðèìåðîâ ðåàëèçàöèè è âîçìîæíîñòè ïðîâåðêè íà ðàáî÷åì ïðîòîòèïå êëèåíòà è ñåðâåðà OPC-UA. Íàïðèìåð, èìåííî òåõíè÷åñêèå îñîáåííîñòè ðåàëèçàöèè àëãîðèòìîâ ñèììåòðè÷íîãî øèôðîâàíèÿ è ïîëó÷åíèÿ êëþ÷åé äëÿ íèõ íå ïîçâîëèëè ðåàëèçîâàòü ïîääåðæêó ïîëèòèê áåçîïàñíîñòè ñðàçó.
Äëÿ îòëàäêè ôóíêöèîíèðîâàíèÿ ìîäóëåé èñïîëüçîâàëîñü äåìîíñòðàöèîííîå ÏÎ ôèðìû Unified Automation , â ñîñòàâå OPC-UA êëèåíòà — UAExpert è ñåðâåðà — "OPC-UA Demo Server", èç ïàêåòà SDK.  âèäó ïîñòîÿííîãî ðàçâèòèÿ ñàìîãî êëèåíòà "UAExpert", â ïëàíå èíòåðïðåòàöèè ñïåöèôèêàöèè OPC-UA, íîâûå åãî âåðñèè ÷àñòî èìåþò ïðîáëåìû ïðè ðàáîòå ñ ñåðâåðîì OPC-UA îò OpenSCADA.  öåëîì ðåçóëüòàòû ñîâìåñòèìîñòè ðàáîòû ñ êëèåíòàìè è ñåðâåðàìè ðàçëè÷íûõ ïðîèçâîäèòåëåé ìîæíî ïîëó÷èòü â ïðèëîæåíèè .
1. Ïðîòîêîë OPC-UA
OPC-UA — ýòî ïëàòôîðìî-íåçàâèñèìûé ñòàíäàðò, ñ ïîìîùüþ êîòîðîãî ñèñòåìû è óñòðîéñòâà ðàçëè÷íîãî òèïà ìîãóò âçàèìîäåéñòâîâàòü ïóò¸ì îòïðàâêè ñîîáùåíèé ìåæäó êëèåíòîì è ñåðâåðîì ÷åðåç ðàçëè÷íûå òèïû ñåòåé. Ïðîòîêîë ïîääåðæèâàåò áåçîïàñíîå âçàèìîäåéñòâèå ïóò¸ì âàëèäàöèè êëèåíòîâ è ñåðâåðîâ, à òàêæå ïðîòèâîäåéñòâèÿ àòàêàì. OPC-UA îïðåäåëÿåò ïîíÿòèå Ñåðâèñû , êîòîðûå ñåðâåðà ìîãóò ïðåäîñòàâëÿòü, à òàêæå ñåðâèñû, êîòîðûå ñåðâåð ïîääåðæèâàåò äëÿ êëèåíòà. Èíôîðìàöèÿ ïåðåäà¸òñÿ â âèäå òèïîâ äàííûõ, îïðåäåë¸ííûõ OPC-UA è ïðîèçâîäèòåëåì, êðîìå òîãî ñåðâåðà îïðåäåëÿþò îáúåêòíóþ ìîäåëü, äëÿ êîòîðîé êëèåíòû ìîãóò îñóùåñòâëÿòü äèíàìè÷åñêèé îáçîð.
OPC-UA ïðåäîñòàâëÿåò ñîâìåùåíèå èíòåãðèðîâàííîãî àäðåñíîãî ïðîñòðàíñòâà è ñåðâèñíîé ìîäåëè. Ýòî ïîçâîëÿåò ñåðâåðó èíòåãðèðîâàòü äàííûå, íàðóøåíèÿ (Alarms), ñîáûòèÿ (Events) è èñòîðèþ â ýòîì àäðåñíîì ïðîñòðàíñòâå, à òàêæå ïðåäîñòàâëÿòü äîñòóï ê íèì ïîñðåäñòâîì èíòåãðèðîâàííûõ ñåðâèñîâ. Ñåðâèñû òàêæå ïðåäîñòàâëÿþò èíòåãðèðîâàííóþ ìîäåëü áåçîïàñíîñòè.
OPC-UA ïîçâîëÿåò ñåðâåðàì ïðåäîñòàâëÿòü äëÿ êëèåíòîâ îïðåäåëåíèÿ òèïîâ, äëÿ äîñòóïà ê îáúåêòàì èç àäðåñíîãî ïðîñòðàíñòâà. OPC-UA äîïóñêàåò ïðåäîñòàâëåíèå äàííûõ â ðàçëè÷íûõ ôîðìàòàõ, âêëþ÷àÿ áèíàðíûå ñòðóêòóðû è XML-äîêóìåíòû. ×åðåç àäðåñíîå ïðîñòðàíñòâî êëèåíòû ìîãóò çàïðîñèòü ó ñåðâåðà ìåòàäàííûå, êîòîðûå îïèñûâàþò ôîðìàò äàííûõ.
OPC-UA äîáàâëÿåò ïîääåðæêó ìíîæåñòâåííîé ñâÿçíîñòè ìåæäó óçëàìè âìåñòî ïðîñòîãî îãðàíè÷åíèÿ èåðàðõè÷íîñòüþ. Òàêàÿ ãèáêîñòü â êîìáèíàöèè ñ îïðåäåëåíèåì òèïîâ ïîçâîëÿåò ïðèìåíÿòü OPC-UA äëÿ ðåøåíèÿ çàäà÷ â øèðîêîé ïðîáëåìíîé îáëàñòè.
OPC-UA ñïðîåêòèðîâàí äëÿ îáåñïå÷åíèÿ íàä¸æíîé âûäà÷è äàííûõ. Îñíîâíàÿ îñîáåííîñòü âñåõ OPC ñåðâåðîâ — ñïîñîáíîñòü âûäàâàòü äàííûå è ñîáûòèÿ.
OPC-UA ñïðîåêòèðîâàí äëÿ ïîääåðæêè øèðîêîãî äèàïàçîíà ñåðâåðîâ, îò ïðîñòûõ ÏËÊ äî ïðîìûøëåííûõ ñåðâåðîâ. Ýòè ñåðâåðà õàðàêòåðèçóþòñÿ øèðîêèì ñïåêòðîì ðàçìåðîâ, ïðîèçâîäèòåëüíîñòè, ïëàòôîðì èñïîëíåíèÿ è ôóíêöèîíàëüíîé ¸ìêîñòè. Ñëåäîâàòåëüíî, OPC-UA îïðåäåëÿåò èñ÷åðïûâàþùåå ìíîæåñòâî âîçìîæíîñòåé, è ñåðâåð ìîæåò èìïëåìåíòèðîâàòü ïîäìíîæåñòâà ýòèõ âîçìîæíîñòåé. Äëÿ îáåñïå÷åíèÿ ñîâìåñòèìîñòè OPC-UA îïðåäåëÿåò ïîäìíîæåñòâà, èìåíóåìûå Ïðîôèëÿìè , êîòîðûå ñåðâåðà ìîãóò óêàçûâàòü äëÿ ñîãëàñîâàíèÿ. Êëèåíòû ìîãóò â ïîñëåäñòâèè âûïîëíÿòü îáçîð ïðîôèëåé ñåðâåðà è ïðîáðàñûâàòü âçàèìîäåéñòâèå ñ ñåðâåðîì, îñíîâàííîì íà ïðîôèëÿõ.
OPC-UA ñïåöèôèêàöèÿ ñïðîåêòèðîâàíà êàê ÿäðî â ñëîå, èçîëèðîâàííîì îò ïîäëåæàùèõ êîìïüþòåðíûõ òåõíîëîãèé è ñåòåâûõ òðàíñïîðòîâ. Ýòî ïîçâîëÿåò OPC-UA ïðè íåîáõîäèìîñòè ðàñøèðÿòüñÿ íà áóäóùèå òåõíîëîãèè áåç îòòîðæåíèÿ îñíîâû äèçàéíà. Íà äàííûé ìîìåíò ñïåöèôèêàöèåé îïðåäåëåíû äâà ñïîñîáà êîäèðîâàíèÿ äàííûõ: XML/text è UA Binary. Â äîïîëíåíèå, îïðåäåëåíî äâà òèïà òðàíñïîðòíîãî ñëîÿ: TCP è HTTP/SOAP.
OPC-UA ñïðîåêòèðîâàí êàê ðåøåíèå äëÿ ìèãðàöèè ñ OPC êëèåíòîâ è ñåðâåðîâ, êîòîðûå îñíîâàíû íà Microsoft COM òåõíîëîãèÿõ. OPC COM ñåðâåðà (DA, HDA è A&E) ìîãóò áûòü ëåãêî îòðàæåíû â OPÑ-UA. Ïðîèçâîäèòåëè ìîãóò ñàìîñòîÿòåëüíî îñóùåñòâëÿòü òàêóþ ìèãðàöèþ èëè æå ðåêîìåíäîâàòü ïîëüçîâàòåëÿì èñïîëüçîâàòü îá¸ðòêè è êîíâåðòîðû ìåæäó ýòèìè ïðîòîêîëàìè. OPC-UA óíèôèöèðóåò ïðåäûäóùèå ìîäåëè â åäèíîì àäðåñíîì ïðîñòðàíñòâå ñ åäèíûì ìíîæåñòâîì ñåðâèñîâ.
2. Ìîäóëü ðåàëèçàöèè ñåðâåðà
Ìîäóëü ñåðâåðà ñîäåðæèò êîä ðåàëèçàöèè ñåðâåðíîé ÷àñòè OPC-UA — ñåðâåðíûõ ñåðâèñîâ, â ÷àñòè ñïåöèôè÷íîé äëÿ OpenSCADA, è èñïîëüçóÿ áèáëèîòåêó äëÿ OPC-UA ñïåöèôè÷íîé ÷àñòè. Äëÿ ïîñòðîåíèÿ OPC-UA ñåðâåðà äîñòàòî÷íî ñîçäàòü âõîäÿùèé òðàíñïîðò, îáû÷íî ýòî TCP-òðàíñïîðò ìîäóëÿ Sockets , è âûáðàòü â í¸ì ìîäóëü äàííîãî ïðîòîêîëà, à òàêæå ñêîíôèãóðèðîâàòü õîòÿ áû îäèí êîíå÷íûé óçåë ìîäóëÿ ïðîòîêîëà, î ÷¸ì íèæå.
2.1. Îáñëóæèâàíèå çàïðîñîâ ïî ïðîòîêîëó OPC-UA
Âõîäÿùèå çàïðîñû ê ìîäóëþ-ïðîòîêîëó îáðàáàòûâàþòñÿ ìîäóëåì â ñîîòâåòñòâèè ñî ñêîíôèãóðèðîâàííûìè êîíå÷íûìè óçëàìè OPC-UA (EndPoints) (ðèñ.1).
Ðèñ.1. Êîíå÷íûå óçëû ïðîòîêîëà.
Êîíå÷íûé óçåë ïðîòîêîëà OPC-UA ýòî ôàêòè÷åñêè îáúåêò ñåðâåðà OPC-UA. Êîíå÷íûå óçëû â OPC-UA ìîãóò áûòü êàê ëîêàëüíûìè, òàê è óäàë¸ííûìè. Ëîêàëüíûé êîíå÷íûé óçåë ïðåäíàçíà÷åí äëÿ ïðåäîñòàâëåíèÿ ðåñóðñîâ ñòàíöèè OpenSCADA ïî ïðîòîêîëó OPC-UA, â òîæå âðåìÿ óäàë¸ííûå êîíå÷íûå óçëû ñëóæàò äëÿ âûïîëíåíèÿ êàê ñåðâèñà îáçîðà äîñòóïíûõ OPC-UA óçëîâ, òàê è äëÿ øëþçîâàíèÿ çàïðîñîâ ê óäàë¸ííûì ñòàíöèÿì.  äàííîé âåðñèè ìîäóëÿ ïîääåðæèâàåòñÿ òîëüêî êîíôèãóðàöèÿ ëîêàëüíûõ êîíå÷íûõ óçëîâ.
Îáùàÿ êîíôèãóðàöèÿ êîíå÷íîãî óçëà îñóùåñòâëÿåòñÿ íà ãëàâíîé âêëàäêå ñòðàíèöû êîíå÷íîãî óçëà (ðèñ.2) ïàðàìåòðàìè:
Ñîñòîÿíèå óçëà, à èìåííî: ñòàòóñ, "Âêëþ÷åí" è èìÿ ÁÄ, ñîäåðæàùåé êîíôèãóðàöèþ.
Èäåíòèôèêàòîð, èìÿ è îïèñàíèå óçëà.
Ñîñòîÿíèå, â êîòîðîå ïåðåâîäèòü óçåë ïðè çàãðóçêå: "Âêëþ÷åí".
Òèï êîäèðîâàíèÿ ïðîòîêîëà. Íà äàííûé ìîìåíò ýòî òîëüêî "Áèíàðíûé".
URL êîíå÷íîé òî÷êè.
Ñåðòèôèêàò ñåðâåðà â ôîðìàòå PEM.
Ïðèâàòíûé êëþ÷ â ôîðìàòå PEM.
Ïîëèòèêè áåçîïàñíîñòè ñåðâåðà.
Ðèñ.2. Ãëàâíàÿ âêëàäêà ñòðàíèöû êîíå÷íîãî óçëà.
3. Ìîäóëü ñáîðà äàííûõ
Ìîäóëü ñáîðà äàííûõ ïðåäîñòàâëÿåò âîçìîæíîñòü îïðîñà è çàïèñè àòðèáóòîâ çíà÷åíèÿ(13) óçëîâ òèïà "Ïåðåìåííàÿ".
3.1. Îáúåêò êîíòðîëëåðà äàííûõ
Äëÿ äîáàâëåíèÿ èñòî÷íèêà äàííûõ OPC-UA ñîçäà¸òñÿ è êîíôèãóðèðóåòñÿ îáúåêò êîíòðîëëåðà â ñèñòåìå OpenSCADA. Ïðèìåð âêëàäêè êîíôèãóðàöèè îáúåêòà êîíòðîëëåðà äàííîãî òèïà èçîáðàæåí íà ðèñóíêå 3.
Ðèñ.3. Âêëàäêà êîíôèãóðàöèè îáúåêòà êîíòðîëëåðà.
Ñ ïîìîùüþ ýòîé âêëàäêè ìîæíî óñòàíîâèòü:
Ñîñòîÿíèå êîíòðîëëåðà, à èìåííî: Ñòàòóñ, "Âêëþ÷åí", Çàïóùåí" è èìÿ ÁÄ, ñîäåðæàùåé êîíôèãóðàöèþ.
Èäåíòèôèêàòîð, èìÿ è îïèñàíèå êîíòðîëëåðà.
Ñîñòîÿíèå, â êîòîðîå ïåðåâîäèòü êîíòðîëëåð ïðè çàãðóçêå: "Âêëþ÷åí" è "Çàïóùåí".
Èìÿ òàáëèöû äëÿ õðàíåíèÿ êîíôèãóðàöèè ïàðàìåòðîâ êîíòðîëëåðà.
Ïîëèòèêà ïëàíèðîâàíèÿ è ïðèîðèòåò çàäà÷è ñáîðà äàííûõ.
Ïåðèîä ñèíõðîíèçàöèè êîíôèãóðàöèè àòðèáóòîâ ïàðàìåòðîâ ñ óäàë¸ííîé ñòàíöèåé, à òàêæå âðåìÿ ïîâòîðà ïîïûòîê âîññòàíîâëåíèÿ ïîäêëþ÷åíèÿ.
URL êîíå÷íîãî óçëà óäàë¸ííîé ñòàíöèè — ñåðâåðà OPC-UA. Âíà÷àëå ýòîò àäðåñ ìîæíî óêàçàòü â âèäå "opc.tcp://{IP|name}:{port}", ïîñëå ÷åãî, â ñëó÷àå âêëþ÷åíèÿ îáúåêòà êîíòðîëëåðà è íàëè÷èÿ óêàçàííîãî OPC-UA óçëà, ïîÿâèòñÿ âîçìîæíîñòü âûáðàòü óòî÷í¸ííûé àäðåñ.
×àñòî âñòðå÷àåòñÿ ñèòóàöèÿ, êîãäà óòî÷í¸ííûé àäðåñ ÿâëÿåòñÿ ñèìâîëüíûì, êîòîðûé â ýòîé ñåòè íå ðåçîëâèòñÿ, èç-çà íåêîððåêòíîé íàñòðîéêè ñåðâåðà.  òàêèõ ñëó÷àÿõ íóæíî îñòàâèòü èñõîäíûé IP-àäðåñ èëè èìÿ êîòîðîå ðåçîëâèòñÿ â IP ïðàâèëüíî.
Ïîëèòèêà áåçîïàñíîñòè è ðåæèì áåçîïàñíîñòè ñîîáùåíèÿ.
Ñåðòèôèêàò êëèåíòà è ïðèâàòíûé êëþ÷ â ôîðìàòå PEM.
Ïîëüçîâàòåëü è ïàðîëü äëÿ àóòåíòèôèêàöèè íà ñåðâåðå. Ïóñòîå çíà÷åíèå âêëþ÷àåò àíîíèìíûé äîñòóï.
Îãðàíè÷åíèå ÷èñëà àòðèáóòîâ â ïàðàìåòðå.
Ñ öåëüþ îáëåã÷åíèÿ èäåíòèôèêàöèè óçëîâ íà óäàë¸ííîé ñòàíöèè, à òàêæå âûáîðà èõ äëÿ âñòàâêè â îáúåêòå ïàðàìåòðà êîíòðîëëåðà, â ñàìîì îáúåêòå êîíòðîëëåðà ïðåäóñìîòðåíà âêëàäêà íàâèãàöèè ïî óçëàì óäàë¸ííîé ñòàíöèè "Îáçîð óçëîâ ñåðâåðà", ãäå ìîæíî ïðîéòè ïî äåðåâó îáúåêòîâ è îçíàêîìèòñÿ ñ èõ àòðèáóòàìè (ðèñ.4).
Ðèñ.4. Âêëàäêà "Îáçîð óçëîâ ñåðâåðà" ñòðàíèöû îáúåêòà êîíòðîëëåðà.
3.2. Ïàðàìåòðû
Ìîäóëü ñáîðà äàííûõ ïðåäîñòàâëÿåò òîëüêî îäèí òèï ïàðàìåòðîâ — "Ñòàíäàðò". Äîïîëíèòåëüíûì êîíôèãóðàöèîííûì ïîëåì ïàðàìåòðà äàííîãî ìîäóëÿ (ðèñ.5) ÿâëÿåòñÿ ïåðå÷åíü óçëîâ OPC-UA è ïîëå îäíîñòðî÷íîé íàâèãàöèè ïî óçëàì OPC-UA äëÿ âñòàâêè âûáðàííûõ óçëîâ òèïà "Ïåðåìåííàÿ" â óêàçàííûé ïåðå÷åíü. Àòðèáóò â ýòîì ïåðå÷íå çàïèñûâàåòñÿ ñëåäóþùèì îáðàçîì: {ns}:{id} .
Ãäå:
ns — îáëàñòü èì¸í, ÷èñëîì; íóëåâîå çíà÷åíèå ìîæåò áûòü îïóùåíî;
id — èäåíòèôèêàòîð óçëà, ÷èñëîì, ñòðîêîé, ñòðîêîé áàéò èëè GUID.
Ïðèìåðû:
84 — êîðíåâîé óçåë;
3:"BasicDevices2" — óçåë áàçîâûõ óñòðîéñòâ â îáëàñòè èì¸í 3 è â âèäå ñòðîêè;
4:"61626364" — óçåë â îáëàñòè èì¸í 4 è â âèäå ñòðîêè áàéò;
4:{40d95ab0-50d6-46d3-bffd-f55639b853d4} — óçåë â îáëàñòè èì¸í 4 è â âèäå GUID.
Ðèñ.5. Âêëàäêà êîíôèãóðàöèè îáúåêòà ïàðàìåòðà.
Óçëû òèïà "Ïåðåìåííàÿ" ñî çíà÷åíèåì â âèäå ñòðóêòóðû ïðî÷èòàòü öåëèêîì îáû÷íî íåëüçÿ ïîýòîìó íåîáõîäèìî å¸ ýëåìåíòû âñòàâëÿòü â ïåðå÷åíü óçëîâ ÷òåíèÿ îòäåëüíî.
 ñîîòâåòñòâèè ñ óêàçàííûì ñïèñêîì óçëîâ âûïîëíÿåòñÿ îïðîñ è ñîçäàíèå àòðèáóòîâ ïàðàìåòðà (ðèñ.6).
Ðèñ.6. Âêëàäêà àòðèáóòîâ ïàðàìåòðà.
4. Áèáëèîòåêà libOPC_UA
Îñíîâûâàÿñü íà íàðàáîòêàõ äàííîãî ìîäóëÿ ïðîòîêîëüíûé êîä OPC-UA áûë âûíåñåí â îòäåëüíóþ áèáëèîòåêó è îïóáëèêîâàí ïîä ëèöåíçèåé LGPLv3. Äàííûå äåéñòâèÿ âûïîëíåíû ñ öåëüþ ïðåäîñòàâèòü âîçìîæíîñòü ïðîñòîãî äîáàâëåíèÿ ïîääåðæêè ïðîòîêîëà OPC-UA ñòîðîííèìè ïðîåêòàìè. Áèáëèîòåêà ïðåäñòàâëåíà äâóìÿ ôàéëàìè libOPC_UA.h, libOPC_UA.cpp; ïîääåðæèâàåòñÿ è ñîäåðæèòñÿ â ñîñòàâå äàííîãî ìîäóëÿ, ò.å. ïîñëåäíþþ âåðñèþ Âû ìîæåòå çàãðóçèòü çäåñü: http://oscada.org/svn/trunk/OpenSCADA/src/moduls/daq/OPC_UA/libOPC_UA .
Áèáëèîòåêà, êàê è äàííûé ìîäóëü, íàïèñàí íà ÿçûêå ïðîãðàììèðîâàíèÿ C++. Ñòàòè÷åñêàÿ äèàãðàììà êëàññîâ, îòðàæàþùàÿ àðõèòåêòóðó áèáëèîòåêè, ïðèâåäåíà íà ðèñóíêå 7. Ñîãëàñíî äèàãðàììå êëàññîâ áèáëèîòåêà âûïîëíåíà â îáëàñòè èì¸í "OPC", à àðõèòåêòóðíî å¸ ìîæíî ðàçäåëèòü íà êëèåíòñêóþ "Client" è ñåðâåðíóþ "Server" ÷àñòè, êîòîðûå óíàñëåäîâàíû îò îáùåãî êëàññà ïðîòîêîëà "UA". Êðîìå íåïîñðåäñòâåííî êëàññîâ ïðîòîêîëà "OPC-UA" áèáëèîòåêà âêëþ÷àåò â ñåáÿ íàáîð ôóíêöèé è êëàññîâ äëÿ îáðàáîòêè èëè õðàíåíèÿ äàííûõ ïðîòîêîëà, îòäåëüíî èç êîòîðûõ íóæíî îòìåòèòü êëàññ óçëà ÿçûêà XML "XML_N", èñïîëüçóåìûé äëÿ óíèôèêàöèè îáðàùåíèé ê API áèáëèîòåêè.
Ðèñ.7. Ñòàòè÷åñêàÿ äèàãðàììà êëàññîâ áèáëèîòåêè libOPC_UA.
Èñïîëüçîâàíèå áèáëèîòåêè, â öåëîì, çàêëþ÷àåòñÿ â íàñëåäîâàíèè îò êëàññà "Client" è/èëè "Server", ñîãëàñíî ñ ôóíêöèÿìè êîíå÷íîé ïðîãðàììû, è ïîñëåäóþùåé ðåàëèçàöèè âèðòóàëüíûõ ôóíêöèé ñâîéñòâ êëèåíòà/ñåðâåðà, â êîíòåêñòå ïðîòîêîëà OPC-UA, à òàêæå òðàíñïîðòíîé ÷àñòè êîììóíèêàöèè, ò.å. ïîäêëþ÷åíèå/îòêðûòèå ê TCP-ñîêåòó è ïåðåäà÷ó/÷òåíèå íåñòðóêòóðèðîâàííîãî ïîòîêà äàííûõ. Ïîñëåäóþùèå çàïðîñû è îáðàáîòêà çàïðîñîâ äàííûõ (äëÿ ñåðâåðà) îñóùåñòâëÿþòñÿ ÷åðåç âûçîâ ôóíêöèè reqService() , çàïðîñ ê ñåðâèñó, è/èëè îáðàáîòêîé âèðòóàëüíîé ôóíêöèè reqData() çàïðîñà ê äàííûì, ò.å. ïî ñóòè èíòåãðàöèÿ â ìîäåëü äàííûõ ïðèëîæåíèÿ.
4.1. Ñëóæåáíûå îáúåêòû, ôóíêöèè è êëàññ UA
Äàííûå
Òèïû ðåàëèçàöèé (enum — SerializerType):
ST_Binary = 0 — áèíàðíûé.
Òèï çàïðîñà îòêðûòèÿ êàíàëà áåçîïàñíîñòè (enum — SC_ReqTP):
SC_ISSUE = 0 — èñõîäíûé;
SC_RENEW = 1 — îáíîâëÿþùèé.
Ðåæèì áåçîïàñíîñòè ñîîáùåíèÿ (enum — MessageSecurityMode):
MS_None = 1 — áåç áåçîïàñíîñòè;
MS_Sign = 2 — ïîäïèñü;
MS_SignAndEncrypt = 3 — ïîäïèñü è øèôðîâàíèå;
Òèï àóòåíòèôèêàöèè (enum — AuthTp):
A_Anon = 0 — àíîíèìíî;
A_UserNm = 1 — ïîëüçîâàòåëü+ïàðîëü;
A_Cert = 2 — ñåðòèôèêàò.
Êëàññû óçëîâ (enum — NodeClasses):
NC_Object = 1 — îáúåêò;
NC_Variable = 2 — ïåðåìåííàÿ;
NC_Method = 4 — ìåòîä;
NC_ObjectType = 8 — òèï îáúåêòà;
NC_VariableType = 16 — òèï ïåðåìåííîé;
NC_ReferenceType = 32 — òèï ññûëêè;
NC_DataType = 64 — òèï äàííûõ;
NC_View = 128 — âèä.
Íàïðàâëåíèå îáçîðà (enum — BrowseDirection):
BD_FORWARD = 0 — âïåð¸ä;
BD_INVERSE = 1 — íàçàä;
BD_BOTH = 2 — âïåð¸ä è íàçàä.
Âîçâðàòíàÿ ìåòêà âðåìåíè (enum — TimestampsToReturn):
TS_SOURCE = 0 — èñòî÷íèêà;
TS_SERVER = 1 — ñåðâåðà;
TS_BOTH = 2 — èñòî÷íèêà è ñåðâåðà;
TS_NEITHER = 3 — îòñóòñòâóåò.
Äîñòóï (enum — Access):
ACS_Read = 0x01 — ÷òåíèå;
ACS_Write = 0x02 — çàïèñü;
ACS_HistRead = 0x04 — ÷òåíèå èñòîðèè;
ACS_HistWrite = 0x08 — çàïèñü èñòîðèè;
ACS_SemChange = 0x10 — ?.
Ýëåìåíòû ìàñêè îïèñàíèÿ îáçîðíîãî çàïðîñà (enum — RefDscrResMask):
RdRm_RefType = 0x01 — òèï ññûëêè;
RdRm_IsForward = 0x02 — íàïðàâëåíèå;
RdRm_NodeClass = 0x04 — êëàññ óçëà;
RdRm_BrowseName = 0x08 — èìÿ îáçîðà;
RdRm_DisplayName = 0x10 — èìÿ îòîáðàæåíèÿ;
RdRm_TypeDef = 0x20 — òèï îïðåäåëåíèÿ.
Èäåíòèôèêàòîðû àòðèáóòîâ óçëà (enum — AttrIds):
Aid_Error = 0 — îøèáêà;
AId_NodeId = 1 — èäåíòèôèêàòîð óçëà;
AId_NodeClass = 2 — êëàññ óçëà;
AId_BrowseName = 3 — èìÿ îáçîðà;
AId_DisplayName = 4 — èìÿ îòîáðàæåíèÿ;
AId_Descr = 5 — îïèñàíèå;
AId_WriteMask = 6 — ìàñêà çàïèñè;
AId_UserWriteMask = 7 — ìàñêà çàïèñè ïîëüçîâàòåëÿ;
AId_IsAbstract = 8 — àáñòðàêòíîñòü;
AId_Symmetric = 9 — ñèììåòðè÷íîñòü;
AId_InverseName = 10 — èíâåðñíîå èìÿ;
AId_ContainsNoLoops = 11 — íåñîäåðæàíèå ïåòëåé;
AId_EventNotifier = 12 — óâåäîìëåíèå ñîáûòèé;
AId_Value = 13 — çíà÷åíèå;
AId_DataType = 14 — òèï äàííûõ;
AId_ValueRank = 15 — ðàíã çíà÷åíèÿ;
AId_ArrayDimensions = 16 — ðàçìåðíîñòü ìàññèâà;
AId_AccessLevel = 17 — óðîâåíü äîñòóïà;
AId_UserAccessLevel = 18 — óðîâåíü äîñòóïà ïîëüçîâàòåëÿ;
AId_MinimumSamplingInterval = 19 — ìèíèìàëüíûé èíòåðâàë èçìåðåíèé;
AId_Historizing — àðõèâèðîâàíèå;
AId_Executable — èñïîëíÿåìûé;
AId_UserExecutable — èñïîëíÿåìûé ïîëüçîâàòåëåì.
Ñîñòîÿíèå ïîäïèñêè (enum — SubScrSt):
SS_CUR = 0 — òåêóùåå (íå ìåíÿòü êîìàíäîé);
SS_CLOSED = 1 — çàêðûòî;
SS_CREATING = 2 — ñîçäàíèå;
SS_NORMAL = 3 — íîðìàëüíûé;
SS_LATE = 4 — çàïîçäàëûé;
SS_KEEPALIVE = 5 — ñîõðàíåíèå æèâûì.
Ðåæèìû ìîíèòîðèíãà (enum — MonitoringMode):
MM_CUR = -1 — òåêóùåå (íå ìåíÿòü êîìàíäîé);
MM_DISABLED = 0 — îòêëþ÷åíî;
MM_SAMPLING = 1 — èçìåðåíèå;
MM_REPORTING = 2 — îò÷¸òíîñòü.
Âíåøíèå ôóíêöèè
 áèáëèîòåêó âêëþ÷åí ðÿä âíåøíèõ ôóíêöèé îáúåêòà TSYS ÿäðà OpenSCADA, äëÿ óïðîùåíèÿ è óíèôèêàöèè ðÿäà âíóòðåííèõ îïåðàöèé:
int64_t curTime( ); — Òåêóùåå âðåìÿ â ìèêðîñåêóíäàõ ñ íà÷àëà ýïîõè Unix (01.01.1970).
string int2str( int val ); — Ïðåîáðàçîâàíèå öåëîãî çíàêîâîãî â ñòðîêó, â äåñÿòè÷íîì ïðåäñòàâëåíèè.
string uint2str( unsigned val ); — Ïðåîáðàçîâàíèÿ öåëîãî áåççíàêîâîãî â ñòðîêó, â äåñÿòè÷íîì ïðåäñòàâëåíèè.
string ll2str( int64_t val ); — Ïðåîáðàçîâàíèÿ äëèííîãî öåëîãî (64áèò) â ñòðîêó, â äåñÿòè÷íîì ïðåäñòàâëåíèè.
string real2str( double val, int prec = 15, char tp = 'g' ); — Ïðåîáðàçîâàíèÿ âåùåñòâåííîãî ñ òî÷íîñòüþ prec çíàêîâ è òèïîì tp â ñòðîêó.
string strParse( const string &path, int level, const string &sep, int *off = NULL, bool mergeSepSymb = false ); — Ðàçáîð ñòðîêè path íà ñîñòàâëÿþùèå, îòäåë¸ííûå ðàçäåëèòåëåì sep , îáúåäèíÿÿ îäíîñèìâîëüíûå mergeSepSymb , íà÷èíàÿ ñî ñìåùåíèÿ off è êîíòðîëèðóÿ ñìåùåíèå êîíöà ýëåìåíòà â í¸ì æå.
string strMess( const char *fmt, ... ); — Ôîðìèðîâàíèå ñòîêè ïî øàáëîíó fmt è àðãóìåíòàì. Ðåàëèçîâàí íà îñíîâå "printf".
Îøèáêà OPC (OPCError)
Îáúåêò îøèáêè "OPCError" ÿâëÿåòñÿ óðåçàííîé êîïèåé îáúåêòà "TError" ÿäðà OpenSCADA.
Ïóáëè÷íûå ìåòîäû:
OPCError( const char *fmt, ... ); — Êîíñòðóêòîð òèïîâîé îøèáêè, áåç êîäà.
OPCError( int cod, const char *fmt, ... ); — Êîíñòðóêòîð òèïîâîé îøèáêè, c êîäîì îøèáêè.
Ïóáëè÷íûå àòðèáóòû:
int cod; — Êîä îøèáêè.
string mess; — Òåêñò îøèáêè.
XML-òåã (XML_N)
Îáúåêò "XML_N" ÿâëÿåòñÿ óðåçàííîé êîïèåé îáúåêòà XMLNode ÿäðà OpenSCADA.
Ïóáëè÷íûå ìåòîäû:
XML_N( const string &name = "" ); — Èíèöèàëèçàöèÿ òåãà ñ èìåíåì name .
XML_N( const XML_N &nd ); — Êîïèðóþùèé êîíñòðóêòîð.
XML_N &operator=( const XML_N &prm ); — Êîïèðîâàíèå âåòêè XML-äåðåâà èç prm .
string name( ) const; — Èìÿ òåãà.
XML_N* setName( const string &s ); — Óñòàíîâêà èìåíè òåãà â s .
string text( bool childs = false, bool recursive = false ) const; — Òåêñò òåãà. childs — äëÿ ïîëó÷åíèÿ òåêñòà èç ñïåöèàëèçèðîâàííûõ óçëîâ òåêñòà.
XML_N* setText( const string &s, bool childs = false ); — Óñòàíîâêà òåêñòà òåãà â s . childs — äëÿ óñòàíîâêè òåêñòà â ñïåöèàëèçèðîâàííûé óçåë òåêñòà.
void attrList( vector<string> & list ) const; — Ñïèñîê àòðèáóòîâ list â òåãå.
XML_N* attrDel( const string &name ); — Óäàëåíèå àòðèáóòà name .
void attrClear( ); — Î÷èñòêà àòðèáóòîâ òåãà.
string attr( const string &name, bool caseSens = true ) const; — Ïîëó÷åíèå àòðèáóòà name .
XML_N* setAttr( const string &name, const string &val ); — Óñòàíîâêà/ñîçäàíèå àòðèáóòà name ñî çíà÷åíèåì val .
XML_N* clear( ); — Î÷èñòêà òåãà (ðåêóðñèâíî, âêëþ÷àÿ âñå âëîæåíèÿ).
bool childEmpty( ) const; — Ïðîâåðêà íà îòñóòñòâèå âëîæåííûõ òåãîâ.
unsigned childSize( ) const; — Êîëè÷åñòâî âëîæåííûõ òåãîâ.
void childAdd( XML_N *nd ); XML_N* childAdd( const string &name = "" ); — Äîáàâëåíèå âëîæåííîãî òåãà.
int childIns( unsigned id, XML_N *nd ); — Âñòàâêà âëîæåííîãî òåãà nd â ïîçèöèþ id . Îòðèöàòåëüíîå çíà÷åíèå id îòñ÷èòûâàåò ñ êîíöà.
XML_N* childIns( unsigned id, const string &name = "" ); — Âñòàâêà âëîæåííîãî òåãà ñ èìåíåì name â ïîçèöèþ id . Îòðèöàòåëüíîå çíà÷åíèå id îòñ÷èòûâàåò ñ êîíöà.
void childDel( const unsigned id ); — Óäàëåíèå âëîæåííîãî òåãà id . Îòðèöàòåëüíîå çíà÷åíèå id îòñ÷èòûâàåò ñ êîíöà.
void childDel( XML_N *nd ); — Óäàëåíèå âëîæåííîãî òåãà ïî åãî àäðåñó nd .
void childClear( const string &name = "" ); — Î÷èñòêà âëîæåííîãî òåãà name .
XML_N* childGet( const int, bool noex = false ) const; — Ïîëó÷åíèå âëîæåííîãî òåãà ïî ïîðÿäêîâîìó íîìåðó.
XML_N* childGet( const string &name, const int numb = 0, bool noex = false ) const; — Ïîëó÷åíèå âëîæåííîãî numb ïîðÿäêîâîãî òåãà ïî èìåíè òåãà name . noex óêàçûâàåò íà çàïðåò ãåíåðàöèè èñêëþ÷åíèÿ â ñëó÷àå îòñóòñòâèÿ òåãà.
XML_N* childGet( const string &attr, const string &name, bool noex = false ) const; — Ïîëó÷åíèå âëîæåííîãî numb ïîðÿäêîâîãî òåãà ïî çíà÷åíèþ name àòðèáóòà attr . noex óêàçûâàåò íà çàïðåò ãåíåðàöèè èñêëþ÷åíèÿ â ñëó÷àå îòñóòñòâèÿ òåãà.
XML_N* getElementBy( const string &attr, const string &val ); — Ïîèñê âëîæåííîãî óçëà ïî çíà÷åíèþ val àòðèáóòà attr .
XML_N* parent( ); — Ðîäèòåëüñêèé òåã äàííîãî òåãà.
XML_N* root( ); — Êîðíåâîé òåã äàííîãî òåãà.
Îáúåêò óçëà OPC-UA (NodeId)
Äàííûå:
Òèïû äàííûõ (enum — NodeId::Type):
NodeId::Numeric — íîìåð.
NodeId::String — ñòðîêà.
NodeId::Guid — ãëîáàëüíûé óíèêàëüíûé èäåíòèôèêàòîð.
NodeId::Opaque — opaque.
Ïóáëè÷íûå ìåòîäû:
NodeId( uint32_t in, uint16_t ins = 0 ); — ×èñëåííûé èíèöèèðóþùèé êîíñòðóêòîð, äëÿ ÷èñëà in â îáëàñòè èì¸í ins .
NodeId( const string &istr, uint16_t ins = 0, Type tp = String ); — Ñòðîêîâûé èíèöèèðóþùèé êîíñòðóêòîð, äëÿ ñòðîêè istr â îáëàñòè èì¸í ins , ñ òèïîì tp .
NodeId( ); — Äåñòðóêòîð.
NodeId &operator=( const NodeId &node ); — Êîïèðîâàíèå îáúåêòà.
Type type( ) const; — Òèï óçëà.
bool isNull( ) const; — Óçåë íóëåâîé — íåèíèöèàëèçèðîâàííûé.
uint16_t ns( ) const; — Îáëàñòü èì¸í.
uint32_t numbVal( ) const; — ×èñëîâîå çíà÷åíèå.
string strVal( ) const; — Ñòðîêîâîå çíà÷åíèå.
void setNs( uint16_t ins ); — Óñòàíîâêà îáëàñòè èì¸í â ins .
void setNumbVal( uint32_t in ); — Óñòàíîâêà ÷èñëîâîãî çíà÷åíèÿ in .
void setStrVal( const string &istr, Type tp = String ); — Óñòàíîâêà ñòðîêîâîãî çíà÷åíèÿ istr ñ òèïîì tp .
static NodeId fromAddr( const string &strAddr ); — Ôîðìèðîâàíèå îáúåêòà óçëà èç àäðåñà strAddr .
string toAddr( ) const; — Ïîëó÷åíèå àäðåñà îáúåêòà óçëà.
Êîðíåâîé îáúåêò ïðîòîêîëà OPC-UA (UA)
Ïóáëè÷íûå ìåòîäû:
virtual string lang2CodeSYS( ); — äâóõ-ñèìâîëüíûé êîä ÿçûêà îêðóæåíèÿ.
virtual void debugMess( const string &mess ) — ðàçìåùåíèå îòëàäî÷íûõ ñîîáùåíèé.
static string iErr( const string &buf, int &off ); — ÷òåíèå îøèáêè èç ïîòîêà buf ïî ñìåùåíèþ off .
static const char *iVal( const string &buf, int &off, char vSz ); — ÷òåíèå çíà÷åíèÿ ðàçìåðîì vSz , êàê ó÷àñòîê äàííûõ, èç ïîòîêà buf ïî ñìåùåíèþ off .
static int64_t iN( const string &rb, int &off, char vSz ); — ÷òåíèå çíàêîâîãî öåëîãî ðàçìåðîì vSz (1, 2, 4, 8) èç ïîòîêà rb ïî ñìåùåíèþ off .
static uint64_t iNu( const string &rb, int &off, char vSz ); — ÷òåíèå áåççíàêîâîãî öåëîãî ðàçìåðîì vSz (1, 2, 4, 8) èç ïîòîêà rb ïî ñìåùåíèþ off .
static double iR( const string &rb, int &off, char vSz = 4 ); — ÷òåíèå âåùåñòâåííîãî ðàçìåðîì vSz (4, 8) èç ïîòîêà rb ïî ñìåùåíèþ off .
static string iS( const string &buf, int &off ); — ÷òåíèå ñòðîêè èç ïîòîêà buf ïî ñìåùåíèþ off .
static string iSl( const string &buf, int &off, string *locale = NULL ); — ÷òåíèå ëîêàëèçîâàííîé locale ñòðîêè èç ïîòîêà buf ïî ñìåùåíèþ off .
static string iSqlf( const string &buf, int &off, uint16_t *nsIdx = NULL ); — ÷òåíèå ñòðîêè ñ êâàëèôèêàòîðîì nsIdx èç ïîòîêà buf ïî ñìåùåíèþ off .
static int64_t iTm( const string &buf, int &off ); — ÷òåíèå âðåìåíè, ñ ïðåîáðàçîâàíèåì â ýïîõó UNIX, èç ïîòîêà buf ïî ñìåùåíèþ off .
static NodeId iNodeId( const string &buf, int &off ); — ÷òåíèå èäåíòèôèêàòîðà óçëà èç ïîòîêà buf ïî ñìåùåíèþ off .
static void iDataValue( const string &buf, int &off, XML_N &nVal ); — ÷òåíèå êîìïëåêñíîãî çíà÷åíèÿ (ñòðóêòóðà DataValue) â nVal èç ïîòîêà buf ïî ñìåùåíèþ off .
static void oN( string &buf, int64_t val, char sz, int off = -1 ); — çàïèñü çíàêîâîãî öåëîãî val ðàçìåðîì sz (1, 2, 4, 8) â ïîòîê buf ïî ñìåùåíèþ off .
static void oNu( string &buf, uint64_t val, char sz, int off = -1 ); — çàïèñü áåççíàêîâîãî öåëîãî val ðàçìåðîì sz (1, 2, 4, 8) â ïîòîê buf ïî ñìåùåíèþ off .
static void oR( string &buf, double val, char sz = 4 ); — çàïèñü âåùåñòâåííîãî val ðàçìåðîì sz (4, 8) â ïîòîê buf ïî ñìåùåíèþ off .
static void oS( string &buf, const string &val, int off = -1 ); — çàïèñü ñòðîêè val â ïîòîê buf ïî ñìåùåíèþ off .
static void oSl( string &buf, const string &val, const string &locale = "" ); — çàïèñü ëîêàëèçîâàííîé locale ñòðîêè val â ïîòîê buf ïî ñìåùåíèþ off .
static void oSqlf( string &buf, const string &val, uint16_t nsIdx = 0 ); — çàïèñü ñòðîêè val ñ êâàëèôèêàòîðîì nsIdx â ïîòîê buf ïî ñìåùåíèþ off .
static void oTm( string &buf, int64_t val ); — çàïèñü âðåìåíè val , â ýïîõå UNIX, â ïîòîê buf ïî ñìåùåíèþ off .
static void oNodeId( string &buf, const NodeId &val ); — çàïèñü èäåíòèôèêàòîðà óçëà val â ïîòîê buf ïî ñìåùåíèþ off .
static void oRef( string &buf, uint32_t resMask, const NodeId &nodeId, const NodeId &refTypeId, bool isForward, const string &name, uint32_t nodeClass, const NodeId &typeDef ); — çàïèñü â ïîòîê buf îïèñàòåëÿ îáçîðà (ñòðóêòóðà ReferenceDescription) äëÿ ìàñêè ðåçóëüòàòà resMask , óçëà nodeId , òèïà ññûëêè refTypeId , íàïðàâëåíèÿ isForward , èìåíè name , êëàññà óçëà nodeClass , òèïà îïðåäåëåíèÿ typeDef .
void oDataValue( string &buf, uint8_t eMsk, const string &vl, uint8_t vEMsk = 0, int64_t srcTmStmp = 0 ); — çàïèñü êîìïëåêñíîãî çíà÷åíèÿ (ñòðóêòóðà DataValue) â ïîòîê buf äëÿ ìàñêè êîäèðîâàíèÿ eMsk , çíà÷åíèÿ vl , ìàñêè çíà÷åíèÿ vEMsk , âðåìåíè èñòî÷íèêà srcTmStmp .
static string randBytes( int num ); — ãåíåðàöèÿ ïîòîêà ñëó÷àéíûõ äàííûõ â êîëè÷åñòâå num .
static string certPEM2DER( const string &certPem ); — ïðåîáðàçîâàíèå ñåðòèôèêàòà èç ôîðìàòà PEM certPem â ôîðìàò DER.
static string certDER2PEM( const string &certDer ); — ïðåîáðàçîâàíèå ñåðòèôèêàòà èç ôîðìàòà DER certDer â ôîðìàò PEM.
static string certThumbprint( const string &certPem ); — ïîëó÷åíèå ïîäïèñè èç ñåðòèôèêàòà PEM certPem .
static string asymmetricEncrypt( const string &mess, const string &certPem, const string &secPolicy ); — àñèììåòðè÷íîå êîäèðîâàíèå ïîòîêà ñîîáùåíèÿ mess ñåðòèôèêàòîì certPem (îòêðûòûì êëþ÷îì) äëÿ ïîëèòèêè secPolicy .
static string asymmetricDecrypt( const string &mess, const string &pvKeyPem, const string &secPolicy ); — àñèììåòðè÷íîå äåêîäèðîâàíèå ïîòîêà ñîîáùåíèÿ mess êëþ÷îì pvKeyPem äëÿ ïîëèòèêè secPolicy .
static bool asymmetricVerify( const string &mess, const string &sign, const string &certPem ); — àñèììåòðè÷íàÿ âåðèôèêàöèÿ ïîäïèñè sign ñîîáùåíèÿ mess ñåðòèôèêàòîì certPem .
static string asymmetricSign( const string &mess, const string &pvPem ); — ïîëó÷åíèå àñèììåòðè÷íîé ïîäïèñè çàêðûòûì êëþ÷îì ñåðòèôèêàòà pvPem äëÿ ñîîáùåíèÿ mess .
static int asymmetricKeyLength( const string &keyCertPem ); — ïîëó÷åíèå äëèíû êëþ÷à ñåðòèôèêàòà keyCertPem .
static string deriveKey( const string &secret, const string &seed, int keyLen ); — èçâëå÷åíèå êëþ÷à ðàçìåðîì keyLen èç ñåêðåòà secret è seed .
static string symmetricEncrypt( const string &mess, const string &keySet, const string &secPolicy ); — ñèììåòðè÷íîå øèôðîâàíèå ïîòîêà ñîîáùåíèÿ mess êëþ÷îì keySet äëÿ ïîëèòèêè secPolicy .
static string symmetricDecrypt( const string &mess, const string &keySet, const string &secPolicy ); — àñèììåòðè÷íîå äåøèôðèðîâàíèå ïîòîêà ñîîáùåíèÿ mess êëþ÷îì keySet äëÿ ïîëèòèêè secPolicy .
static string symmetricSign( const string &mess, const string &keySet, const string &secPolicy ); — ïîëó÷åíèå ñèììåòðè÷íîé ïîäïèñè êëþ÷îì keySet äëÿ ñîîáùåíèÿ mess è ïîëèòèêè secPolicy .
Âêëþ÷åííûé îáúåêò ïàðàìåòðîâ áåçîïàñíîñòè (SecuritySetting)
Ïóáëè÷íûå äàííûå:
string policy — ïîëèòèêà áåçîïàñíîñòè;
MessageSecurityMode messageMode — ðåæèì ñîîáùåíèÿ;
Ïóáëè÷íûå ìåòîäû:
SecuritySetting( const string &iplc, int8_t imMode ) — êîíñòðóêòîð îáúåêòà ñ ïîëèòèêîé áåçîïàñíîñòè iplc è ðåæèìîì ñîîáùåíèÿ imMode .
SecuritySetting( ) — êîíñòðóêòîð îáúåêòà ñ ïîëèòèêîé áåçîïàñíîñòè "None" è ðåæèìîì ñîîáùåíèÿ MS_None .
4.2. Îñíîâíîé îáúåêò êëèåíòà (Client->UA)
Ïðèìåíåíèå: Ïðÿìî íàñëåäóåòñÿ ïîëüçîâàòåëüñêèì îáúåêòîì — êëèåíò OPC-UA.
Ïóáëè÷íûå ìåòîäû:
virtual string applicationUri( ) = 0; — URI ïðèëîæåíèÿ.
virtual string productUri( ) = 0; — URI ïðîäóêòà.
virtual string applicationName( ) = 0; — èìÿ ïðèëîæåíèÿ.
virtual string sessionName( ) = 0; — èìÿ ñåàíñà.
virtual string endPoint( ) = 0; — êîíå÷íàÿ òî÷êà.
virtual string secPolicy( ) = 0; — ïîëèòèêà áåçîïàñíîñòè.
virtual int secMessMode( ) = 0; — ðåæèì áåçîïàñíîñòè ñîîáùåíèÿ.
virtual string cert( ) = 0; — ñåðòèôèêàò.
virtual string pvKey( ) = 0; — ïðèâàòíûé êëþ÷.
virtual string authData( ) = 0; — äàííûå àóòåíòèôèêàöèè:
"<Empty>" — àíîíèìíûé;
"{User}\n{Password}" — ïî ïîëüçîâàòåëþ è ïàðîëþ.
virtual int messIO( const char *oBuf, int oLen, char *iBuf = NULL, int iLen = 0 ) = 0; — îáìåí ñîîáùåíèÿ, ïåðåäà÷à çàïðîñà è îæèäàíèå îòâåòà.
virtual bool connect( int8_t est = -1 ); — ïîëó÷åíèå ñòàòóñà ïîäêëþ÷åíèÿ, óñòàíîâêà ïîäêëþ÷åíèÿ äëÿ est = 1, îòêëþ÷åíèå äëÿ est = 0.
virtual void protIO( XML_N &io ); — îáðàáîòêà çàïðîñà ê ïðîòîêîëó.
virtual void reqService( XML_N &io ); — çàïðîñ ñåðâèñà.
Çàùèù¸ííûå àòðèáóòû:
SClntSess sess; — äàííûå ñåàíñà.
Âêëþ÷åííûé îáúåêò ñåàíñà êëèåíòà (SClntSess)
Ïóáëè÷íûå äàííûå:
string endPoint; — êîíå÷íàÿ òî÷êà;
XML_N endPointDscr; — îïèñàíèå àêòèâíîé êîíå÷íîé òî÷êè;
uint32_t secChnl; — èíäåêñ êàíàëà áåçîïàñíîñòè;
uint32_t secToken; — òàëîí áåçîïàñíîñòè ñåàíñà;
uint32_t sqNumb; — íîìåð ïîñëåäîâàòåëüíîñòè;
uint32_t sqReqId; — ïîðÿäêîâûé íîìåð çàïðîñà;
uint32_t reqHndl; — õàíäëåð çàïðîñà;
int secLifeTime; — âðåìÿ æèçíè êàíàëà áåçîïàñíîñòè;
string sesId; — èäåíòèôèêàòîð ñåàíñà;
string authTkId; — òàëîí àóòåíòèôèêàöèè;
int64_t sessOpen; — âðåìÿ îòêðûòèÿ ñåàíñà;
double sesLifeTime; — âðåìÿ æèçíè ñåàíñà;
string servCert; — ñåðòèôèêàò ñåðâåðà;
string secPolicy; — ïîëèòèêà áåçîïàñíîñòè;
char secMessMode; — ðåæèì áåçîïàñíîñòè ñîîáùåíèÿ;
string clKey, servKey; — êëþ÷è êëèåíòà è ñåðâåðà.
Ïóáëè÷íûå ìåòîäû:
void clearSess( ) — î÷èñòêà ñåàíñà.
void clearFull( bool inclEPdescr = false ) — ïîëíàÿ î÷èñòêà ñåàíñà, âêëþ÷àÿ îïèñàíèå êîíå÷íîé òî÷êè inclEPdescr .
4.3. Îñíîâíîé îáúåêò ñåðâåðà (Server->UA)
Ïðèìåíåíèå: Ïðÿìî íàñëåäóåòñÿ ïîëüçîâàòåëüñêèì îáúåêòîì — ñåðâåð OPC-UA.
Ïóáëè÷íûå ìåòîäû:
virtual string applicationUri( ) = 0; — URI ïðèëîæåíèÿ.
virtual string productUri( ) = 0; — URI ïðîäóêòà.
virtual string applicationName( ) = 0; — èìÿ ïðèëîæåíèÿ.
virtual bool debug( ); — àêòèâèðîâàíà îòëàäêà.
virtual void discoveryUrls( vector<string> &ls ) = 0; — URLû ñåðâåðîâ îáçîðà â ls .
virtual bool inReq( string &request, const string &inPrtId, string *answ = NULL ); — îáðàáîò÷èê âõîäÿùèõ çàïðîñîâ request ýêçåìïëÿðà ïðîòîêîëà inPrtId è îòâåòà â answ .
virtual int writeToClient( const string &threadId, const string &data ) = 0; — ïðÿìàÿ çàïèñü ïîäêëþ÷åííîìó êëèåíòó.
virtual string clientAddr( const string &threadId ) = 0; — àäðåñ êëèåíòà.
int chnlSet( int cid, const string &iEp, int32_t lifeTm = 0, const string& iClCert = "", const string &iSecPolicy = "None", char iSecMessMode = 1, const string &iclAddr = "", uint32_t iseqN = 1 ); — óñòàíîâêà êàíàëà áåçîïàñíîñòè ñ èäåíòèôèêàòîðîì cid (íåíóëåâîå çíà÷åíèå äëÿ îáíîâëåíèÿ) äëÿ êîíå÷íîé òî÷êè iEp , âðåìåíè æèçíè lifeTm , êëèåíòñêîãî ñåðòèôèêàòà iClCert , ïîëèòèêè áåçîïàñíîñòè iSecPolicy , ðåæèìà áåçîïàñíîñòè ñîîáùåíèÿ iSecMessMode , àäðåñà êëèåíòà iclAddr , íîìåðà ïîñëåäîâàòåëüíîñòè ïàêåòà iseqN .
void chnlClose( int cid ); — çàêðûòèå êàíàëà áåçîïàñíîñòè cid .
SecCnl chnlGet( int cid ); SecCnl &chnlGet_( int cid ); — ïîëó÷åíèå êîïèè è äîñòóïà ê îáúåêòó êàíàëà áåçîïàñíîñòè cid .
void chnlSecSet( int cid, const string &servKey, const string &clKey ); — óñòàíîâêà äëÿ êàíàëà áåçîïàñíîñòè cid ñåðâåðíîãî servKey è êëèåíòñêîãî clKey êëþ÷à.
static string mkError( uint32_t errId, const string &err = "" ); — ôîðìèðîâàíèå îøèáêè ñ èäåíòèôèêàòîðîì errId è ñîîáùåíèåì err .
Çàùèù¸ííûå ìåòîäû:
virtual void epEnList( vector<string> &ls ) = 0; — îáðàáîò÷èê çàïðîñà ïåðå÷íÿ êîíå÷íûõ óçëîâ.
virtual EP *epEnAt( const string &ep ) = 0; — îáðàáîò÷èê çàïðîñà îáúåêòà êîíå÷íîé òî÷êè.
Âêëþ÷åííûé îáúåêò êàíàëà áåçîïàñíîñòè (SecCnl)
Ïóáëè÷íûå ìåòîäû:
SecCnl( const string &iEp, uint32_t iTokenId, int32_t iLifeTm, const string &iClCert, const string &iSecPolicy, char iSecMessMode, const string &iclAddr, uint32_t isecN ); — êîíñòðóêòîð îáúåêòà êàíàëà áåçîïàñíîñòè äëÿ: êîíå÷íîé òî÷êè iEp , òàëîíà áåçîïàñíîñòè iTokenId , âðåìåíè æèçíè iLifeTm , êëèåíòñêîãî ñåðòèôèêàòà iClCert , ïîëèòèêè áåçîïàñíîñòè iSecPolicy , ðåæèìà áåçîïàñíîñòè ñîîáùåíèÿ iSecMessMode , àäðåñà êëèåíòà iclAddr , íîìåðà ïîñëåäîâàòåëüíîñòè ñîçäàíèÿ êàíàëà áåçîïàñíîñòè isecN .
Ïóáëè÷íûå àòðèáóòû:
string endPoint; — êîíå÷íàÿ òî÷êà;
string secPolicy; — ïîëèòèêà áåçîïàñíîñòè;
char secMessMode; — ðåæèì áåçîïàñíîñòè ñîîáùåíèÿ;
int64_t tCreate; — âðåìÿ ñîçäàíèå;
int32_t tLife; — âðåìÿ æèçíè;
uint32_t TokenId, TokenIdPrev; — òåêóùèé è ïðåäûäóùèé èäåíòèôèêàòîðû òàëîíà;
string clCert, clAddr; — ñåðòèôèêàò è àäðåñ êëèåíòà;
string servKey, clKey; — êëþ÷ ñåðâåðà è êëèåíòà;
uint32_t seqN, startSeqN; — òåêóùèé è ñòàðòîâûé íîìåð ïîñëåäîâàòåëüíîñòè ïàêåòà ñîçäàíèÿ êàíàëà.
Âêëþ÷åííûé îáúåêò ñåàíñà (Sess)
Ïóáëè÷íûå ìåòîäû:
Sess( const string &iName, double iTInact ); — êîíñòðóêòîð îáúåêòà äëÿ èìåíè iName è òàéìàóòà íåàêòèâíîñòè iTInact .
Ïóáëè÷íûå àòðèáóòû:
string name, inPrtId, idPolicyId, user; — èìÿ, èäåíòèôèêàòîð âõîäÿùåãî ïðîòîêîëà, èäåíòèôèêàòîð ïîëèòèêè áåçîïàñíîñòè è ïîëüçîâàòåëü;
vector<uint32_t> secCnls; — ïåðå÷åíü êàíàëîâ áåçîïàñíîñòè;
double tInact; — âðåìÿ íåàêòèâíîñòè;
int64_t tAccess; — âðåìÿ äîñòóïà;
string servNonce; — ñëó÷àéíàÿ ïîñëåäîâàòåëüíîñòü ñåðâåðà;
map<string, ContPoint> cntPnts; — òî÷êè ïðîäîëæåíèÿ çàïðîñà îáçîðà;
deque<string> publishReqs; — ïåðå÷åíü çàïðîñîâ ïóáëèêàöèè.
Âêëþ÷åííûé îáúåêò òî÷êè ïðîäîëæåíèÿ îáçîðà (ContPoint)
Ïóáëè÷íûå ìåòîäû:
ContPoint( const string &i_brNode, const string &i_lstNode, uint32_t i_brDir, uint32_t i_refPerN, const string &i_refTypeId, uint32_t i_nClassMask, uint32_t i_resMask ) — êîíñòðóêòîð îáúåêòà äëÿ óçëà âåòâè ïðîäîëæåíèÿ îáçîðà i_brNode , óçëà ñïèñêà i_lstNode , íàïðàâëåíèÿ îáçîðà i_brDir , ÷èñëà ññûëîê íà óçåë i_refPerN , èäåíòèôèêàòîðà ññûëêè i_refTypeId , ìàñêè êëàññà óçëà i_nClassMask è ìàñêè ðåçóëüòàòà i_resMask .
bool empty( ) const; — òî÷êà ïðîäîëæåíèÿ ïóñòà.
Ïóáëè÷íûå àòðèáóòû:
uint32_t brDir, refPerN, nClassMask, resMask; — íàïðàâëåíèå îáçîðà, ÷èñëî ññûëîê íà óçåë, ìàñêà êëàññà óçëà, ìàñêà ðåçóëüòàòà;
string brNode, lstNode, refTypeId; — âåòâü óçëîâ, ñïèñîê óçëà è èäåíòèôèêàòîð òèïà ññûëêè.
Âêëþ÷åííûé îáúåêò ïîäïèñêè (Subscr)
Ïóáëè÷íûå ìåòîäû:
Subscr copy( bool noWorkData = true ); — êîïèÿ îáúåêòà ïîäïèñêè, áåç ðàáî÷èõ äàííûõ noWorkData .
SubScrSt setState( SubScrSt st = SS_CUR ); — óñòàíîâêà ñîñòîÿíèÿ â st .
Ïóáëè÷íûå àòðèáóòû:
SubScrSt st; — ñòàòóñ ïîäïèñêè;
int sess; — ñåàíñ ïîäïèñêè;
bool en; — ñòàòóñ "Âêëþ÷åí";
double publInterv; — èíòåðâàë ïóáëèêàöèè (ìñ);
uint32_t seqN; — íîìåð ïîñëåäîâàòåëüíîñòè äëÿ îòâåòîâ, çàâîðà÷èâàåòñÿ ÷åðåç 1, íå èíêðåìåíòèðóåòñÿ íà KeepAlive ñîîáùåíèÿõ;
uint32_t cntrLifeTime, wLT; — ñ÷¸ò÷èê, ïî èñ÷åðïàíèþ êîòîðîãî â òå÷åíèè îòñóòñòâèÿ óâåäîìëåíèÿ îò êëèåíòà íåîáõîäèìî óäàëÿòü äàííûé îáúåêò;
uint32_t cntrKeepAlive, wKA; — ñ÷¸ò÷èê, ïî èñ÷åðïàíèþ êîòîðîãî íóæíî îòïðàâëÿòü ïóñòîé îòâåò ïóáëèêàöèè è óñòàíàâëèâàòü StatusChangeNotification â Bad_Timeout;
uint32_t maxNotPerPubl; — ìàêñèìàëüíîå êîëè÷åñòâî óâåäîìëåíèé íà îäèí îòâåò ïóáëèêàöèè;
uint8_t pr; — ïðèîðèòåò;
vector<MonitItem> mItems; — ïåðå÷åíü ýëåìåíòîâ ìîíèòîðèíãà;
deque<string> retrQueue; — î÷åðåäü ïåðåïîñûëêè; èñïîëüçóåòñÿ çàïðîñîì ïåðåïîñûëêè (Republish); î÷èùàåòñÿ íà ãëóáèíó ñîãëàñíî KeepAlive èëè ïðÿìûì çàïðîñîì â íàáîðå ïîäòâåðæäåíèÿ.
Âêëþ÷åííûé îáúåêò ýëåìåíòà ìîíèòîðèíãà (MonitItem)
Ïóáëè÷íûå àòðèáóòû:
MonitoringMode md; — ðåæèì ìîíèòîðèíãà;
NodeId nd; — öåëåâîé óçåë;
uint32_t aid; — èäåíòèôèêàòîð àòðèáóòà óçëà;
TimestampsToReturn tmToRet; — ìåòêà âðåìåíè äëÿ âîçâðàòà;
double smplItv; — èíòåðâàë èçìåðåíèé;
uint32_t qSz; — ðàçìåð î÷åðåäè;
bool dO; — îòáðàñûâàòü ñòàðûå;
uint32_t cH; — óêàçàòåëü êëèåíòà;
int vTp; — òèï çíà÷åíèé;
int64_t dtTm; — âðåìÿ ïîñëåäíåãî çíà÷åíèÿ;
deque<Val> vQueue; — î÷åðåäü çíà÷åíèé.
Âêëþ÷åííûé îáúåêò ýëåìåíòà çíà÷åíèÿ (Val)
Ïóáëè÷íûå ìåòîäû:
Val( const string &ivl, int64_t itm ) — êîíñòðóêòîð îáúåêòà çíà÷åíèÿ ivl íà âðåìÿ tm .
Ïóáëè÷íûå àòðèáóòû:
string vl; — çíà÷åíèå;
int64_t tm; — âðåìÿ çíà÷åíèÿ.
Âêëþ÷åííûé îáúåêò êîíå÷íîé òî÷êè (EP)
Ïóáëè÷íûå ìåòîäû:
EP( Server *serv ); — êîíñòðóêòîð îáúåêòà, ïðèâÿçàííîãî ê ñåðâåðó serv .
virtual string id( ) = 0; — èäåíòèôèêàòîð;
virtual string url( ) = 0; — URL;
virtual string cert( ) = 0; — ñåðòèôèêàò, ñòðîêîé ôîðìàòà PEM;
virtual string pvKey( ) = 0; — ïðèâàòíûé êëþ÷, ñòðîêîé ôîðìàòà PEM;
virtual double subscrProcPer( ) = 0; — îáùèé ìèíèìàëüíûé ïåðèîä öèêëà ïóáëèêàöèè è îáðàáîòêè åãî äàííûõ;
virtual uint32_t limSubScr( ); — îãðàíè÷åíèå íà êîëè÷åñòâî ïîäïèñîê;
virtual uint32_t limMonitItms( ); — îãðàíè÷åíèå êîëè÷åñòâà ýëåìåíòîâ ìîíèòîðèíãà;
virtual uint32_t limRetrQueueTm( ); — îãðàíè÷åíèå âðåìåíè íà ãëóáèíó î÷åðåäè ïîâòîðíîé ïåðåäà÷è;
bool enableStat( ); — ñîñòîÿíèå "Âêëþ÷åíî";
virtual void setEnable( bool vl ); — óñòàíîâèòü âî "Âêëþ÷åíî";
void subScrCycle( unsigned cntr ); — ôóíêöèÿ âûçîâà öèêëà îáðàáîòêè ïîäïèñîê;
int secSize( ); — êîëè÷åñòâî ïîëèòèê áåçîïàñíîñòè;
string secPolicy( int isec ); — ïîëó÷åíèå îïèñàíèÿ ïîëèòèêè áåçîïàñíîñòè isec ;
MessageSecurityMode secMessageMode( int isec ); — ðåæèì áåçîïàñíîñòè ñîîáùåíèÿ ïîëèòèêè áåçîïàñíîñòè isec ;
int sessCreate( const string &iName, double iTInact ); — ñîçäàíèå ñåàíñà ñ èìåíåì iName è òàéìàóòîì íåàêòèâíîñòè iTInact , âîçâðàùàåò èäåíòèôèêàòîð ñåàíñà;
void sessServNonceSet( int sid, const string &servNonce ); — óñòàíîâêà ïîñëåäîâàòåëüíîñòè áåçîïàñíîñòè ñåàíñà sid ñåðâåðà â servNonce ;
virtual uint32_t sessActivate( int sid, uint32_t secCnl, bool check = false, const string &inPrtId = "", const XML_N &identTkn = XML_N() ); — àêòèâàöèÿ ñåàíñà sid äëÿ ñâÿçûâàíèÿ ñ êàíàëîì áåçîïàñíîñòè secCnl , c ïðîâåðêîé check íà âîçìîæíîñòü-íåîáõîäèìîñòü ïåðåíàçíà÷åíèÿ, ïîñëå ðàçðûâà ïðåäûäóùåãî êàíàëà áåçîïàñíîñòè, âîçâðàùàåò îøèáêó (0 - îøèáêè íåò);
void sessClose( int sid ); — çàêðûòèå ñåàíñà sid ;
Sess sessGet( int sid ); — ïîëó÷åíèå ýêçåìïëÿðà îáúåêòà ñåàíñà äëÿ sid ;
Sess::ContPoint sessCpGet( int sid, const string &cpId ); — ïîëó÷åíèå òî÷êè ïðîäîëæåíèÿ áðàóçèíãà cpId ñåàíñà sid ;
void sessCpSet( int sid, const string &cpId, const Sess::ContPoint &cp = Sess::ContPoint() ); — óñòàíîâêà òî÷êè ïðîäîëæåíèÿ áðàóçèíãà cp äëÿ ñåàíñà sid è èäåíòèôèêàòîðà cpId ;
uint32_t subscrSet( uint32_t ssId, SubScrSt st, bool en = false, int sess = -1, double publInterv = 0, uint32_t cntrLifeTime = 0, uint32_t cntrKeepAlive = 0, uint32_t maxNotePerPubl = OpcUa_NPosID, int pr = -1 ); — óñòàíîâêà-ñîçäàíèå ïîäïèñêè ssId äëÿ: ñîñòîÿíèÿ st , âêëþ÷åíèÿ en , ñåàíñà sess , èíòåðâàëà ïóáëèêàöèè publInterv , ñ÷¸ò÷èêà âðåìåíè æèçíè cntrLifeTime , ñ÷¸ò÷èêà ñîõðàíåíèÿ "æèâûì" cntrKeepAlive , ìàêñèìàëüíîãî êîëè÷åñòâà óâåäîìëåíèé â ïóáëèêàöèè maxNotePerPubl , ïðèîðèòåòà pr ;
Subscr subscrGet( uint32_t ssId, bool noWorkData = true ); — ïîëó÷åíèå ýêçåìïëÿðà ïîäïèñêè ssId , áåç ðàáî÷èõ äàííûõ noWorkData ;
uint32_t mItSet( uint32_t ssId, uint32_t mItId, MonitoringMode md = MM_CUR, const NodeId &nd = NodeId(), uint32_t aid = OpcUa_NPosID, TimestampsToReturn tmToRet = TimestampsToReturn(-1), double smplItv = -2, uint32_t qSz = OpcUa_NPosID, int8_t dO = -1, uint32_t cH = OpcUa_NPosID ); — óñòàíîâêà-ñîçäàíèå ýëåìåíòà ìîíèòîðèíãà mItId ñåàíñà ssId äëÿ: ðåæèìà md , óçëà nd , àòðèáóòà aid , ïðîôèëÿ ìåòêè âðåìåíè tmToRet , èíòåðâàëà èçìåðåíèÿ smplItv , ðàçìåðà î÷åðåäè qSz , îòáðîñà ñòàðûõ dO , óêàçàòåëÿ êëèåíòà cH ;
Subscr::MonitItem mItGet( uint32_t ssId, uint32_t mItId ); — ïîëó÷åíèå ýêçåìïëÿðà ýëåìåíòà ìîíèòîðèíãà mItId äëÿ ñåàíñà ssId ;
virtual uint32_t reqData( int reqTp, XML_N &req ); — îáðàáîò÷èê çàïðîñ äàííûõ, çàïðîñ ê äåðåâó óçëîâ ñåðâåðà.
Çàùèù¸ííûå ìåòîäû:
XML_N *nodeReg( const NodeId &parent, const NodeId &ndId, const string &name, int ndClass, const NodeId &refTypeId, const NodeId &typeDef = 0 ); — ðåãèñòðàöèÿ óçëà ndId â äåðåâå óçëîâ ñåðâåðà äëÿ: ðîäèòåëÿ parent , êëàññà óçëà ndClass , èäåíòèôèêàòîðà òèïà ññûëêè refTypeId è òèïà îïðåäåëåíèÿ typeDef ;
Sess *sessGet_( int sid ); — ïîëó÷åíèå ññûëêè íà îáúåêò ñåàíñà sid , äîñòóï íå çàùèù¸í çàõâàòîì ðåñóðñà.
Çàùèù¸ííûå àòðèáóòû:
char mEn; — ñîñòîÿíèå "Âêëþ÷åí";
uint64_t cntReq; — ñ÷¸ò÷èê çàïðîñîâ;
vector<SecuritySetting> mSec; — ïåðå÷åíü ïîëèòèê áåçîïàñíîñòè êîíå÷íîãî óçëà;
vector<Sess> mSess; — ïåðå÷åíü îòêðûòûõ ñåàíñîâ;
vector<Subscr> mSubScr; — ïåðå÷åíü ïîäïèñîê;
XML_N objTree; — äåðåâî óçëîâ ñåðâåðà;
map<string, XML_N*> ndMap; — êàðòà ññûëîê íà óçëû äåðåâà;
pthread_mutex_t> mtxData; — ìþòåêñ äëÿ áëîêèðîâàíèÿ ìíîãîïîòî÷íîãî äîñòóïà;
Server *serv; — ññûëêà íà ñåðâåð, êîíòåéíåð îáúåêòà êîíå÷íîé òî÷êè.
5. Ïðèâàòíûå êëþ÷è è ñåðòèôèêàòû
Äëÿ ðàáîòû êëèåíòñêîé è ïðîòîêîëüíîé ÷àñòè OPC-UA íåîáõîäèìî ñîçäàíèå è ïîìåùåíèå ïðèâàòíîãî êëþ÷à è ñåðòèôèêàòà â êîíôèãóðàöèþ îáúåêòà êëèåíòà è ñåðâåðà.  îáùåì ñëó÷àå äîñòàòî÷íî ñîçäàíèÿ îáû÷íîãî ñàìîïîäïèñàííîãî ñåðòèôèêàòà è ïðèâàòíîãî êëþ÷à áåç ïàðîëÿ, îäíàêî äëÿ èñêëþ÷åíèÿ ïðåäóïðåäèòåëüíûõ ñîîáùåíèé íåîáõîäèìî äîáàâèòü ðÿä ñëóæåáíûõ ïîëåé â ñåðòèôèêàò. Ýòî ìîæíî ñäåëàòü âçÿâ ôàéë êîíôèãóðàöèè ñîçäàíèÿ ñåðòèôèêàòà è âûïîëíèòü ñëåäóþùóþ ïðîöåäóðó:
6. Çàìå÷àíèÿ
 ïðîöåññå ðåàëèçàöèè ìîäóëåé ïîääåðæêè OPC-UA áûë îáíàðóæåí ðÿä íåñîîòâåòñòâèé îôèöèàëüíîãî SDK ñî ñïåöèôèêàöèåé OPC-UA:
OPC-UA Part 6 íà ñòðàíèöå 27 ñîäåðæèò èçîáðàæåíèå ïðîöåññà ðóêîïîæàòèÿ äëÿ óñòàíîâëåíèÿ áåçîïàñíîãî êàíàëà. Ïàêåò ñîçäàíèÿ ñåññèè, èñõîäÿ èç ýòîãî ïðîöåññà, ïîäïèñûâàåòñÿ êëèåíòñêèì ñèììåòðè÷íûì êëþ÷¸ì, à êîäèðóåòñÿ ñåðâåðíûì. Íà ñàìîì äåëå è ïîäïèñü è øèôðîâàíèå îñóùåñòâëÿåòñÿ ñåðâåðíûì êëþ÷¸ì.
OPC-UA Part 4 íà ñòðàíèöå 141 ñîäåðæèò îïèñàíèå ñòðóêòóðû äàííûõ ïîäïèñè, ãäå ïåðâûìè èäóò äàííûå ïîäïèñè, à çàòåì ñòðîêà àëãîðèòìà. Íà ñàìîì äåëå ðåàëèçîâàí îáðàòíûé ïîðÿäîê.
7. Ïðèëîæåíèå: Òàáëèöà ñîâìåñòèìîñòè ñ ðåàëèçàöèÿìè OPC-UA äðóãèõ ïðîèçâîäèòåëåé
Action source page doesn't exist yet(/Home Page En / Doc / OPCUA ? )
Ññûëêè
Referring pages:
Doc
Function
Works/RoadMap