Ââåäåíèå
Äàííûé ðåëèç ÿâëÿåòñÿ ïëàíîâûì âûïóñêîì ðàáî÷åé âåðñèè ñèñòåìû OpenSCADA, êîòîðûå îáû÷íî îñóùåñòâëÿþòñÿ ñ ïåðèîäè÷íîñòüþ 3-4 ìåñÿöà. Îñíîâíîé öåëüþ äàííîãî ðåëèçà ÿâëÿåòñÿ ðåàëèçàöèÿ êîììåð÷åñêîãî ñåðâèñà íà îñíîâå OpenSCADA è àäàïòàöèè ê àïïàðàòíîé ïëàòôîðìå ARM. Êðîìå îñíîâíûõ çàäà÷ â ðàìêàõ äàííîãî ðåëèçà ïðîäåëàíà áîëüøàÿ ðàáîòà ïî ñòàáèëèçàöèè, ÷èñòêå èñõîäíîãî êîäà, à òàêæå âñåñòîðîííåìó ðàñøèðåíèþ âîçìîæíîñòåé.
Äàííûé äîêóìåíò ÿâëÿåòñÿ îáðàáîòêîé(êîìïèëÿöèåé) äîêóìåíòà <ChangeLog> ñèñòåìû OpenSCADA âåðñèè 0.7.1, êîòîðûé ïðèçâàí âêðàòöå è íàãëÿäíî îñâåòèòü íîâûå âîçìîæíîñòè ñèñòåìû OpenSCADA. Äåòàëüíî îçíàêîìèòüñÿ ñ èçìåíåíèÿìè â ñèñòåìå OpenSCADA ìîæíî â ôàéëå ChangeLog èç äèñòðèáóòèâà ñèñòåìû èëè çäåñü: http://wiki.oscada.org/Works/ChangeLog.
Êëþ÷åâûìè îñîáåííîñòÿìè äàííîé âåðñèè ÿâëÿþòñÿ:
- Ðåàëèçàöèÿ ïëàíîâûõ çàäà÷.
- Îïòèìèçàöèÿ, ïîâûøåíèå ñòàáèëüíîñòè, óñòîé÷èâîñòè è ïðîèçâîäèòåëüíîñòè ñèñòåìû.
- Óñîâåðøåíñòâîâàíèå è ñòàáèëèçàöèÿ ãðàôè÷åñêîé ïîäñèñòåìû.
- Ôîðìèðîâàíèå è ñòàáèëèçàöèÿ API ïîëüçîâàòåëüñêîãî ïðîãðàììèðîâàíèÿ.
- Îáùåñèñòåìíûå ðàñøèðåíèÿ.
Íîâûå è îáíîâëåííûå ìîäóëè:
- Archive.FSArch (1.4.5) - Çíà÷èòåëüíàÿ ñòàáèëèçàöèÿ.
- DB.MySQL (1.7.0) - Ñòàáèëèçàöèÿ. Äîáàâëåíà âîçìîæíîñòü óêàçàíèÿ òàéìàóòîâ ïîäêëþ÷åíèÿ.
- DB.SQLite (1.6.3) - Ñòàáèëèçàöèÿ.
- DB.FireBird (0.9.6) - Ñòàáèëèçàöèÿ.
- DB.PostgreSQL (0.9.1) - Ñòàáèëèçàöèÿ.
- DAQ.DiamondBoards (1.2.2) - Ñòàáèëèçàöèÿ.
- DAQ.System (1.7.3) - Ñòàáèëèçàöèÿ. Çàâèñèìîñòü îò áèáëèîòåêè "Libsensors" ñäåëàíà îïöèîíàëüíîé.
- DAQ.BlockCalc (1.4.1) - Ñòàáèëèçàöèÿ. Äîáàâëåíà ïîäñâåòêà ñèíòàêñèñà.
- DAQ.JavaLikeCalc (1.9.0) - Ñòàáèëèçàöèÿ. Äîáàâëåíà ïîäñâåòêà ñèíòàêñèñà. Âûïîëíåíà àäàïòàöèÿ ê àïïàðàòíîé àðõèòåêòóðå ARM. Äîáàâëåíà ðåàëèçàöèÿ ðåãóëÿðíûõ âûðàæåíèé è ðÿäà ðàñøèðåíèé API ïîëüçîâàòåëÿ. Äîáàâëåíà âîçìîæíîñòü çàïèñè ñèìâîëîâ ñòðîêè ñ ïîìîùüþ âîñüìåðè÷íîãî "\041" è øåñòíàäöàòåðè÷íîãî "\x21" ÷èñëà.
- DAQ.LogicLev (1.1.3) - Ñòàáèëèçàöèÿ. Íåêîòîðîå ðàñøèðåíèå.
- DAQ.SNMP (0.6.0) - Ñòàáèëèçàöèÿ. Ðåàëèçàöèÿ ïîëíîé ïîääåðæêè êëèåíòñêîé ÷àñòè ïðîòîêîëà. Äîáàâëåíà ïîääåðæêà âñåõ òèïîâ çíà÷åíèé. Äîáàâëåíà ïîääåðæêà çàïèñè çíà÷åíèé. Óëó÷øåíà îáðàáîòêà îøèáîê. Äîáàâëåíû äîïîëíèòåëüíûå ïàðàìåòðû êîíôèãóðàöèè ïîäêëþ÷åíèÿ.
- DAQ.Siemens (1.2.4) - Ñòàáèëèçàöèÿ.
- DAQ.ModBus (1.1.2) - Ñòàáèëèçàöèÿ. Äîáàâëåíà ïîäñâåòêà ñèíòàêñèñà ñïèñêà àòðèáóòîâ. Íåêîòîðûå óëó÷øåíèÿ.
- DAQ.DCON (0.5.0) - Ìîäóëü ïîëíîñòüþ ïåðåïèñàí íà ïðåäìåò ïîääåðæêè ñìåøàííûõ ìîäóëåé, ïîñðåäñòâîì âûáîðà êîìàíä çàïðîñà.
- DAQ.ICP_DAS (0.7.3) - Ñòàáèëèçàöèÿ.
- DAQ.DAQGate (0.9.2) - Ñòàáèëèçàöèÿ. Äîáàâëåí êåø ïàðàìåòðîâ äëÿ èõ èíèöèàëèçàöèè ïðè àâòîíîìíîé ðàáîòå.
- DAQ.SoundCard (0.6.2) - Ñòàáèëèçàöèÿ.
- DAQ.OPC_UA (0.6.1) - Ñòàáèëèçàöèÿ. Äîáàâëåíà ïîäñâåòêà ñèíòàêñèñà ñïèñêà àòðèáóòîâ.
- Protocol.ModBus (0.6.2) - Ñòàáèëèçàöèÿ. Íåêîòîðûå óëó÷øåíèÿ.
- Protocol.OPC_UA (0.6.1) - Ñòàáèëèçàöèÿ.
- Transport.Sockets (1.4.6) - Ñòàáèëèçàöèÿ.
- Transport.SSL (0.9.6) - Ñòàáèëèçàöèÿ.
- Transport.Serial (0.7.2) - Ñòàáèëèçàöèÿ. Ïðè èíèöèàëèçàöèè ïîðòà èñïîëüçîâàíû ïðåäûäóùèå íàñòðîéêè è ðåàëèçîâàíà âîçìîæíîñòü îïóñêàòü óêàçàíèå íåêîòîðûõ íàñòðîåê.
- Protocol.HTTP (1.5.1) - Ñòàáèëèçàöèÿ. Äîáàâëåíà ïîääåðæêà ïåðåìåííîé HTTP "Transfer-Encoding=chunked" â èñõîäÿùåì òðàíñïîðòå.
- Protocol.SelfSystem (0.9.4) - Ñòàáèëèçàöèÿ.
- Protocol.UserProtocol (0.6.1) - Äîáàâëåíà ïîäñâåòêà ñèíòàêñèñà.
- Special.SystemTests (1.5.1) - Íåáîëüøèå óëó÷øåíèÿ.
- UI.QTStarter (1.6.1) - Ñòàáèëèçàöèÿ. Àäàïòàöèÿ äëÿ ARM.
- UI.QTCfg (2.0.0) - Ñòàáèëèçàöèÿ. Èñïîëüçîâàí ãðóïïîâîé çàïðîñ ê èíòåðôåéñó óïðàâëåíèÿ ñ öåëüþ îïòèìèçàöèè óäàë¸ííîãî äîñòóïà ê OpenSCADA ñòàíöèÿì. Àäàïòàöèÿ äëÿ ARM. Äîáàâëåíà ôóíêöèÿ ðó÷íîãî èçìåíåíèÿ âûñîòû äëÿ ýëåìåíòîâ òåêñòà è òàáëèö (ñõâàòèë çà íèæíèé êðàé è ïîòàùèë). Äîáàâëåíà ìíîãîóðîâíåâàÿ ïîäñâåòêà ñèíòàêñèñà.
- UI.WebCfg (1.5.5) - Ñòàáèëèçàöèÿ.
- UI.WebCfgD (0.6.6) - Ñòàáèëèçàöèÿ.
- UI.VCAEngine (1.1.0) - Ñòàáèëèçàöèÿ. Äîáàâëåíà êîíòåêñòíàÿ ïîäñêàçêà ê àòðèáóòàì ïðèìèòèâîâ âèäæåòîâ. Äîáàâëåíà ïîäñâåòêà ñèíòàêñèñà ê òåêñòîâûì àòðèáóòàì ïðèìèòèâîâ âèäæåòà.
- UI.Vision (1.1.0) - Çíà÷èòåëüíàÿ ñòàáèëèçàöèÿ. Çàìåòíûå óëó÷øåíèÿ. Àäàïòàöèÿ äëÿ ARM. Äîáàâëåíî îòîáðàæåíèå è âîññòàíîâëåíèå ïîòåðè ñâÿçè ïðè óäàë¸ííîì èñïîëíåíèè ñåàíñà. Äîáàâëåí îòäåëüíûé ïîëíîòåêñòîâûé ðåäàêòîð äëÿ òåêñòîâûõ àòðèáóòîâ. Äîáàâëåíà êîíòåêñòíàÿ ïîäñêàçêà ê àòðèáóòàì ïðèìèòèâîâ âèäæåòîâ. Äîáàâëåíà ïîäñâåòêà ñèíòàêñèñà ê òåêñòîâûì àòðèáóòàì ïðèìèòèâîâ âèäæåòîâ. Äîáàâëåí äèàëîã óñòàíîâêè ñâîéñòâ îòäåëüíî âûáðàííûõ ôèãóð.
- UI.WebVision (0.9.1) - Çíà÷èòåëüíàÿ ñòàáèëèçàöèÿ. Íåáîëüøèå óëó÷øåíèÿ.
- UI.WebUser (0.6.1) - Ñòàáèëèçàöèÿ. Äîáàâëåíà ïîäñâåòêà ñèíòàêñèñà ïðîöåäóð.
1 Ðåàëèçàöèÿ ïëàíîâûõ çàäà÷
 ñîîòâåòñòâèè ñ ïëàíîì ðåëèçà áûëè âûïîëíåíû ñëåäóþùèå çàäà÷è:
- Ôîðìèðîâàíèå ïðåäîñòàâëåíèÿ êîììåð÷åñêèõ óñëóã íà îñíîâå OpenSCADA. - Âûñòðîåíà êîíöåïöèÿ è ñîçäàíû ìåõàíèçìû ïðåäîñòàâëåíèÿ êîììåð÷åñêèõ óñëóã ðàçðàáîò÷èêàìè íà îñíîâå OpenSCADA (http://oscada.org/ru/uslugi ).
- Àäàïòàöèÿ ñèñòåìû OpenSCADA äëÿ ðàáîòû íà àïïàðàòíîé ïëàòôîðìå ARM. - Îñóùåñòâëåíà ñáîðêà, àäàïòàöèÿ è ïîëíîìàñøòàáíîå òåñòèðîâàíèå OpenSCADA ê àðõèòåêòóðå ARM; íà èíòåðíåò ïëàíøåòå ôèðìû Nokia - N800 (http://wiki.oscada.org/Works/Tests/ARM ). À òàêæå ÷àñòíûå ìåðîïðèÿòèÿ ïî àäàïòàöèè:
- SYS: Ïðîòîòèïû ôóíêöèé TMess::put(), TMess::get(), TCntrNode::grpSize(), TCntrNode::grpId(), TCntrNode::grpAt() èçìåíåíû äëÿ èñïðàâëåíèÿ èñïîëüçîâàíèÿ áåççíàêîâîãî òèïà "char" íà ARM êàê çíàêîâîãî.
- SYS.TVariant, DAQ.AMRDevs, DAQ.OPC_UA: Èñïðàâëåí íåâûðàâíåííûé äîñòóï ê äàííûì.
- SYS.TCntrNode: Èñïðàâëåíî èñïîëüçîâàíèå áåççíàêîâîãî "char" â ARM êàê çíàêîâîãî.
- Archive: Ïðîòîòèïû ôóíêöèé TArchiveS::messPut() è TArchiveS::messGet() èçìåíåíû äëÿ èñïðàâëåíèÿ ïåðåìåííîé óðîâíÿ ñîîáùåíèÿ êàê çíàêîâîãî ÷èñëà.
- DAQ.JavaLikeCalc: Âèðòóàëüíàÿ ìàøèíà ïåðåïèñàíà äëÿ ïðÿìîãî èñïîëüçîâàíèÿ ñòðóêòóð êîìàíä, ñ öåëüþ èñêëþ÷åíèÿ ïðîáëåìû âûðàâíèâàíèÿ, à òàêæå äëÿ íåêîòîðîãî ïîâûøåíèÿ ïðîèçâîäèòåëüíîñòè.
- DAQ.Siemens: Èñïðàâëåíà ïðîáëåìà áèáëèîòåêè NoDave íà ïðåäìåò ãëîáàëüíîãî âûçîâà êîìàíäû óïàêîâêè ñòðóêòóð "#pragma pack(1)".
- UI.QTCfg: Äîáàâëåíî êðàòêîâðåìåííîå çàñûïàíèå ïîñëå çàêðûòèÿ âñåõ îêîí â ôóíêöèè îòêëþ÷åíèÿ. Ñ öåëüþ ïðåäîñòàâèòü âðåìÿ îêîí÷àòåëüíî ðàçðóøèòüñÿ îáúåêòàì âñåõ îêîí è ïðåäîòâðàòèòü ïàäåíèå.
2 Îïòèìèçàöèÿ, ïîâûøåíèå ñòàáèëüíîñòè, óñòîé÷èâîñòè è ïðîèçâîäèòåëüíîñòè ñèñòåìû
 ïðîöåññå ðàáîò íàä äàííîé âåðñèåé, à òàêæå å¸ ïðàêòè÷åñêîé àäàïòàöèè, áûëî îáíàðóæåíî è èñïðàâëåíî â îáùåé ñëîæíîñòè îêîëî 90 îøèáîê.  öåëîì áûëà ïðîäåëàíà ðàáîòà ïî ÷èñòêå êîäà îò ïðåäóïðåæäàþùèõ ñîîáùåíèé êîìïèëÿòîðà, ñ ôëàãîì "-Wall":
- óäàëåíèå íåèñïîëüçîâàííûõ ïåðåìåííûõ;
- äîáàâëåíèå âîçâðàòà âî âñåõ ôóíêöèÿõ;
- èíèöèàëèçàöèÿ ïåðåìåííûõ ñ âîçìîæíîñòüþ èõ èñïîëüçîâàíèÿ íåîïðåäåë¸ííûìè;
- èñêëþ÷åíèå íåïîëíîé îáðàáîòêè ïåðå÷èñëèìûõ òèïîâ â îïåðàöèè âûáîðà;
- ñðàâíåíèå çíàêîâîãî ñ áåççíàêîâûì öåëûì.
Ïåðå÷èñëèì íàèáîëåå ñóùåñòâåííûå îøèáêè, èñïðàâëåíèå êîòîðûõ çíà÷èòåëüíî îòðàçèëîñü íà ïîâûøåíèè ñòàáèëüíîñòè:
- Îáùåñèñòåìíûå:
- Êîìàíäà ñáîðî÷íîé ñèñòåìû "$ make dist" èñïðàâëåíà è àäàïòèðîâàíà äëÿ êîððåêòíîãî ñîçäàíèÿ äèñòðèáóòèâîâ OpenSCADA.
- Ôóíêöèÿ TSYS::cron(), äëÿ âûçîâà ïî ðàñïèñàíèþ, íåîäíîêðàòíî èñïðàâëåíà.
- Òèï ïåðåìåííîé äëÿ õðàíåíèÿ ðåçóëüòàòà ôóíêöèè find(), ñòðîêè, âåçäå èçìåí¸í íà êîððåêòíûé "size_t".
- Function: Èñêëþ÷åíà âîçìîæíîñòü óòå÷êè ïàìÿòè â ñëó÷àå ïîïûòêè óñòàíîâèòü îáúåêò â íåîáúåêòíûé ïàðàìåòð ôóíêöèè.
- Áàçû äàííûõ:
- DB.PostgreSQL: Èñïðàâëåíà îáðàáîòêà àäðåñà ÁÄ íà ïðåäìåò îïðåäåëåíèÿ ïóñòûõ ïîëåé.
- Òðàíñïîðòû è ïðîòîêîëû:
- Transport: Èñïðàâëåíà çàãðóçêà âñåõ òðàíñïîðòîâ èç ÁÄ, â ñëó÷àå íàëè÷èÿ çàïèñåé ïðî òðàíñïîðò, ìîäóëü êîòîðîãî îòñóòñòâóåò.
- Transport.Serial: Óñòàíîâëåí ôëàã O_NONBLOCK äëÿ ôóíêöèè open() ïîñëåäîâàòåëüíîãî óñòðîéñòâà ñ öåëüþ ïðåäîòâðàùåíèÿ áëîêèðîâàíèÿ îòêðûòèÿ ïîðòà íà íåêîòîðûõ USB->RS485 ïðåîáðàçîâàòåëÿõ.
- Transport.Sockets, Transport.SSL: Äîáàâëåíà î÷èñòêà âõîäíîãî áóôåðà äëÿ ïðåäîòâðàùåíèÿ ïîâòîðíîãî èñïîëüçîâàíèÿ íà âûñîêîëàòåíòíûõ êàíàëàõ, ïîñëå òàéìàóòà.
- Transport.Sockets: Èñïðàâëåíî çàêðûòèå êëèåíòñêîãî ñîåäèíåíèÿ ïî òàéìàóòó âðåìåíè æèçíè, äëÿ ïîäêëþ÷åíèé ïðè îòñóòñòâèè äàííûõ.
- Transport.Sockets: Unix-ñîêåò óñòàíîâëåí â íåáëîêèðóþùèé ðåæèì ïîñðåäñòâîì ôëàãà O_NONBLOCK. Èñïðàâëåíî ôîðìèðîâàíèå ñîîáùåíèé îá îøèáêàõ äëÿ èñõîäÿùèõ òðàíñïîðòîâ.
- Protocol.HTTP, UI.WebCfg, UI.WebCfgD, UI.WebVision, UI.WebUser: Èñïðàâëåí ðàçáîð ýëåìåíòîâ POST-çàïðîñà íà ïðåäìåò ðàçáîðà âñåõ àòðèáóòîâ êàæäîãî ýëåìåíòà.
- Ñáîð äàííûõ è àðõèâû:
- Archive: Èñïðàâëåíî èñïîëüçîâàíèå áóôåðà ìÿãêîé ñåòêè ñ íèçêèì è âûñîêèì ðàçðåøåíèåì âðåìåíè â àðõèâàõ çíà÷åíèé.
- Archive.FSArch: Èñïðàâëåíî ñîçäàíèå ôàéëîâ àðõèâà ñîîáùåíèé ïðè ïîìåùåíèè ìíîæåñòâà ñòàðûõ ñîîáùåíèé. Äîáàâëåí ïàðàìåòð ïðåäîòâðàùåíèÿ äóáëèêàòîâ.
- Archive.FSArch: Ðåçóëüòàò ôóíêöèè fgetc() çàïèñàí â öåëî÷èñëåííóþ ïåðåìåííóþ, âìåñòî ñèìâîëüíîé, ÷òî èñïðàâèëî îáíàðóæåíèå "EOF".
- DAQ.System: Èñïðàâëåíî ïàäåíèå ïðè âûõîäå äëÿ èñòî÷íèêà "Hddtemp".
- DAQ.ModBus: Ðåæèì óñòàíîâêè çíà÷åíèé àòðèáóòîâ ïàðàìåòðîâ èçìåí¸í íà àêòèâíûé è óëó÷øåíà îáðàáîòêà îøèáîê.
- DAQ.JavaLikeCalc: Äîáàâëåíà ïðîâåðêà èíäåêñà ïðè äîñòóïå ê ñèìâîëó ñòðîêè ïî èíäåêñó, ñ öåëüþ ïðåäîòâðàùåíèÿ âûõîäà çà äèàïàçîí.
- Èíòåðôåéñû âèçóàëèçàöèè:
- UI.VCAEngine: Èñïðàâëåíî áëîêèðîâàíèå ñåàíñà äëÿ äèíàìè÷åñêè àêòèâíûõ ïðîåêòîâ ïðè äèíàìè÷åñêîì äîñòóïå ê ñîáñòâåííûì àòðèáóòàì âèäæåòà.
- UI.Vision: Èñïðàâëåíî ïàäåíèå ñåàíñà äëÿ ïðîåêòîâ ñ ïåðèîäîì èñïîëíåíèÿ áîëåå 500 ìñ.
- UI.Vision: Ðåàëèçîâàíà äîâîäêà êîîðäèíàò ôèãóð ïðèìèòèâà "Ýëåìåíòàðíàÿ ôèãóðà" ê îñòàòêó ïîëîæåíèÿ âèäæåòà.
- UI.Vision: Ìàñøòàáèðîâàíèå òåêñòà ïðèìèòèâà "Òåêñò" èçìåíåíî íà èçìåíåíèå ðàçìåðà øðèôòà âìåñòî ìàñøòàáèðîâàíèÿ êîíå÷íîãî èçîáðàæåíèÿ, ÷òî ïîâûñèëî îáùåå êà÷åñòâî îòîáðàæåíèÿ øðèôòà.
- UI.Vision, UI.WebVision: Ïîâûøåíî ðàçðåøåíèå êîîðäèíàò âñåõ âèäæåòîâ äî òð¸õ çíàêîâ ïîñëå çàïÿòîé, ñ öåëüþ îáåñïå÷åíèÿ íîðìàëüíîãî ïîçèöèîíèðîâàíèÿ íà áîëüøèõ ìàñøòàáàõ.
- UI.WebVision, UI.Vision: Èñïðàâëåíî îáíîâëåíèå èçîáðàæåíèÿ ïðèìèòèâà "Ýëåìåíòàðíàÿ ôèãóðà" ïðè èçìåíåíèè ìàñøòàáà.
- UI.WebVision: Óäàëåíà ïðîâåðêà ïîïàäàíèÿ òî÷åê ôèãóð â îáëàñòü îòîáðàæåíèÿ ïðèìèòèâà "Ýëåìåíòàðíàÿ ôèãóðà". Äàííàÿ ôóíêöèÿ ïåðåëîæåíà íà áèáëèîòåêó GD.
- UI.WebVision: Èñêëþ÷åíà âîçìîæíîñòü ïàäåíèÿ äëÿ ïðèìèòèâîâ "Diagram" èëè "ElFigure", â ñëó÷àå ïåðåäà÷è íåêîððåêòíûõ çíà÷åíèé àòðèáóòîâ èçîáðàæåíèÿ "xSc" èëè "ySc" èç Web-áðàóçåðà.
Îïòèìèçàöèÿ è ïîâûøåíèå ïðîèçâîäèòåëüíîñòè:
- UI.WebCfgD: Äîáàâëåíî èçìåíåíèå ðàçìåðà èêîíîê íà ñòîðîíå ñåðâåðà ñ öåëüþ ñíèæåíèÿ òðàôèêà.
- UI.QTCfg: Èñïîëüçîâàí ãðóïïîâîé çàïðîñ ê èíòåðôåéñó óïðàâëåíèÿ äëÿ ïîâûøåíèÿ ïðîèçâîäèòåëüíîñòè íà ìåäëåííûõ è âûñîêîëàòåíòíûõ ñîåäèíåíèÿõ.
- UI.QTCfg: Èñêëþ÷¸í ìíîãîêðàòíûé çàïðîñ ýëåìåíòîâ âûáîðíûõ êîëîíîê òàáëèö.
3 Óñîâåðøåíñòâîâàíèå è ñòàáèëèçàöèÿ ãðàôè÷åñêîé ïîäñèñòåìû
Çàìåòíàÿ ðàáîòà áûëà âûïîëíåíà â ðàìêàõ ãðàôè÷åñêîé ïîäñèñòåìû, à èìåííî â ìîäóëÿõ äâèæêà ÑÂÓ UI.VCAEngine, âèçóàëèçàòîðîâ UI.Vision è UI.WebVision, à òàêæå êîíôèãóðàòîðàõ. Âíåñ¸ííûå èçìåíåíèÿ áûëè íàïðàâëåííû íà ñòàáèëèçàöèþ, îïòèìèçàöèþ ïîòðåáëåíèÿ ïàìÿòè è óëó÷øåíèå ïîëüçîâàòåëüñêèõ ñâîéñòâ.
Óëó÷øåíèÿ ãðàôè÷åñêîé ïîäñèñòåìû:
- SYS, DAQ.JavaLikeCalc, UI.QTCfg, UI.VCAEngine, UI.Vision: Äîáàâëåíî API ïîäñâåòêè ñèíòàêñèñà. Íà îñíîâå äàííîãî API ïîäñâåòêà ñèíòàêñèñà äîáàâëåíà:
- DAQ.BlockCalc: ïîäñâåòêà ñèíòàêñèñà â îïèñàíèè àòðèáóòîâ ïàðàìåòðîâ.
- DAQ.JavaLikeCalc: ïîäñâåòêà ñèíòàêñèñà ê êîìïèëÿòîðó ÿçûêà JavaLikeCalc.JavaScript, à òàêæå êî âñåì òåêñòîâûì ïîëÿì, èñïîëüçóþùèì ýòîò ÿçûê âíóòðè ìîäóëÿ.
- DAQ.ModBus, DAQ.OPC_UA: ïîäñâåòêà ñèíòàêñèñà ñïèñêà àòðèáóòîâ.
- Protocol.UserProtocol: ïîäñâåòêà ñèíòàêñèñà ê òåêñòàì ïðîöåäóð ïðîòîêîëà.
- UI.QTCfg: îòîáðàæåíèå ìíîãîóðîâíåâîé ïîäñâåòêè ñèíòàêñèñà, ïåðåäàâàåìîé èç ìîäåëè äàííûõ â âèäå ïðàâèë ðåãóëÿðíûõ âûðàæåíèé.
- UI.VCAEngine: ïîäñâåòêà ñèíòàêñèñà ê òåêñòîâûì àòðèáóòàì ïðèìèòèâîâ âèäæåòà, äëÿ êîòîðûõ ýòî íóæíî.
- UI.Vision: ïîäñâåòêà ñèíòàêñèñà ê òåêñòîâûì àòðèáóòàì ïðèìèòèâîâ âèäæåòà, à òàêæå òåêñòàì ïðîãðàìì âèäæåòîâ.
- UI.WebUser: ïîäñâåòêà ñèíòàêñèñà ïðîöåäóð ôîðìèðîâàíèÿ Web-èíòåðôåéñà.
- UI.QTCfg:
- Äîáàâëåíà âîçìîæíîñòü ðó÷íîãî èçìåíåíèÿ âûñîòû òåêñòîâûõ è òàáëè÷íûõ ïîëåé. Èçìåíåíèå îñóùåñòâëÿåòñÿ ñõâàòûâàíèåì è ïåðåòàñêèâàíèåì íèæíåãî êðàÿ ïîëÿ.
- Ãðóïïîâîé çàïðîñ "CntrReqs" èñïîëüçîâàí äëÿ çàïðîñà êîíòåêñòà ñòðàíèöû.
- UI.VCAEngine: Äîáàâëåíû ñïåöèôè÷åñêèå ñâîéñòâà ê àòðèáóòàì ïðèìèòèâîâ, âðîäå ïîìîùè è ïîäñâåòêè ñèíòàêñèñà.
- UI.Vision:
- Äîáàâëåíî îòîáðàæåíèå ïîìîùè ïî àòðèáóòàì âèäæåòà.
- Äîáàâëåíà èíäèêàöèÿ ñîîáùåíèÿ î ïîòåðè ñîåäèíåíèÿ ñ ñåðâåðîì âèçóàëèçàöèè, à òàêæå âîññòàíîâëåíèå ïðè óäàë¸ííîé âèçóàëèçàöèè.
- Äëÿ ïðèìèòèâà "Ýëåìåíòàðíàÿ ôèãóðà" äîáàâëåí äèàëîã óñòàíîâêè ñâîéñòâ îòäåëüíî âûáðàííûõ ôèãóð.
- Äîáàâëåí îòäåëüíûé ïîëíîòåêñòîâûé ðåäàêòîð äëÿ òåêñòîâûõ àòðèáóòîâ.
- UI:WebVision: Äîáàâëåíà ïîääåðæêà gif è jpg èçîáðàæåíèé â ýëåìåíòàõ ïðèìèòèâà "Ýëåìåíòàðíàÿ ôèãóðà".
4 Ôîðìèðîâàíèå è ñòàáèëèçàöèÿ API ïîëüçîâàòåëüñêîãî ïðîãðàììèðîâàíèÿ
Áûëî ïðîäîëæåíî ôîðìèðîâàíèå îáúåêòíîãî API ïîëüçîâàòåëüñêîãî ïðîãðàììèðîâàíèÿ, êîòîðîå ïðåäóñìàòðèâàåò èíòåãðàöèþ ïîëüçîâàòåëüñêèõ ôóíêöèé â äåðåâî îáúåêòîâ ñèñòåìû OpenSCADA. Êðîìå ýòîãî, áûë âíåñåí ðÿä èçìåíåíèé â ñóùåñòâóþùèå áèáëèîòåêè ôóíêöèé ïîëüçîâàòåëüñêîãî API.
 ÷àñòíîñòè áûëè îñóùåñòâëåíû ñëåäóþùèå èçìåíåíèÿ:
- SYS: Ïîëüçîâàòåëüñêîå API äëÿ îáúåêòà TArrayObj ðàñøèðåíî íà ïðåäìåò âîçìîæíîñòè èñïîëüçîâàíèÿ îáúåêòíûõ ñâîéñòâ, åñëè ñâîéñòâà íå ÷èñëà.
- SYS: Â äåðåâî îáúåêòîâ OpenSCADA ïîëüçîâàòåëüñêîãî API äîáàâëåíà ôóíêöèÿ SYS.Security.access() äëÿ êîíòðîëÿ äîñòóïà ïîëüçîâàòåëÿ OpenSCADA ê ðåñóðñàì ñ íóæíûìè ïðàâàìè.
- SYS, DAQ.JavaLikeCalc: Äîáàâëåíà ðåàëèçàöèÿ ïîääåðæêè ïîëüçîâàòåëüñêîãî API ðåãóëÿðíûõ âûðàæåíèé, îñíîâàííîé íà PCRE, ïîñðåäñòâîì îáúåêòà TRegExp. Ðåàëèçîâàí èíòåðôåéñ ôóíêöèé RegExp.exec() è RegExp.test() â ñòàíäàðòå äëÿ ÿçûêà JavaScript. Äëÿ DAQ.JavaLikeCalc ðåàëèçîâàíà "new RegExp()" èíèöèàëèçàöèÿ äëÿ îáúåêòà TRegExp. Äëÿ DAQ.JavaLikeCalc ðåàëèçîâàíû äîïîëíèòåëüíûå ôóíêöèè ñ èñïîëüçîâàíèåì RegExp: int search(); Array match(); Array split(RegExp pat, int limit); string replace(string substr, string str); string replace(RegExp pat, string str).
- TFunction, DAQ.JavaLikeCalc: Äîáàâëåí îáúåêò ïîëüçîâàòåëüñêîãî API "TFuncArgObj" äëÿ ïîëó÷åíèÿ àðãóìåíòîâ ôóíêöèè.
- DB: Äîáàâëåíû ôóíêöèè ïîëüçîâàòåëüñêîãî API fieldStruct(), fieldSeek(), fieldGet(), fieldSet() è fieldDel() äëÿ îáúåêòà òàáëèöû, ñ öåëüþ ïðåäîñòàâèòü ïîëüçîâàòåëüñêèé äîñòóï ê ÁÄ ïîñðåäñòâîì èíòåðôåéñà ÁÄ OpenSCADA.
- DAQ.JavaLikeCalc: Äîáàâëåíà âñòðîåííàÿ ôóíêöèÿ typeof() äëÿ ïðîâåðêè òèïà çíà÷åíèÿ.
5 Îáùåñèñòåìíûå ðàñøèðåíèÿ
 îáùåñèñòåìíîå API ñèñòåìû OpenSCADA áûëè âíåñåíû çíà÷èòåëüíûå èçìåíåíèÿ è ðàñøèðåíèÿ ñ öåëüþ îáùåé ñòàáèëèçàöèè è ââèäó îáùèõ ìåðîïðèÿòèé ïî ÷èñòêå êîäà, à òàêæå ðåîðãàíèçàöèè äåðåâà èñõîäíûõ òåêñòîâ:
- SYS:
- Ðåàëèçîâàíà íîâàÿ ñòðóêòóðà äåðåâà èñõîäíûõ òåêñòîâ.
- Âñå ðåñóðñû ïðîåêòà ïåðåìåùåíû â îòäåëüíûé àðõèâ.
- Äëÿ ñîçäàíèÿ àðõèâîâ èñõîäíûõ òåêñòîâ è ðåñóðñîâ ìîæíî èñïîëüçîâàòü êîìàíäû "$ make dist-lzma" è "$ make dist-reslzma".
- Äîêóìåíòàöèÿ âûïîëíåíà ñòàòè÷íîé äëÿ ìîäóëåé è ïîäåëåíà ïî ÿçûêàì. Äëÿ êàæäîãî ÿçûêà äîêóìåíòàöèè ôîðìèðóåòñÿ îòäåëüíûé ïàêåò.  äîêóìåíòàöèè êàæäîãî ÿçûêà ñîçäàí èíäåêñíûé ôàéë ïî âñåìó ïåðå÷íþ ëîêàëüíîé è ñåòåâîé äîêóìåíòàöèè. Îáùèé ïåðå÷åíü ëîêàëüíîé äîêóìåíòàöèè çíà÷èòåëüíî ðàñøèðåí íîâûìè äîêóìåíòàìè, à òàêæå âñïîìîãàòåëüíîé ñåòåâîé äîêóìåíòàöèåé.
- Äîáàâëåíû ïàêåòû áèáëèîòå÷íûõ ÁÄ *-LibDB.Main è *-LibDB.VCA, ïîìåùåíû â data/LibsDB.
- Âìåñòî DemoDB ïàêåòà äîáàâëåíû ïàêåòû ìîäåëåé "AGLKS" è "Boiler", ïîìåùåíû â data/ModelsDB.
- Êîíôèãóðàöèîííûå ôàéëû äëÿ ïîñòðîåíèÿ RPM è DEB ïàêåòîâ îáíîâëåíû.
- Çàâèñèìîñòü íà áèáëèîòåêó PCRECPP ãëîáàëüíî çàìåíåíà íà PCRE.
- Äîáàâëåíà íîâàÿ ôóíêöèÿ TSYS::time2str() äëÿ ïðåîáðàçîâàíèÿ èíòåðâàëîâ âðåìåíè â ñòðîêó âðîäå "1÷àñ 23ìèí 10ñåê". Ýòà ôóíêöèÿ èñïîëüçîâàíà âåçäå.
- Äîáàâëåíà ðåàëèçàöèÿ ñîáñòâåííîãî XML-ïàðñåðà, âìåñòî Expat. Ñîáñòâåííûé XML-ïàðñåð ðåøàåò ïðîáëåìó ïîääåðæêè ðàçëè÷íûõ êîäèðîâîê, îòëè÷íûõ îò UTF, à òàêæå áåçîïàñíîé îáðàáîòêè ñèòóàöèè íàëè÷èÿ íåäîïóñòèìûõ äëÿ òåêóùåé êîäèðîâêè ñèìâîëîâ.
- SYS.TMess: Îáùèå ñîîáùåíèÿ èíòåðôåéñà óïðàâëåíèÿ ïåðåìåùåíû â îäíó ôóíêöèþ TMess::lab*.
- Transport, Transport.*: Äîáàâëåíà ôóíêöèÿ TTransportS::traf2str() äëÿ ïðåîáðàçîâàíèÿ çíà÷åíèÿ ñ÷¸ò÷èêà òðàôèêà â ñòðîêó âðîäå "12.5ÊèÁ"
Çàêëþ÷åíèå
Ñèñòåìà OpenSCADA ïîëó÷èëà òîë÷îê äëÿ îñóùåñòâëåíèÿ ðåàëüíîé àïïàðàòíîé ìíîãîïëàòôîðìåííîñòè, ïîñðåäñòâîì ÷åãî êîä ïðîåêòà áûë â çíà÷èòåëüíîé ñòåïåíè âû÷èùåí è ñäåëàí ìíîãîïëàòôîðìåííûì. Ýòè íàðàáîòêè ïîçâîëÿò ïðîäîëæèòü äâèæåíèå ïðîåêòà â ñòîðîíó àïïàðàòíîé ìíîãîïëàòôîðìåííîñòè, à òàêæå ðåàëèçàöèè ïðîãðàììíîé, ÷òî çàïëàíèðîâàíî ïîñëå ñëåäóþùåãî LTS ðåëèçà 0.8.0.
Òàêæå ïðîäîëæåíà ðàáîòà ïî óëó÷øåíèþ îáùåé ôóíêöèîíàëüíîñòè, ïðîñòîòû è óäîáñòâó èñïîëüçîâàíèÿ ñ îáùèì ïîâûøåíèåì êà÷åñòâà ïðåäîñòàâëåíèÿ óñëóã íà îñíîâå ñèñòåìû OpenSCADA.
Ññûëêè