Ôîðìèðîâàíèå...
Ââåäåíèå
Äàííûé ðåëèç ÿâëÿåòñÿ ïëàíîâûì âûïóñêîì ðàáî÷åé âåðñèè ñèñòåìû 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.
- Àäàïòàöèÿ ñèñòåìû OpenSCADA äëÿ ðàáîòû íà àïïàðàòíîé ïëàòôîðìå ARM. - Îñóùåñòâëåíà ñáîðêà, àäàïòàöèÿ è ïîëíîìàñøòàáíîå òåñòèðîâàíèå OpenSCADA íà èíòåðíåò ïëàíøåòå ôèðìû Nokia - N800 (http://wiki.oscada.org/Works/Tests/ARM ). À òàêæå ÷àñòíûå ìåðîïðèÿòèÿ ïî àäàïòàöèè:
- DAQ.JavaLikeCalc: Âèðòóàëüíàÿ ìàøèíà ïåðåïèñàíà äëÿ ïðÿìîãî èñïîëüçîâàíèÿ ñòðóêòóð êîìàíä, ñ öåëüþ èñêëþ÷åíèÿ ïðîáëåìû âûðàâíèâàíèÿ.
- DAQ.Siemens: Èñïðàâëåíà ïðîáëåìà áèáëèîòåêè NoDave íà ïðåäìåò ãëîáàëüíîãî âûçîâà êîìàíäû óïàêîâêè ñòðóêòóð "#pragma pack(1)".
- SYS.TVariant, DAQ.AMRDevs, DAQ.OPC_UA: Èñïðàâëåí íåâûðàâíåííûé äîñòóï ê äàííûì.
- SYS.TCntrNode: Èñïðàâëåíî èñïîëüçîâàíèå áåççíàêîâîãî "char" â ARM êàê çíàêîâîãî.
- SYS: Ïðîòîòèïû ôóíêöèé TMess::put(), TMess::get(), TCntrNode::grpSize(), TCntrNode::grpId(), TCntrNode::grpAt() èçìåíåíû äëÿ èñïðàâëåíèÿ èñïîëüçîâàíèÿ áåççíàêîâîãî òèïà "char" íà ARM êàê çíàêîâîãî.
- Archive: Ïðîòîòèïû ôóíêöèé TArchiveS::messPut() è TArchiveS::messGet() èçìåíåíû äëÿ èñïðàâëåíèÿ ïåðåìåííîé óðîâíÿ ñîîáùåíèÿ êàê çíàêîâîãî ÷èñëà.
- UI.QTCfg: Äîáàâëåíî êðàòêîâðåìåííîå çàñûïàíèå, ïîñëå çàêðûòèÿ âñåõ îêîí, â ôóíêöèè îòêëþ÷åíèÿ. Ñ öåëüþ äàòü âðåìÿ îêîí÷àòåëüíî ðàçðóøèòüñÿ îáúåêòàì âñåõ îêîí è ïðåäîòâðàòèòü ïàäåíèå.
2 Îïòèìèçàöèÿ, ïîâûøåíèå ñòàáèëüíîñòè, óñòîé÷èâîñòè è ïðîèçâîäèòåëüíîñòè ñèñòåìû
 ïðîöåññå ðàáîò íàä äàííîé âåðñèåé, à òàêæå å¸ ïðàêòè÷åñêîé àäàïòàöèè, áûëî îáíàðóæåíî è èñïðàâëåíî â îáùåé ñëîæíîñòè îêîëî 90 îøèáîê.  öåëîì áûëà ïðîäåëàíà ðàáîòà ïî ÷èñòêå êîäà îò ïðåäóïðåæäàþùèõ ñîîáùåíèé êîìïèëÿòîðà ñ ôëàãîì "-Wall": óäàëåíèå íåèñïîëüçîâàííûõ ïåðåìåííûõ, äîáàâëåíèå âîçâðàòà âî âñåõ ôóíêöèÿõ, èíèöèàëèçàöèÿ ïåðåìåííûõ ñ âîçìîæíîñòüþ å¸ èñïîëüçîâàíèÿ íåîïðåäåë¸ííîé, èñêëþ÷åíèå íåïîëíîé îáðàáîòêè ïåðå÷èñëèìûõ òèïîâ â îïåðàöèè âûáîðà, ñðàâíåíèå çíàêîâîãî ñ áåççíàêîâûì öåëûì.
Ïåðå÷èñëèì íàèáîëåå ñóùåñòâåííûå îøèáêè, èñïðàâëåíèå êîòîðûõ çíà÷èòåëüíî îòðàçèëîñü íà ïîâûøåíèè ñòàáèëüíîñòè:
- Îáùåñèñòåìíûå:
- Êîìàíäà ñáîðî÷íîé ñèñòåìû "$ make dist" èñïðàâëåíà è àäàïòèðîâàíà äëÿ êîððåêòíîãî ñîçäàíèÿ äèñòðèáóòèâîâ OpenSCADA.
- Ôóíêöèÿ TSYS::cron(), äëÿ âûçîâà ïî ãðàôèêó, íåîäíîêðàòíî èñïðàâëåíà.
- Òèï ïåðåìåííîé äëÿ õðàíåíèÿ ðåçóëüòàòà ôóíêöèè find() ñòðîêè âåçäå èçìåí¸í íà êîððåêòíûé "size_t".
- Function: Èñêëþ÷åíà âîçìîæíîñòü óòå÷êè ïàìÿòè â ñëó÷àå ïîïûòêè óñòàíîâèòü îáúåêò â íåîáúåêòíûé ïàðàìåòð ôóíêöèè.
- Áàçû äàííûõ:
- DB.PostgreSQL: Èñïðàâëåíà îáðàáîòêà àäðåñà ÁÄ íà ïðåäìåò îïðåäåëåíèÿ ïóñòûõ ïîëåé.
- Òðàíñïîðòû è ïðîòîêîëû:
- Transport.Sockets, Transport.SSL: Äîáàâëåíà î÷èñòêà âõîäíîãî áóôåðà äëÿ ïðåäîòâðàùåíèÿ ïîâòîðíîãî èñïîëüçîâàíèÿ íà âûñîêîëàòåíòíûõ êàíàëàõ, ïîñëå òàéìàóòà.
- Transport.Sockets: Èñïðàâëåíî çàêðûòèå êëèåíòñêîãî ñîåäèíåíèÿ ïî òàéìàóòó âðåìåíè æèçíè äëÿ ïîäêëþ÷åíèé íî îòñóòñòâèÿ äàííûõ.
- Transport.Sockets: Unix-ñîêåò óñòàíîâëåí â íåáëîêèðóþùèé ðåæèì ïîñðåäñòâîì ôëàãà O_NONBLOCK. Èñïðàâëåíî ôîðìèðîâàíèå ñîîáùåíèé îá îøèáêàõ äëÿ èñõîäÿùèõ òðàíñïîðòîâ.
- Transport: Èñïðàâëåíà çàãðóçêà âñåõ òðàíñïîðòîâ èç ÁÄ, â ñëó÷àå íàëè÷èÿ çàïèñåé ïðî òðàíñïîðò, ìîäóëü êîòîðîãî îòñóòñòâóåò.
- Transport.Serial: Óñòàíîâëåí ôëàã O_NONBLOCK äëÿ ôóíêöèè open() ïîñëåäîâàòåëüíîãî óñòðîéñòâà ñ öåëüþ ïðåäîòâðàùåíèÿ çàâèñàíèÿ íà íåêîòîðûõ USB->RS485 ïðåîáðàçîâàòåëÿõ.
- Protocol.HTTP, UI.WebCfg, UI.WebCfgD, UI.WebVision, UI.WebUser: Èñïðàâëåí ðàçáîð ýëåìåíòîâ POST çàïðîñà íà ïðåäìåò ðàçáîðà âñåõ àòðèáóòîâ êàæäîãî ýëåìåíòà.
- Ñáîð äàííûõ è àðõèâû:
- Archive.FSArch: Èñïðàâëåíî ñîçäàíèå ôàéëîâ àðõèâà ñîîáùåíèé ïðè ïîìåùåíèè ìíîæåñòâà ñòàðûõ ñîîáùåíèé. Äîáàâëåí ïàðàìåòð ïðåäîòâðàùåíèÿ äóáëèêàòîâ.
- Archive.FSArch: Ðåçóëüòàò ôóíêöèè fgetc() çàïèñàí â öåëî÷èñëåííóþ ïåðåìåííóþ âìåñòî ñèìâîëüíîé, ÷òî èñïðàâèëî îáíàðóæåíèå "EOF".
- Archive: Èñïðàâëåíî èñïîëüçîâàíèå áóôåðà ìÿãêîé ñåòêè ñ íèçêèì è âûñîêèì ðàçðåøåíèåì âðåìåíè â àðõèâàõ çíà÷åíèé.
- DAQ.System: Èñïðàâëåíî ïàäåíèå ïðè âûõîäå äëÿ èñòî÷íèêà "Hddtemp".
- DAQ.ModBus: Ðåæèì óñòàíîâêè çíà÷åíèé àòðèáóòîâ ïàðàìåòðîâ èçìåí¸í íà àêòèâíûé è óëó÷øåíà îáðàáîòêà îøèáîê.
- DAQ.JavaLikeCalc: Äîáàâëåíà ïðîâåðêà èíäåêñà ïðè äîñòóïå ê ñèìâîëó ñòðîêè ïî èíäåêñó, ñ öåëüþ ïðåäîòâðàùåíèÿ âûõîäà çà äèàïàçîí.
- Èíòåðôåéñû âèçóàëèçàöèè:
- UI.VCAEngine: Èñïðàâëåíî áëîêèðîâàíèå ñåàíñà äëÿ äèíàìè÷åñêè àêòèâíûõ ïðîåêòîâ, ïðè äèíàìè÷åñêîì äîñòóïå ê ñîáñòâåííûì àòðèáóòàì.
- UI.Vision: Èñïðàâëåíî ïàäåíèå ñåàíñà äëÿ ïðîåêòîâ ñ ïåðèîäîì èñïîëíåíèÿ áîëåå 500 ìñ.
- UI.WebVision, UI.Vision: Èñïðàâëåíî îáíîâëåíèå èçîáðàæåíèÿ ïðèìèòèâà "Ýëåìåíòàðíàÿ ôèãóðà" ïðè èçìåíåíèè ìàñøòàáà.
- UI.WebVision: Óäàëåíà ïðîâåðêà ïîïàäàíèÿ òî÷åê ôèãóð â îáëàñòü îòîáðàæåíèÿ ïðèìèòèâà "Ýëåìåíòàðíàÿ ôèãóðà". Ôóíêöèÿ ïåðåëîæåíà íà áèáëèîòåêó GD.
- UI.WebVision: Èñêëþ÷åíà âîçìîæíîñòü ïàäåíèÿ, äëÿ ïðèìèòèâîâ "Diagram" or "ElFigure", â ñëó÷àå ïåðåäà÷è íåêîððåêòíûõ çíà÷åíèé àòðèáóòîâ èçîáðàæåíèÿ "xSc" or "ySc" èç Web-áðàóçåðà.
- UI.QTCfg: Èñïðàâëåí ìíîãîêðàòíûé çàïðîñ ýëåìåíòîâ âûáîðíûõ êîëîíîê òàáëèö.
Îïòèìèçàöèÿ è ïîâûøåíèå ïðîèçâîäèòåëüíîñòè:
- UI.WebCfgD: Äîáàâëåíî èçìåíåíèå ðàçìåðà èêîíîê íà ñòîðîíå ñåðâåðà, ñ öåëüþ ñíèæåíèÿ òðàôèêà.
- UI.QTCfg: Èñïîëüçîâàí ãðóïïîâîé çàïðîñ ê èíòåðôåéñó óïðàâëåíèÿ äëÿ ïîâûøåíèÿ ïðîèçâîäèòåëüíîñòè íà ìåäëåííûõ è âûñîêîëàòåíòíûõ ñîåäèíåíèÿõ.
3 Óñîâåðøåíñòâîâàíèå è ñòàáèëèçàöèÿ ãðàôè÷åñêîé ïîäñèñòåìû
Çàìåòíàÿ ðàáîòà áûëà âûïîëíåíà â ðàìêàõ ãðàôè÷åñêîé ïîäñèñòåìû, à èìåííî â ìîäóëÿõ äâèæêà ÑÂÓ UI.VCAEngine, âèçóàëèçàòîðîâ UI.Vision è UI.WebVision, à òàêæå êîíôèãóðàòîðàõ. Âíåñ¸ííûå èçìåíåíèÿ áûëè íàïðàâëåííû íà ñòàáèëèçàöèþ, îïòèìèçàöèþ ïîòðåáëåíèÿ ïàìÿòè è óëó÷øåíèå ïîëüçîâàòåëüñêèõ ñâîéñòâ.
Óëó÷øåíèÿ ãðàôè÷åñêîé ïîäñèñòåìû:
- UI:WebVision: Äîáàâëåíà ïîääåðæêà gif è jpg èçîáðàæåíèé â ýëåìåíòàõ ïðèìèòèâà "Ýëåìåíòàðíàÿ ôèãóðà".
- UI.QTCfg:
- Äîáàâëåíà âîçìîæíîñòü ðó÷íîãî èçìåíåíèÿ âûñîòû òåêñòîâûõ è òàáëè÷íûõ ïîëåé. Èçìåíåíèå îñóùåñòâëÿåòñÿ ñõâàòûâàíèåì è ïåðåòàñêèâàíèåì íèæíåãî êðàÿ ïîëÿ.
- Ãðóïïîâîé çàïðîñ "CntrReqs" èñïîëüçîâàíî äëÿ çàïðîñà êîíòåêñòà ñòðàíèöû.
- SYS, DAQ.JavaLikeCalc, UI.QTCfg, UI.VCAEngine, UI.Vision: Äîáàâëåíî API ïîäñâåòêè ñèíòàêñèñà. Íà îñíîâå äàííîãî API ïîäñâåòêà ñèíòàêñèñà äîáàâëåíà â:
- UI.Vision: Äîáàâëåíà ïîäñâåòêà ñèíòàêñèñà äëÿ àòðèáóòîâ âèäæåòà.
- UI.VCAEngine: Äîáàâëåíà ïîäñâåòêà ñèíòàêñèñà äëÿ ïðèìèòèâîâ "ElFigure" è "Document".
- UI.VCAEngine: Äîáàâëåíû ñïåöèôè÷åñêèå ñâîéñòâà ê àòðèáóòàì ïðèìèòèâîâ, âðîäå ïîìîùè è ïîäñâåòêè ñèíòàêñèñà.
- UI.Vision: Äîáàâëåíî îòîáðàæåíèå ïîìîùè ïî àòðèáóòàì âèäæåòà.
- UI.Vision: Äîáàâëåíà èíäèêàöèÿ ñîîáùåíèÿ î ïîòåðè ñîåäèíåíèÿ ñ ñåðâåðîì âèçóàëèçàöèè, à òàêæå âîññòàíîâëåíèå, ïðè óäàë¸ííîé âèçóàëèçàöèè.
4 Ôîðìèðîâàíèå è ñòàáèëèçàöèÿ API ïîëüçîâàòåëüñêîãî ïðîãðàììèðîâàíèÿ
Áûëî ïðîäîëæåíî ôîðìèðîâàíèå îáúåêòíîãî API ïîëüçîâàòåëüñêîãî ïðîãðàììèðîâàíèÿ, êîòîðîå ïðåäóñìàòðèâàåò èíòåãðàöèþ ïîëüçîâàòåëüñêèõ ôóíêöèé â äåðåâî îáúåêòîâ ñèñòåìû OpenSCADA. Êðîìå ýòîãî, áûë âíåñåí ðÿä èçìåíåíèé â ñóùåñòâóþùèå áèáëèîòåêè ôóíêöèé ïîëüçîâàòåëüñêîãî API.
 ÷àñòíîñòè áûëè îñóùåñòâëåíû ñëåäóþùèå èçìåíåíèÿ:
- DB: Äîáàâëåíû ôóíêöèè ïîëüçîâàòåëüñêîãî API fieldStruct(), fieldSeek(), fieldGet(), fieldSet() è fieldDel() äëÿ îáúåêòà òàáëèöû, ñ öåëüþ ïðåäîñòàâèòü ïîëüçîâàòåëüñêèé äîñòóï ê ÁÄ ïîñðåäñòâîì èíòåðôåéñà OpenSCADA.
- DAQ.JavaLikeCalc: Äîáàâëåíà âñòðîåííàÿ ôóíêöèÿ typeof() äëÿ ïðîâåðêè òèïà çíà÷åíèÿ.
- 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" äëÿ ïîëó÷åíèÿ àðãóìåíòîâ ôóíêöèè.
5 Îáùåñèñòåìíûå ðàñøèðåíèÿ
 îáùåñèñòåìíîå API ñèñòåìû OpenSCADA áûëè âíåñåíû çíà÷èòåëüíûå èçìåíåíèÿ è ðàñøèðåíèÿ ñ öåëüþ ïîâûøåíèÿ ôóíêöèîíàëüíîñòè è îáùåé ñòàáèëèçàöèè:
- SYS:
- Äîáàâëåíà íîâàÿ ôóíêöèÿ TSYS::time2str() äëÿ ïðåîáðàçîâàíèÿ èíòåðâàëîâ âðåìåíè â ñòðîêó âðîäå "1÷àñ 23ìèí 10ñåê". Ýòó ôóíêöèþ èñïîëüçîâàíî âåçäå.
- Äîáàâëåíà ðåàëèçàöèÿ ñîáñòâåííîãî XML-ïàðñåðà, âìåñòî Expat. Ñîáñòâåííûé XML-ïàðñåð ðåøàåò ïðîáëåìó ïîääåðæêè ðàçëè÷íûõ êîäèðîâîê, îòëè÷íûõ îò UTF, à òàêæå áåçîïàñíîé îáðàáîòêè ñèòóàöèè íàëè÷èÿ íåäîïóñòèìûõ, äëÿ òåêóùåé êîäèðîâêè, ñèìâîëîâ.
- Ðåàëèçîâàíà íîâàÿ ñòðóêòóðà äåðåâà èñõîäíûõ òåêñòîâ.
- Âñå ðåñóðñû ïðîåêòà ïåðåìåùåíû â îòäåëüíûé àðõèâ.
- Äëÿ ñîçäàíèÿ àðõèâîâ èñõîäíûõ òåêñòîâ è ðåñóðñîâ ìîæíî èñïîëüçîâàòü êîìàíäû "$ make dist-lzma" è "$ make dist-reslzma".
- Äîêóìåíòàöèÿ âûïîëíåíà ñòàòè÷íîé, äëÿ ìîäóëåé, è ïîäåëåíà ïî ÿçûêàì. Äëÿ êàæäîãî ÿçûêà äîêóìåíòàöèè ôîðìèðóåòñÿ îòäåëüíûé ïàêåò.
- Äîáàâëåíû ïàêåòû áèáëèîòå÷íûõ ÁÄ *-LibDB.Main è *-LibDB.VCA, ïîìåùåíû â data/LibsDB.
- Âìåñòî DemoDB ïàêåòà äîáàâëåíû ïàêåòû ìîäåëåé "AGLKS" è "Boiler", ïîìåùåíû â data/ModelsDB.
- Êîíôèãóðàöèîííûå ôàéëû äëÿ ïîñòðîåíèÿ RPM è DEB ïàêåòîâ îáíîâëåíû.
- Çàâèñèìîñòü íà áèáëèîòåêó PCRECPP ãëîáàëüíî çàìåíåíà íà PCRE.
- SYS.TMess: Îáùèå ñîîáùåíèÿ èíòåðôåéñà óïðàâëåíèÿ ïåðåìåùåíû â îäíó ôóíêöèþ TMess::lab*.
- Transport, Transport.*: Äîáàâëåíà ôóíêöèÿ TTransportS::traf2str() äëÿ ïðåîáðàçîâàíèÿ çíà÷åíèÿ ñ÷¸ò÷èêà òðàôèêà â ñòðîêó âðîäå "12.5ÊèÁ"
Çàêëþ÷åíèå
Ñèñòåìà OpenSCADA ïîëó÷èëà òîë÷îê äëÿ îñóùåñòâëåíèÿ ðåàëüíîé àïïàðàòíîé ìíîãîïëàòôîðìåííîñòè, ïîñðåäñòâîì ÷åãî êîä ïðîåêòà áûë â çíà÷èòåëüíîé ñòåïåíè âû÷èùåí è ñäåëàí ìíîãîïëàòôîðìåííûì. Ýòè íàðàáîòêè ïîçâîëÿò ïðîäîëæèòü äâèæåíèå ïðîåêòà â ñòîðîíó àïïàðàòíîé ìíîãîïëàòôîðìåííîñòè, à òàêæå ðåàëèçàöèè ïðîãðàììíîé, ÷òî çàïëàíèðîâàíî ïîñëå ìëåäóþùåãî LTS ðåëèçà 0.8.0.
Ññûëêè