Ââåäåíèå
Ðåëèç îòêðûòîé SCADA(Supervisory control and data acquisition) ñèñòåìû âåðñèè 0.8.0 ÿâëÿåòñÿ ñòàáèëüíûì ïðîìûøëåííûì ðåëèçîì ïðîäîëæèòåëüíîé ïîääåðæêè (LTS).
Îñíîâíîé öåëüþ äàííîãî ðåëèçà ÿâëÿåòñÿ ïðåäîñòàâëåíèå ñîîáùåñòâó ïîëüçîâàòåëåé è ðàçðàáîò÷èêîâ ñâîáîäíîãî ïðîãðàììíîãî îáåñïå÷åíèÿ (ÏÎ) ñòàáèëüíîé ïëàòôîðìû äëÿ ïîñòðîåíèÿ ðåøåíèé êîìïëåêñíûõ ñèñòåì àâòîìàòèçàöèè è äðóãèõ ñìåæíûõ ðåøåíèé, à òàêæå ïðåäîñòàâëåíèÿ êîììåð÷åñêèõ óñëóã íà îñíîâå ïðîåêòà OpenSCADA.
Äàííûé ðåëèç ÿâëÿåòñÿ ñëåäóþùèì ñòàáèëüíûì ðåëèçîì, äëÿ êîòîðîãî ïðåäîñòàâëÿåòñÿ òåõíè÷åñêàÿ ïîääåðæêà îò ðàçðàáîò÷èêîâ è äëÿ êîòîðîãî ïëàíèðóåòñÿ âûïóñê èñïðàâëåíèé â òå÷åíèå ïðîäîëæèòåëüíîãî âðåìåíè. Æèçíåííûé öèêë ïðåäûäóùåãî ñòàáèëüíîãî ðåëèçà 0.7.0 ïðîäîëæèòåëüíîé ïîääåðæêè (LTS) áóäåò ïðåêðàù¸í â òå÷åíèè ìåñÿöà ïîñëå âûïóñêà 0.8.0 ïîñëåäíèì îáíîâëåíèåì.
Äàííûé äîêóìåíò ÿâëÿåòñÿ îáðàáîòêîé(êîìïèëÿöèåé) äîêóìåíòà "ChangeLog" ñèñòåìû OpenSCADA âåðñèè 0.8.0, âêëþ÷àÿ ïðîìåæóòî÷íûå ðàáî÷èå ðåëèçû 0.7.1 è 0.7.2, êîòîðûé ïðèçâàí âêðàòöå è íàãëÿäíî îñâåòèòü íîâûå âîçìîæíîñòè ñèñòåìû OpenSCADA. Äåòàëüíî îçíàêîìèòüñÿ ñ èçìåíåíèÿìè ìîæíî â ôàéëå "ChangeLog" èç äèñòðèáóòèâà ñèñòåìû èëè çäåñü: http://wiki.oscada.org/Works/ChangeLog.
Êëþ÷åâûìè îñîáåííîñòÿìè äàííîé âåðñèè ÿâëÿþòñÿ:
- Ðåàëèçàöèÿ ïëàíîâûõ çàäà÷.
- Îïòèìèçàöèÿ, ïîâûøåíèå ñòàáèëüíîñòè, óñòîé÷èâîñòè è ïðîèçâîäèòåëüíîñòè ñèñòåìû.
- Óñîâåðøåíñòâîâàíèå è ñòàáèëèçàöèÿ ãðàôè÷åñêîé ïîäñèñòåìû.
- Ðàñøèðåíèå API ïîëüçîâàòåëüñêîãî ïðîãðàììèðîâàíèÿ.
- Ôîðìèðîâàíèå, ðàñøèðåíèå è ñòàáèëèçàöèÿ API ïîëüçîâàòåëüñêîãî ïðîãðàììèðîâàíèÿ
- Îáùåñèñòåìíûå ðàñøèðåíèÿ.
- Ïóáëèêàöèÿ ðåøåíèé OpenSCADA.
Íîâûå è îáíîâëåííûå ìîäóëè:
- Archive.DBArch (0.9.5) — Äîáàâëåíû ëèìèòû çàïðîñà äàííûõ ïî âðåìåíè çàïðîñà è åù¸ íåêîòîðûå ðàñøèðåíèÿ.
- Archive.FSArch (1.5.1) — Çíà÷èòåëüíàÿ ñòàáèëèçàöèÿ. Ìíîæåñòâî ðàñøèðåíèé, â òîì ÷èñëå:
- Ïîâûøåíèå ïðîèçâîäèòåëüíîñòè ÷òåíèÿ èíäåêñîâ ôàéëîâ àðõèâîâ çíà÷åíèé.
- Àäàïòàöèÿ õðàíåíèÿ è ÷òåíèÿ âåùåñòâåííîãî ê ARM FPA.
- Äîáàâëåíû ëèìèòû çàïðîñà äàííûõ ïî âðåìåíè çàïðîñà.
- Äîáàâëåí ëèìèò íà îáùèé ðàçìåð ôàéëîâ àðõèâàòîðà çíà÷åíèé.
- DB.MySQL (1.7.1) — Ñòàáèëèçàöèÿ. Äîáàâëåíà âîçìîæíîñòü óêàçàíèÿ òàéìàóòîâ ïîäêëþ÷åíèÿ.
- DB.SQLite (1.6.4) — Ñòàáèëèçàöèÿ.
- DB.FireBird (0.9.7) — Ñòàáèëèçàöèÿ.
- DB.PostgreSQL (0.9.2) — Ñòàáèëèçàöèÿ.
- DAQ.DiamondBoards (1.2.5) — Äîáàâëåíà âîçìîæíîñòü ñìåíû òèïà ïàðàìåòðà. Ñòàáèëèçàöèÿ.
- DAQ.System (1.7.5) — Ñòàáèëèçàöèÿ. Çàâèñèìîñòü îò áèáëèîòåêè "Libsensors" ñäåëàíà îïöèîíàëüíîé. Äîáàâëåíî ïëàíèðîâàíèå âûçîâîâ ïî CRON.
- DAQ.BlockCalc (1.6.0) — Ñòàáèëèçàöèÿ. Ìíîæåñòâî ðàñøèðåíèé, â òîì ÷èñëå:
- Äîáàâëåíà ïîäñâåòêà ñèíòàêñèñà.
- Äîáàâëåíî ïëàíèðîâàíèå âûçîâîâ ïî CRON.
- Äîáàâëåí çàïóñêàþùèé è îñòàíàâëèâàþùèé âûçîâ áëîêîâ.
- Äîáàâëåíà ïîääåðæêà îáúåêòíîãî òèïà ïàðàìåòðîâ.
- DAQ.JavaLikeCalc (2.0.0) — Çíà÷èòåëüíàÿ ñòàáèëèçàöèÿ. Ìíîæåñòâî ðàñøèðåíèé, â òîì ÷èñëå:
- Äîáàâëåíà ïîäñâåòêà ñèíòàêñèñà.
- Âûïîëíåíà àäàïòàöèÿ ê àïïàðàòíîé àðõèòåêòóðå ARM.
- Äîáàâëåíà ðåàëèçàöèÿ ðåãóëÿðíûõ âûðàæåíèé è ðÿäà ðàñøèðåíèé API ïîëüçîâàòåëÿ.
- Äîáàâëåíà âîçìîæíîñòü çàïèñè ñèìâîëîâ ñòðîêè ñ ïîìîùüþ âîñüìåðè÷íîãî "\041" è øåñòíàäöàòåðè÷íîãî "\x21" ÷èñëà.
- Äîáàâëåí ïðÿìîé, äèíàìè÷åñêèé âûçîâ áèáëèîòå÷íûõ ôóíêöèé.
- Äîáàâëåíî ïðÿìîå îáúåäèíåíèå ñòðîêîâûõ êîíñòàíò.
- Äîáàâëåí óñëîâíûé âûçîâ àðãóìåíòîâ âûðàæåíèÿ (âòîðîãî àðãóìåíòà) ñ ëîãè÷åñêèìè îïåðàöèÿìè ||(OR) è &&(AND).
- Äîáàâëåíà ïîääåðæêà îáúåêòíîãî òèïà ïàðàìåòðîâ èñòî÷íèêà äàííûõ.
- DAQ.LogicLev (1.3.0) — Ñòàáèëèçàöèÿ. Ìíîæåñòâî ðàñøèðåíèé, â òîì ÷èñëå:
- Äîáàâëåíà âîçìîæíîñòü ñìåíû òèïà ïàðàìåòðà.
- Äîáàâëåíî ïëàíèðîâàíèå âûçîâîâ ïî CRON.
- Äîáàâëåíà ïîääåðæêà îáúåêòíîãî òèïà ïàðàìåòðîâ.
- DAQ.SNMP (0.7.0) — Çíà÷èòåëüíàÿ ñòàáèëèçàöèÿ. Ìíîæåñòâî ðàñøèðåíèé, â òîì ÷èñëå:
- Ðåàëèçàöèÿ ïîëíîé ïîääåðæêè êëèåíòñêîé ÷àñòè ïðîòîêîëà.
- Äîáàâëåíà ïîääåðæêà âñåõ òèïîâ çíà÷åíèé.
- Äîáàâëåíà ïîääåðæêà çàïèñè çíà÷åíèé.
- Óëó÷øåíà îáðàáîòêà îøèáîê.
- Äîáàâëåíû äîïîëíèòåëüíûå ïàðàìåòðû êîíôèãóðàöèè ïîäêëþ÷åíèÿ.
- Äîáàâëåíà âîçìîæíîñòü ïðÿìîãî çàïðîñà ñêàëÿðîâ.
- DAQ.Siemens (1.4.0) — Çíà÷èòåëüíàÿ ñòàáèëèçàöèÿ. Ìíîæåñòâî ðàñøèðåíèé, â òîì ÷èñëå:
- Âåðñèÿ áèáëèîòåêè LibnoDave îáíîâëåíà äî 0.8.4.6.
- Äîáàâëåíî ïëàíèðîâàíèå âûçîâîâ ïî CRON.
- Äîáàâëåíà ôóíêöèÿ ïåðåïîäêëþ÷åíèÿ äëÿ "Industrial Ethernet" ñîåäèíåíèé.
- Äîáàâëåí âàðèàíò ïðîòîêîëà ISO_TCP äëÿ S7-200.
- Äîáàâëåíà ïîääåðæêà îáúåêòíîãî òèïà ïàðàìåòðîâ.
- Äîáàâëåíà ðåàëèçàöèÿ ïðîòîêîëà "ADS".
- Íåñêîëüêî óíèôèöèðîâàíû îøèáêè ïîäêëþ÷åíèÿ.
- Äîáàâëåíà âîçìîæíîñòü óñòàíîâêè íîìåðà ÁÄ è ñìåùåíèÿ â øåñòíàäöàòåðè÷íîì âèäå.
- DAQ.ModBus (1.3.0) — Çíà÷èòåëüíàÿ ñòàáèëèçàöèÿ. Ìíîæåñòâî ðàñøèðåíèé, â òîì ÷èñëå:
- Äîáàâëåíà ïîäñâåòêà ñèíòàêñèñà ñïèñêà àòðèáóòîâ.
- Äîáàâëåíà ïîääåðæêà òèïà ïàðàìåòðà "Ëîãè÷åñêèé" äëÿ ðàáîòû ïî øàáëîíó ïàðàìåòðà, à òàêæå ôóíêöèè ïîëüçîâàòåëüñêîãî API äëÿ îòïðàâêè ïðîèçâîëüíûõ íåñòàíäàðòíûõ ModBus-çàïðîñîâ èç øàáëîíîâ.
- Äîáàâëåíà è èñïîëüçîâàíà ôóíêöèÿ ôîðìèðîâàíèÿ ñîîáùåíèé î íàðóøåíèÿõ â êîíòðîëëåðå.
- Äîáàâëåíà ïîääåðæêà ôóíêöèé ãðóïïîâîé çàïèñè (0x0F, 0x10).
- Äîáàâëåí ïàðàìåòð óñòàíîâêè îãðàíè÷åíèÿ ðàçìåðà áëîêà ãðóïïîâûõ çàïðîñîâ.
- Äîáàâëåíà ïîääåðæêà îáúåêòíîãî òèïà ïàðàìåòðîâ.
- Ðàçìåð ìàêñèìàëüíîãî áëîêà çàïðîñà ñäåëàí îïöèîíàëüíûì.
- Äîáàâëåíà âîçìîæíîñòü êîììåíòèðîâàíèÿ ýëåìåíòîâ ñïèñêà àòðèáóòîâ ñòàíäàðòíîãî òèïà ïàðàìåòðà ïîñðåäñòâîì ñèìâîëà '#' â íà÷àëå.
- DAQ.DCON (0.5.1) — Ìîäóëü ïîëíîñòüþ ïåðåïèñàí íà ïðåäìåò ïîääåðæêè ñìåøàííûõ ìîäóëåé ïîñðåäñòâîì âûáîðà êîìàíä çàïðîñà. Ñòàáèëèçàöèÿ.
- DAQ.ICP_DAS (0.8.0) — Äîáàâëåíà áèáëèîòåêà API "ICP DAS" libi8k.a äëÿ àðõèòåêòóðû ARM è âêëþ÷åíà âîçìîæíîñòü ñáîðêè ìîäóëÿ äëÿ ARM. Ñáîðêà ïî óìîë÷àíèþ îòêëþ÷åíà äëÿ ïðåäîòâðàùåíèÿ ïîïûòîê ñáîðêè íà íåïîäõîäÿùåì ARM îêðóæåíèè. Ñòàáèëèçàöèÿ.
- DAQ.DAQGate (0.9.5) — Äîáàâëåí êåø ïàðàìåòðîâ äëÿ èõ èíèöèàëèçàöèè ïðè àâòîíîìíîé ðàáîòå. Äîáàâëåíî ïëàíèðîâàíèå âûçîâîâ ïî CRON. Ñòàáèëèçàöèÿ.
- DAQ.SoundCard (0.6.2) — Ñòàáèëèçàöèÿ.
- DAQ.OPC_UA (0.6.2) — Ñòàáèëèçàöèÿ. Äîáàâëåíà ïîäñâåòêà ñèíòàêñèñà ñïèñêà àòðèáóòîâ. Àäàïòàöèÿ õðàíåíèÿ è ÷òåíèÿ âåùåñòâåííîãî ê ARM FPA.
- DAQ.BFN (0.5.1) — Íîâûé ìîäóëü.
- Protocol.ModBus (0.6.4) — Ñòàáèëèçàöèÿ. Íåêîòîðûå óëó÷øåíèÿ.
- Protocol.OPC_UA (0.6.2) — Ñòàáèëèçàöèÿ.
- Transport.Sockets (1.5.1) — Çíà÷èòåëüíàÿ ñòàáèëèçàöèÿ. Äîáàâëåí òàéìàóò ïîâòîðà çàïðîñà èñõîäÿùåãî òðàíñïîðòà.
- Transport.SSL (1.0.1) — Ñòàáèëèçàöèÿ. Íåêîòîðûå óëó÷øåíèÿ.
- Transport.Serial (0.8.0) — Ñòàáèëèçàöèÿ. Ïðè èíèöèàëèçàöèè ïîðòà èñïîëüçîâàíû ïðåäûäóùèå íàñòðîéêè è ðåàëèçîâàíà âîçìîæíîñòü îïóñêàòü óêàçàíèå íåêîòîðûõ íàñòðîåê. Äîáàâëåíî óïðàâëåíèå ïîòîêîì ñ ïîìîùüþ ñèãíàëà RTS äëÿ ïðîñòûõ ïðåîáðàçîâàòåëåé ñèãíàëîâ RS232->RS485.
- Protocol.HTTP (1.6.0) — Ñòàáèëèçàöèÿ. Ìíîæåñòâî ðàñøèðåíèé, â òîì ÷èñëå:
- Äîáàâëåíà ïîääåðæêà ïåðåìåííîé HTTP "Transfer-Encoding=chunked" â èñõîäÿùåì òðàíñïîðòå.
- Äîáàâëåíà ïîääåðæêà ïîëüçîâàòåëüñêèõ øàáëîíîâ äëÿ âíóòðåííåãî ñîäåðæèìîãî ìîäóëÿ.
- Äîáàâëåíà ãåíåðàöèÿ ñîîáùåíèé àóòåíòèôèêàöèè ïîëüçîâàòåëåé.
- Äîáàâëåíà ïîääåðæêà âñåõ îñíîâíûõ âàðèàíòîâ çàâåðøåíèÿ ñòðîêè ïðè ðàçáîðå HTTP-çàïðîñà.
- Protocol.SelfSystem (0.9.5) — Ñòàáèëèçàöèÿ.
- Protocol.UserProtocol (0.6.2) — Äîáàâëåíà ïîäñâåòêà ñèíòàêñèñà. Ñòàáèëèçàöèÿ.
- Special.FLibComplex1 (1.1.0) — Äîáàâëåí ïðÿìîé, äèíàìè÷åñêèé âûçîâ áèáëèîòå÷íûõ ôóíêöèé.
- Special.FLibMath (0.6.0) — Äîáàâëåí ïðÿìîé, äèíàìè÷åñêèé âûçîâ áèáëèîòå÷íûõ ôóíêöèé.
- Special.FLibSYS (1.0.0) — Äîáàâëåí ïðÿìîé, äèíàìè÷åñêèé âûçîâ áèáëèîòå÷íûõ ôóíêöèé.
- Special.SystemTests (1.5.1) — Íåáîëüøèå óëó÷øåíèÿ.
- UI.QTStarter (1.7.0) — Ñòàáèëèçàöèÿ. Çíà÷èòåëüíûå ðàñøèðåíèÿ è óëó÷øåíèÿ.
- UI.QTCfg (2.1.1) — Ñòàáèëèçàöèÿ. Çíà÷èòåëüíûå ðàñøèðåíèÿ è óëó÷øåíèÿ.
- UI.WebCfg (1.5.6) — Ñòàáèëèçàöèÿ.
- UI.WebCfgD (0.8.1) — Ñòàáèëèçàöèÿ. Çíà÷èòåëüíûå ðàñøèðåíèÿ è óëó÷øåíèÿ.
- UI.VCAEngine (1.3.0) — Ñòàáèëèçàöèÿ. Çíà÷èòåëüíûå ðàñøèðåíèÿ è óëó÷øåíèÿ.
- UI.Vision (1.3.0) — Ñòàáèëèçàöèÿ. Çíà÷èòåëüíûå ðàñøèðåíèÿ è óëó÷øåíèÿ.
- UI.WebVision (1.0.1) — Çíà÷èòåëüíàÿ ñòàáèëèçàöèÿ. Çíà÷èòåëüíûå ðàñøèðåíèÿ è óëó÷øåíèÿ.
- UI.WebUser (0.6.2) — Ñòàáèëèçàöèÿ. Äîáàâëåíà ïîäñâåòêà ñèíòàêñèñà ïðîöåäóð.
1 Ðåàëèçàöèÿ ïëàíîâûõ çàäà÷
 ñîîòâåòñòâèè ñ ïëàíîì ðåëèçà áûëè âûïîëíåíû ñëåäóþùèå çàäà÷è:
- Ôîðìèðîâàíèå ïðåäîñòàâëåíèÿ êîììåð÷åñêèõ óñëóã íà îñíîâå OpenSCADA. — Âûñòðîåíà êîíöåïöèÿ è ñîçäàíû ìåõàíèçìû ïðåäîñòàâëåíèÿ êîììåð÷åñêèõ óñëóã ðàçðàáîò÷èêàìè íà îñíîâå OpenSCADA (
http://oscada.org/ru/uslugi ).
- Àäàïòàöèÿ ñèñòåìû OpenSCADA äëÿ ðàáîòû íà àïïàðàòíîé ïëàòôîðìå ARM. — Îñóùåñòâëåíà ñáîðêà, àäàïòàöèÿ è ïîëíîìàñøòàáíîå òåñòèðîâàíèå OpenSCADA íà àðõèòåêòóðå ARM; àäàïòàöèÿ è òåñòèðîâàíèå ïðîâîäèëèñü íà èíòåðíåò ïëàíøåòå ôèðìû
Nokia —
N800 (http://wiki.oscada.org/Works/Tests/ARM ). Âûïîëíåíà ñáîðêà è àäàïòàöèÿ OpenSCADA äëÿ ñëîæíîãî (î÷åíü ñòàðîãî) ïðîãðàììíîãî îêðóæåíèÿ êîíòðîëëåðà LP-5451, à òàêæå ñáîðêà äëÿ êîíòðîëëåðà
SMH2Gi è ñìàðòôîíîâ ôèðìà Nokia: N900, N950, N9.  ðàìêàõ ñáîðêè è àäàïòàöèè íà ðàçëè÷íûå ìîáèëüíûå óñòðîéñòâà áûëè âûïîëíåíû ñëåäóþùèå çàäà÷è:
- SYS:
- Ïðîòîòèïû ôóíêöèé TMess::put(), TMess::get(), TCntrNode::grpSize(), TCntrNode::grpId(), TCntrNode::grpAt() èçìåíåíû äëÿ èñïðàâëåíèÿ èñïîëüçîâàíèÿ áåççíàêîâîãî òèïà "char" íà ARM êàê çíàêîâîãî.
- Âûïîëíåíà àäàïòàöèÿ äëÿ ñáîðêè ñ GLibC âåðñèè ìåíüøå 2.5 (2.3.2).
- TVariant, DAQ.{AMRDevs, OPC_UA}: Èñïðàâëåí íåâûðàâíåííûé äîñòóï ê äàííûì.
- DAQ.OPC_UA: Äîáàâëåíû ñèñòåìíûå ôóíêöèè floatLE(), floatLErev(), doubleLE(), doubleLErev() äëÿ ïðåîáðàçîâàíèÿ ôîðìàòà õðàíåíèÿ âåùåñòâåííîãî ÷èñëà íà ðàçëè÷íûõ àðõèòåêòóðàõ.
- Äîáàâëåíà àäàïòàöèÿ ê uClibc. Ñáîðêà íà÷èíàåòñÿ ñ âåðñèè 0.9.32, êîòîðàÿ èìååò ïîääåðæêó ôóíêöèé ðåàëüíîãî âðåìåíè âðîäå clock_nanosleep().
- Äîáàâëåíà ïðîâåðêà è îòêëþ÷åíèå èñïîëüçîâàíèÿ "Iconv" è "Intl" (I18N) API.
- Äîáàâëåíî àâòîìàòè÷åñêîå îáíàðóæåíèå è âêëþ÷åíèå ïàðàìåòðà êîíôèãóðàöèè --enable-CrossCompile äëÿ îêðóæåíèÿ êðîññ-êîìïèëÿöèè.
- Äîáàâëåí ïàðàìåòð êîíôèãóðàöèè --enable-CoreLibStatic äëÿ îòêëþ÷åíèÿ ñáîðêè ðàçäåëÿåìîé áèáëèîòåêè ÿäðà OpenSCADA è ñòàòè÷åñêîé ëèíêîâêè ïðîãðàììû âûçîâà-çàïóñêà.
- Ôóíêöèÿ usleep() âåçäå çàìåíåíà íà ñîáñòâåííóþ ôóíêöèþ-îá¸ðòêó TSYS::sysSleep() ïî ïðè÷èíå îòñóòñòâèÿ ôóíêöèè usleep() â uCLibc è äîñòóïíîñòè å¸ òîëüêî ïðè ñïåöèàëüíîé êîíôèãóðàöèè ñáîðêè uClibc.  TSYS::sysSleep() èñïîëüçîâàíà nanosleep().
- Ôóíêöèÿ pthread_yield() çàìåíåíà íà sched_yield().
- DAQ:
- JavaLikeCalc: Âèðòóàëüíàÿ ìàøèíà ïåðåïèñàíà äëÿ ïðÿìîãî èñïîëüçîâàíèÿ ñòðóêòóð êîìàíä ñ öåëüþ èñêëþ÷åíèÿ ïðîáëåìû âûðàâíèâàíèÿ, à òàêæå äëÿ íåêîòîðîãî ïîâûøåíèÿ ïðîèçâîäèòåëüíîñòè.
- Siemens: Èñïðàâëåíà ïðîáëåìà áèáëèîòåêè NoDave íà ïðåäìåò ãëîáàëüíîãî âûçîâà êîìàíäû óïàêîâêè ñòðóêòóð "#pragma pack(1)".
- ICP_DAS: Äîáàâëåíà áèáëèîòåêà API "ICP DAS" libi8k.a äëÿ àðõèòåêòóðû ARM è âêëþ÷åíà âîçìîæíîñòü ñáîðêè ìîäóëÿ äëÿ ARM.
- Archive:
- Ïðîòîòèïû ôóíêöèé TArchiveS::messPut() è TArchiveS::messGet() èçìåíåíû äëÿ èñïðàâëåíèÿ ïåðåìåííîé óðîâíÿ ñîîáùåíèÿ êàê çíàêîâîãî ÷èñëà.
- FSArch:
- Èñïðàâëåíî õðàíåíèå âåùåñòâåííîãî ÷èñëà ôîðìàòà LE â àðõèâå íà àðõèòåêòóðå ARM.
-  àëãîðèòìå áûñòðîãî ïîäñ÷¸òà êîëè÷åñòâà áèòîâ èñïîëüçîâàíî ôóíêöèþ íåâûðàâíåííîãî ÷òåíèÿ TSYS::getUnalign32().
- Ðàçìåð ïîëÿ êîäèðîâêè â ïëîñêîì àðõèâå ñîîáùåíèÿ ðàñøèðåí ñ 9 äî 99 ñèìâîëîâ.
- UI.QTCfg: Äîáàâëåíî êðàòêîâðåìåííîå çàñûïàíèå ïîñëå çàêðûòèÿ âñåõ îêîí â ôóíêöèè îòêëþ÷åíèÿ, ñ öåëüþ ïðåäîñòàâèòü âðåìÿ îêîí÷àòåëüíî ðàçðóøèòüñÿ îáúåêòàì âñåõ îêîí è ïðåäîòâðàòèòü ïàäåíèå.
- Ðåàëèçàöèÿ ìåõàíèçìà îòêàòîâ èçìåíåíèé ðåäàêòèðîâàíèÿ â Vision. —  ðàìêàõ îêíà âèçóàëüíîãî ðåäàêòèðîâàíèÿ âèäæåòîâ ðåàëèçîâàí ìíîãîóðîâíåâûé ìåõàíèçì îòêàòà èçìåíåíèé äëÿ âñåõ îñíîâíûõ îïåðàöèé: âèçóàëüíîå èçìåíåíèå ãåîìåòðèè, èçìåíåíèå çíà÷åíèÿ àòðèáóòà âèäæåòà, äîáàâëåíèå/óäàëåíèå âèäæåòà, êîïèðîâàíèå âèäæåòà è ðåäàêòèðîâàíèå âèäæåòîâ íà îñíîâå ïðèìèòèâà "ElFigure".
2 Îïòèìèçàöèÿ, ïîâûøåíèå ñòàáèëüíîñòè, óñòîé÷èâîñòè è ïðîèçâîäèòåëüíîñòè ñèñòåìû
Ñ ìîìåíòà ïîñëåäíåãî ñòàáèëüíîãî ðåëèçà â ïðîöåññå ðàáîò íàä äàííîé âåðñèåé, à òàêæå å¸ ïðàêòè÷åñêîé àäàïòàöèè, áûëî îáíàðóæåíî è èñïðàâëåíî â îáùåé ñëîæíîñòè áîëåå 300 îøèáîê.  öåëîì áûëà ïðîäåëàíà ðàáîòà ïî ÷èñòêå êîäà îò ïðåäóïðåæäàþùèõ ñîîáùåíèé êîìïèëÿòîðà, ñ ôëàãîì "-Wall":
- óäàëåíèå íåèñïîëüçîâàííûõ ïåðåìåííûõ;
- äîáàâëåíèå âîçâðàòà âî âñåõ ôóíêöèÿõ;
- èíèöèàëèçàöèÿ ïåðåìåííûõ ñ âîçìîæíîñòüþ èõ èñïîëüçîâàíèÿ íåîïðåäåë¸ííûìè;
- èñêëþ÷åíèå íåïîëíîé îáðàáîòêè ïåðå÷èñëèìûõ òèïîâ â îïåðàöèè âûáîðà;
- ñðàâíåíèå çíàêîâîãî ñ áåççíàêîâûì öåëûì.
Ïåðå÷èñëèì íàèáîëåå ñóùåñòâåííûå îøèáêè, èñïðàâëåíèå êîòîðûõ çíà÷èòåëüíî îòðàçèëîñü íà ïîâûøåíèè ñòàáèëüíîñòè:
- Îáùåñèñòåìíûå:
- Êîìàíäà ñáîðî÷íîé ñèñòåìû "$ make dist" èñïðàâëåíà è àäàïòèðîâàíà äëÿ êîððåêòíîãî ñîçäàíèÿ äèñòðèáóòèâîâ OpenSCADA.
- Ôóíêöèÿ TSYS::cron() äëÿ âûçîâà ïî ðàñïèñàíèþ íåîäíîêðàòíî èñïðàâëåíà.
- Òèï ïåðåìåííîé äëÿ õðàíåíèÿ ðåçóëüòàòà ôóíêöèè find() ñòðîêè âåçäå èçìåí¸í íà êîððåêòíûé "size_t".
- Èñïðàâëåíû âíåïëàíîâûå âûçîâû ïî ðàñïèñàíèþ, ñâÿçàííûå ñ ðàññèíõðîíèçàöèåé çíà÷åíèé ôóíêöèé time() è clock_gettime(CLOCK_REALTIME,&sp_tm).
- Èñïðàâëåíà ïðîâåðêà è îæèäàíèå ïîòîêîâ íà äîñòóïíîñòü ïðè ïåðåêðûòèè ñ îñòàíîâêîé ïðåäûäóùåãî îäíîèì¸ííîãî ïîòîêà.
- Îòêëþ÷åíî îæèäàíèå èíèöèàëèçàöèè äëÿ îòñîåäèíÿåìûõ çàäà÷ ñ öåëüþ ïðåäîòâðàùåíèÿ çàâèñàíèÿ íà îæèäàíèè áûñòðî çàêðûâàåìûõ çàäà÷.
- Èñïðàâëåíà ðàáîòà ôóíêöèé íåâûðàâíåííîãî ÷òåíèÿ getUnalign*() íà ARM. Ïðîáëåìà îáíàðóæåíà íà PXA270.
- Function: Èñêëþ÷åíà âîçìîæíîñòü óòå÷êè ïàìÿòè â ñëó÷àå ïîïûòêè óñòàíîâèòü îáúåêò â íåîáúåêòíûé ïàðàìåòð ôóíêöèè.
- DAQ.ModBus, Transport.Serial, UI.{WebCfg, WebCfgD, WebUser, WebVision}: Èñïðàâëåíî îøèáî÷íîå èñïîëüçîâàíèå ñèìâîëà çàâåðøåíèÿ ñòðîêè '\n' äëÿ ìíîæåñòâà ïðîãðàììíûõ ïëàòôîðì UNIX, MAC, DOS/Windows, ïóò¸ì çàìåíû íà"\x0A" .
- ResString: Äëÿ ÷òåíèÿ-çàïèñè ñòðîêè èñïîëüçîâàí îáîðîò "string(vl.data(), vl.size())", ñ öåëüþ ïðåäîòâðàùåíèÿ COW àëãîðèòìà.
- Function: Èñïðàâëåíà ïðîâåðêà íà ìîäèôèêàöèþ ïðè óñòàíîâêå çíà÷åíèé ðàçíûõ òèïîâ IO (Âåùåñòâåííîå â Öåëîå).
- Áàçû äàííûõ:
- DB.PostgreSQL: Èñïðàâëåíà îáðàáîòêà àäðåñà ÁÄ íà ïðåäìåò îïðåäåëåíèÿ ïóñòûõ ïîëåé.
- Òðàíñïîðòû è ïðîòîêîëû:
- Transport:
- Èñïðàâëåíà çàãðóçêà âñåõ òðàíñïîðòîâ èç ÁÄ â ñëó÷àå íàëè÷èÿ çàïèñåé ïðî òðàíñïîðò, ìîäóëü êîòîðîãî îòñóòñòâóåò.
- Èñïðàâëåíî èñïîëüçîâàíèå áåççíàêîâîãî òèïà â âîçâðàòå ôóíêöèé read() è write(). Äîáàâëåíû ðåñóðñû ê ñ÷¸ò÷èêàì âõîäíûõ/âûõîäíûõ çàïðîñîâ.
- Âêëþ÷åíà âîçìîæíîñòü ïðåðûâàíèÿ èñõîäÿùåãî òðàíñïîðòà ñèãíàëîì íà îæèäàíèè òàéìàóòà. Ïîëåçíî äëÿ ïðåðûâàíèÿ òðàíñïîðòà ïðè âûõîäå/îñòàíîâå.
- Sockets:
- Èñïðàâëåí ïðîïóñê èíèöèàëèçàöèè ðàçìåðà âîçâðàòíîãî çíà÷åíèÿ äëÿ ôóíêöèè getsockopt().
- Èñïðàâëåíî çàêðûòèå êëèåíòñêîãî ñîåäèíåíèÿ ïî òàéìàóòó âðåìåíè æèçíè, äëÿ ïîäêëþ÷åíèé ïðè îòñóòñòâèè äàííûõ.
- Unix-ñîêåò óñòàíîâëåí â íåáëîêèðóþùèé ðåæèì ïîñðåäñòâîì ôëàãà O_NONBLOCK. Èñïðàâëåíî ôîðìèðîâàíèå ñîîáùåíèé îá îøèáêàõ äëÿ èñõîäÿùèõ òðàíñïîðòîâ.
- Serial: Óñòàíîâëåí ôëàã O_NONBLOCK äëÿ ôóíêöèè open() ïîñëåäîâàòåëüíîãî óñòðîéñòâà ñ öåëüþ ïðåäîòâðàùåíèÿ áëîêèðîâàíèÿ îòêðûòèÿ ïîðòà íà íåêîòîðûõ USB->RS485 ïðåîáðàçîâàòåëÿõ.
- Sockets, SSL: Äîáàâëåíà î÷èñòêà âõîäíîãî áóôåðà äëÿ ïðåäîòâðàùåíèÿ ïîâòîðíîãî èñïîëüçîâàíèÿ íà âûñîêîëàòåíòíûõ êàíàëàõ ïîñëå òàéìàóòà.
- Transport, DAQ.{AMRDevs, DCON, ICP_DAS, ModBus, OPC_UA}, Protocol.HTTP: Èñïðàâëåíî èñïîëüçîâàíèå ôóíêöèè TTransportOut::messIO() ïðè çàïðîñå õâîñòà è ïîëó÷åíèè íóëåâîãî îòâåòà.
- Protocol.HTTP, UI.{WebCfg, WebCfgD, WebVision, WebUser}: Èñïðàâëåí ðàçáîð ýëåìåíòîâ POST-çàïðîñà íà ïðåäìåò ðàçáîðà âñåõ àòðèáóòîâ êàæäîãî ýëåìåíòà.
- Ñáîð äàííûõ è àðõèâû:
- Archive:
- Èñïðàâëåíî èñïîëüçîâàíèå áóôåðà ìÿãêîé ñåòêè ñ íèçêèì è âûñîêèì ðàçðåøåíèåì âðåìåíè â àðõèâàõ çíà÷åíèé.
- Èñïðàâëåíî âû÷èñëåíèå íà÷àëà àðõèâà â ôóíêöèè begin() ïðè ïóñòîì áóôåðå.
- FSArch:
- Èñïðàâëåíî ñîçäàíèå ôàéëîâ àðõèâà ñîîáùåíèé ïðè ïîìåùåíèè ìíîæåñòâà ñòàðûõ ñîîáùåíèé. Äîáàâëåí ïàðàìåòð ïðåäîòâðàùåíèÿ äóáëèêàòîâ.
- Ðåçóëüòàò ôóíêöèè fgetc() çàïèñàí â öåëî÷èñëåííóþ ïåðåìåííóþ âìåñòî ñèìâîëüíîé, ÷òî èñïðàâèëî îáíàðóæåíèå "EOF".
- Èñïðàâëåíî ÷òåíèå äàííûõ èç áóôåðà àðõèâà â ñîîòâåòñòâèè ñ ðàçìåðîì áóôåðà â àëãîðèòìå áûñòðîãî âû÷èñëåíèÿ êîëè÷åñòâà áèòîâ.
- Èñïðàâëåíî ïîìåùåíèå ñìåùåíèÿ â êåø èç àëãîðèòìà áûñòðîãî âû÷èñëåíèÿ êîëè÷åñòâà áèòîâ.
- Èñïðàâëåíà íåêîððåêòíàÿ îáðàáîòêà êîíöà íåâûðàâíåííûõ áëîêîâ áûñòðîãî àëãîðèòìà ïîäñ÷¸òà êîëè÷åñòâà áèòîâ.
- Äîáàâëåí ìîíîïîëüíûé ðåñóðñ ê âûçîâó ôóíêöèè calcVlOff() ñ öåëüþ ïðåäîòâðàùåíèÿ íåêîððåêòíîé ðàáîòû ñ êåøåì.
- DAQ:
- System: Èñïðàâëåíî ïàäåíèå ïðè âûõîäå äëÿ èñòî÷íèêà "Hddtemp".
- ModBus: Ðåæèì óñòàíîâêè çíà÷åíèé àòðèáóòîâ ïàðàìåòðîâ èçìåí¸í íà àêòèâíûé è óëó÷øåíà îáðàáîòêà îøèáîê.
- JavaLikeCalc:
- Äîáàâëåíà ïðîâåðêà èíäåêñà ïðè äîñòóïå ê ñèìâîëó ñòðîêè ïî èíäåêñó ñ öåëüþ ïðåäîòâðàùåíèÿ âûõîäà çà äèàïàçîí.
- Èñïðàâëåíî ïàäåíèå ôóíêöèè replace() îáúåêòà "RegExp".
- Siemens:
- Èñïðàâëåíî ïîëó÷åíèå è çàïèñü çíà÷åíèé âåùåñòâåííûõ òèïîâ.
- Èñïðàâëåíî ïåðåïîäêëþ÷åíèå â ñëó÷àå îøèáêè.
- Èñïðàâëåíî èñïîëüçîâàíèå ñâîéñòâà ðàçìåðà öåëîãî, âåùåñòâåííîãî è ñòðîêîâîãî òèïîâ.
- Äîáàâëåíà î÷èñòêà ñâÿçåé ïàðàìåòðà ïðè åãî âûêëþ÷åíèè.
- Èíòåðôåéñû âèçóàëèçàöèè:
- VCAEngine:
- Èñïðàâëåíî áëîêèðîâàíèå ñåàíñà äëÿ äèíàìè÷åñêè àêòèâíûõ ïðîåêòîâ ïðè äèíàìè÷åñêîì äîñòóïå ê ñîáñòâåííûì àòðèáóòàì âèäæåòà.
- Ïðåäîòâðàùåíà âîçìîæíîñòü ïîòåðè èçìåíåíèé â ñåðâåðå âèçóàëèçàöèè ïðè îòîáðàæåíèè â âèçóàëèçàòîðàõ ïóò¸ì ïðåäâàðèòåëüíîãî ñîõðàíåíèÿ çíà÷åíèÿ òàêòîâîãî ñ÷¸ò÷èêà â ñåðâèñíîì çàïðîñå "openList".
- Vision, WebVision:
- Ïîâûøåíî ðàçðåøåíèå êîîðäèíàò âñåõ âèäæåòîâ äî òð¸õ çíàêîâ ïîñëå çàïÿòîé ñ öåëüþ îáåñïå÷åíèÿ íîðìàëüíîãî ïîçèöèîíèðîâàíèÿ íà áîëüøèõ ìàñøòàáàõ.
- Èñïðàâëåí äîñòóï çà ãðàíèöó âåêòîðà ïðè îòðèñîâêå ãðàôèêîâ ïðèìèòèâà "FormEls".
- Èñïðàâëåíî îáíîâëåíèå èçîáðàæåíèÿ ïðèìèòèâà "Ýëåìåíòàðíàÿ ôèãóðà" ïðè èçìåíåíèè ìàñøòàáà.
- Èñïðàâëåíî îáíîâëåíèå ïðèìèòèâà "Ïðîòîêîë" ïî âðåìåíè è ðàçìåðó.
- Vision:
- Èñïðàâëåíî ïàäåíèå ñåàíñà äëÿ ïðîåêòîâ ñ ïåðèîäîì èñïîëíåíèÿ áîëåå 500 ìñ.
- Ðåàëèçîâàíà äîâîäêà êîîðäèíàò ôèãóð ïðèìèòèâà "Ýëåìåíòàðíàÿ ôèãóðà" ê îñòàòêó ïîëîæåíèÿ âèäæåòà.
- Ìàñøòàáèðîâàíèå òåêñòà ïðèìèòèâà "Òåêñò" èçìåíåíî íà èçìåíåíèå ðàçìåðà øðèôòà âìåñòî ìàñøòàáèðîâàíèÿ êîíå÷íîãî èçîáðàæåíèÿ, ÷òî ïîâûñèëî îáùåå êà÷åñòâî îòîáðàæåíèÿ øðèôòà.
- WebVision:
- Óäàëåíà ïðîâåðêà ïîïàäàíèÿ òî÷åê ôèãóð â îáëàñòü îòîáðàæåíèÿ ïðèìèòèâà "Ýëåìåíòàðíàÿ ôèãóðà". Äàííàÿ ôóíêöèÿ ïåðåëîæåíà íà áèáëèîòåêó GD.
- Èñêëþ÷åíà âîçìîæíîñòü ïàäåíèÿ äëÿ ïðèìèòèâîâ "Diagram" èëè "ElFigure" â ñëó÷àå ïåðåäà÷è íåêîððåêòíûõ çíà÷åíèé àòðèáóòîâ èçîáðàæåíèÿ "xSc" èëè "ySc" èç Web-áðàóçåðà.
- Èñïðàâëåíî îòêðûòèå è çàìåíà êîðíåâîé ñòðàíèöû.
- Èñïðàâëåíà îáðàáîòêà ìàñøòàáà âëîæåííûõ ñòðàíèö ñ ó÷¸òîì ìàñøòàáà êîðíåâîé.
- Èñïðàâëåíà î÷èñòêà õâîñòà ïðèìèòèâà "Ïðîòîêîë".
Îïòèìèçàöèÿ è ïîâûøåíèå ïðîèçâîäèòåëüíîñòè:
- SYS:
- Ìåõàíèçì ðåñóðñà îáúåêòà "ResString" çàìåí¸í ñ RW-áëîêèðîâîê íà ìþòåêñ ñ öåëüþ ïîâûñèòü ïðîèçâîäèòåëüíîñòü è ñîêðàòèòü ïîòðåáëåíèå ïàìÿòè.
- TConfig: Îáúåêò ýëåìåíòà êîíôèãóðàöèè (TCfg) îñíîâàí íà TVariant. Äîñòóï ê îáúåêòó "TCfg" ñäåëàí ïðîçðà÷íûì, ÷òî ïîçâîëÿåò èñïîëüçîâàòü ñâÿçè áåç áàçîâûõ òèïîâ.
- Ìåõàíèçì õðàíåíèÿ äî÷åðíèõ óçëîâ â êàðòå ïî êëþ÷ó "string" èçìåí¸í íà òèï êëþ÷à "const char*". Âñå óçëû àäàïòèðîâàíû ê êîíñòàíòíîñòè èäåíòèôèêàòîðà.
- Archive.FSArch: Îáðàáîòêà èíäåêñíîé òàáëèöû àðõèâà çíà÷åíèé çíà÷èòåëüíî óñêîðåíà ïîñðåäñòâîì èñïîëüçîâàíèÿ áûñòðîãî àëãîðèòìà âû÷èñëåíèÿ êîëè÷åñòâà áèòîâ â 32-ðàçðÿäíîì öåëîì.
- UI.WebCfgD:
- Äîáàâëåíî èçìåíåíèå ðàçìåðà èêîíîê íà ñòîðîíå ñåðâåðà ñ öåëüþ ñíèæåíèÿ òðàôèêà.
- Èñïîëüçîâàí ãðóïïîâîé çàïðîñ ñîäåðæèìîãî ñòðàíèö äëÿ çíà÷èòåëüíîãî ïîâûøåíèÿ ïðîèçâîäèòåëüíîñòè íà ìåäëåííûõ è âûñîêîëàòåíòíûõ êàíàëàõ.
- UI.QTCfg:
- Èñïîëüçîâàí ãðóïïîâîé çàïðîñ ê èíòåðôåéñó óïðàâëåíèÿ äëÿ ïîâûøåíèÿ ïðîèçâîäèòåëüíîñòè íà ìåäëåííûõ è âûñîêîëàòåíòíûõ ñîåäèíåíèÿõ.
- Èñêëþ÷¸í ìíîãîêðàòíûé çàïðîñ ýëåìåíòîâ âûáîðíûõ êîëîíîê òàáëèö.
- UI.Vision: Ïîâûøåíà ïðîèçâîäèòåëüíîñòü îòðèñîâêè çàïîëíåíèé ïðèìèòèâà "ElFigure".
- UI.VCAEngine:
- Âûïîëíåíû ìåðîïðèÿòèÿ ïî ïîâûøåíèþ ñêîðîñòè çàïóñêà ñåàíñà ïðîåêòà â ÷èñëå:
- Ïðîïóùåíà èíèöèàëèçàöèÿ áàçîâûõ àòðèáóòîâ ââèäó èõ ïîñëåäóþùåãî íàñëåäîâàíèÿ.
- Óäàëåí ïåðåâîä íåêîòîðûõ ñîîáùåíèé âðåìåíè èñïîëíåíèÿ ñåàíñà.
- Ðåàëèçîâàíî âêëþ÷åíèå òîëüêî íóæíûõ ñòðàíèö ïðè çàïóñêå ñåàíñà. Îñòàëüíûå ñòðàíèöû èñïîëíÿþùåãîñÿ ñåàíñà âêëþ÷àþòñÿ ïî ìåðå îáðàùåíèÿ ê íèì. Ýòî ïîçâîëèëî çíà÷èòåëüíî ïîâûñèòü ñêîðîñòü çàïóñêà ñåàíñà, à òàêæå óìåíüøèòü çàâèñèìîñòü ñêîðîñòè çàïóñêà îò ñëîæíîñòè ïðîåêòà âèçóàëèçàöèè.
- Ðåàëèçàöèÿ àðõèâíîãî ðåæèìà ïðèìèòèâà "Äîêóìåíò" èçìåíåíà íà ïðÿìóþ ðàáîòó ñ ÁÄ, ÷òî ïîçâîëèëî ðàñøèðèòü ãëóáèíó àðõèâà äî 1000000 äîêóìåíòîâ è áåç óùåðáà äëÿ îïåðàòèâíîé ïàìÿòè.
3 Óñîâåðøåíñòâîâàíèå è ñòàáèëèçàöèÿ ãðàôè÷åñêîé ïîäñèñòåìû
Çàìåòíàÿ ðàáîòà áûëà âûïîëíåíà â ðàìêàõ ãðàôè÷åñêîé ïîäñèñòåìû, à èìåííî â ìîäóëÿõ äâèæêà ÑÂÓ UI.VCAEngine, âèçóàëèçàòîðîâ UI.Vision è UI.WebVision, à òàêæå êîíôèãóðàòîðàõ. Âíåñ¸ííûå èçìåíåíèÿ áûëè íàïðàâëåííû íà ñòàáèëèçàöèþ, îïòèìèçàöèþ ïîòðåáëåíèÿ ïàìÿòè è óëó÷øåíèå ïîëüçîâàòåëüñêèõ ñâîéñòâ.
Óëó÷øåíèÿ ãðàôè÷åñêîé ïîäñèñòåìû:
- Äîáàâëåíî API ïîäñâåòêè ñèíòàêñèñà. Íà îñíîâå äàííîãî API ïîäñâåòêà ñèíòàêñèñà äîáàâëåíà â:
- DAQ:
- BlockCalc: Ïîäñâåòêà ñèíòàêñèñà â îïèñàíèè àòðèáóòîâ ïàðàìåòðîâ.
- JavaLikeCalc: Ïîäñâåòêà ñèíòàêñèñà ê êîìïèëÿòîðó ÿçûêà JavaLikeCalc.JavaScript, à òàêæå êî âñåì òåêñòîâûì ïîëÿì, èñïîëüçóþùèì ýòîò ÿçûê âíóòðè ìîäóëÿ.
- ModBus, OPC_UA: Ïîäñâåòêà ñèíòàêñèñà ñïèñêà àòðèáóòîâ.
- Protocol.UserProtocol: Ïîäñâåòêà ñèíòàêñèñà ê òåêñòàì ïðîöåäóð ïðîòîêîëà.
- UI:
- QTCfg: Îòîáðàæåíèå ìíîãîóðîâíåâîé ïîäñâåòêè ñèíòàêñèñà, ïåðåäàâàåìîé èç ìîäåëè äàííûõ â âèäå ïðàâèë ðåãóëÿðíûõ âûðàæåíèé.
- VCAEngine: Ïîäñâåòêà ñèíòàêñèñà ê òåêñòîâûì àòðèáóòàì ïðèìèòèâîâ âèäæåòà, äëÿ êîòîðûõ ýòî íóæíî.
- Vision: Ïîäñâåòêà ñèíòàêñèñà ê òåêñòîâûì àòðèáóòàì ïðèìèòèâîâ âèäæåòà, à òàêæå òåêñòàì ïðîãðàìì âèäæåòîâ.
- WebUser: Ïîäñâåòêà ñèíòàêñèñà ïðîöåäóð ôîðìèðîâàíèÿ Web-èíòåðôåéñà.
- UI.QTStarter:
- Àäàïòàöèÿ äëÿ ARM.
- Øðèôò ñîîáùåíèå â "ñïëåøå" çàôèêñèðîâàí â ðàçìåðå 10 ïèêñåëîâ äëÿ îáåñïå÷åíèÿ åäèíîîáðàçíîãî îòîáðàæåíèÿ.
- Ðåàëèçîâàí îñòàíîâ OpenSCADA â ñëó÷àå çàêðûòèÿ ïîñëåäíåãî îêíà äèàëîãà âûáîðà QT UI-ìîäóëåé.
- Ðåàëèçîâàí ïðîáðîñ ïàðàìåòðîâ êîìàíäíîé ñòðîêè QT4 èç OpenSCADA (íàïðèìåð, --qws è --style â -qws è -style).
- UI.QTCfg:
- Äîáàâëåíà âîçìîæíîñòü ðó÷íîãî èçìåíåíèÿ âûñîòû òåêñòîâûõ è òàáëè÷íûõ ïîëåé. Èçìåíåíèå îñóùåñòâëÿåòñÿ ñõâàòûâàíèåì è ïåðåòàñêèâàíèåì íèæíåãî êðàÿ ïîëÿ.
- Àäàïòàöèÿ äëÿ ARM.
- Ãðóïïîâîé çàïðîñ "CntrReqs" èñïîëüçîâàí äëÿ çàïðîñà êîíòåêñòà ñòðàíèöû.
- Äîáàâëåíî îãðàíè÷åíèå íà âûñîòó ñòðîê òàáëèö â ïîëîâèíó âûñîòû òàáëèöû.
- Ââåäåíî îãðàíè÷åíèå íà ðàçìåð äèàëîãà ââîäà è âêëþ÷åíî àäàïòèâíîå îïðåäåëåíèå åãî ðàçìåðà ïî ñîäåðæèìîìó.
- Ó ýëåìåíòîâ äîñòóïíûõ äëÿ èçìåíåíèÿ âûñîòû ïîëüçîâàòåëåì äëÿ îáåñïå÷åíèÿ ðàáîòû âåçäå óñòàíîâëåí ôèêñèðîâàííûé ñòèëü "StyledPanel".
- Äîáàâëåíà ôóíêöèÿ ïîëíîòåêñòîâîãî ðåäàêòèðîâàíèÿ òåêñòà ÿ÷ååê òàáëèö.
- Äâèæîê âîñïðîèçâåäåíèÿ ïðàâèë ïîäñâåòêè ñèíòàêñèñà ïîëíîñòüþ ïåðåïèñàí äëÿ óïðîùåíèÿ è ïðåäîòâðàùåíèÿ ñêðûòûõ îøèáîê.
- UI.{VCAEngine, Vision, WebVision}:
- Èñïðàâëåíî îáðàùåíèå çà ãðàíèöû ìàññèâà (âåêòîðà) ïðè ïîñòðîåíèè òðåíäîâ ïðèìèòèâà "Äèàãðàììà".
- Äîáàâëåíî è ðåàëèçîâàíî ñâîéñòâî øèðèíû ãðàôèêà ïðèìèòèâà "Äèàãðàììà".
- Äîáàâëåíà ïåðèîäè÷åñêàÿ ïðîâåðêà äåðåâà âèäæåòîâ ñòðàíèöû ñ öåëüþ îáíàðóæåíèÿ ôàêòà óäàëåíèÿ âèäæåòîâ ïóò¸ì çàïðîñà ïîëíîãî ïåðå÷íÿ âèäæåòîâ.
- Ðåàëèçîâàíî îòîáðàæåíèå ãðàôèêîâ ãðóïïû ãðàôèêîâ ïðèìèòèâà "Äèàãðàììà" â øêàëå çíà÷åíèÿ â ñëó÷àå îòëè÷èÿ øêàë âñåõ ãðàôèêîâ íå áîëåå ÷åì íà 20%.
- Äîáàâëåíà è ðåàëèçîâàíà âîçìîæíîñòü âûáîðà ðåæèìà ïîäòâåðæäåíèÿ äëÿ ýëåìåíòîâ ðåäàêòèðîâàíèÿ ñòðîêè è òåêñòà ïðèìèòèâà "Ýëåìåíòû ôîðìû".
- Èñïðàâëåíà âîçìîæíîñòü ïîòåðè íåêîòîðûõ èçìåíåíèé â ìîäåëè ïðè îòîáðàæåíèè èõ â âèçóàëèçàòîðàõ.
- Äîáàâëåíî è ðåàëèçîâàíî ñâîéñòâî êîëè÷åñòâà çíà÷åíèé íà ïèêñåë â ãðàôèêàõ ïðèìèòèâà "Äèàãðàììà" ñ öåëüþ óïðàâëåíèÿ äåòàëèçàöèåé ýêñïîðòà â CSV è ò.ä.
- Ðåàëèçîâàíà ëîãàðèôìè÷åñêàÿ øêàëà çíà÷åíèé äëÿ ãðàôèêîâ ïðèìèòèâà "Äèàãðàììà".
- Äîáàâëåíî è ðåàëèçîâàíî ñâîéñòâî ñîõðàíåíèÿ ñîîòíîøåíèÿ ñòîðîí ãëàâíîé ñòðàíèöû ïðè ðàçâîðà÷èâàíèè ãëàâíîãî îêíà èñïîëíåíèÿ ñåàíñà ïðîåêòà.
- Äîáàâëåí íîâûé òèï "Ïîëíîå Âèäåî" â ïðèìèòèâå "Ìåäèà". Äëÿ ðåàëèçàöèè â UI.Vision èñïîëüçîâàí ìåäèà-äâèæîê "Phonon".
- Äîáàâëåíî ïîëå ñâîéñòâ àðõèâà "prm{X}prop" â ïðèìèòèâå "Äèàãðàììà", êîòîðîå çàïîëíÿåòñÿ çíà÷åíèåì äîñòóïíîé ãëóáèíû è ïåðèîäè÷íîñòè àðõèâà.
- UI.VCAEngine:
- Äîáàâëåíû ñïåöèôè÷åñêèå ñâîéñòâà ê àòðèáóòàì ïðèìèòèâîâ âðîäå ïîìîùè è ïîäñâåòêè ñèíòàêñèñà.
- Ðåàëèçîâàíî âêëþ÷åíèå ñòðàíèö ñåàíñà ïðîåêòà ïî íàäîáíîñòè ñ öåëüþ ïîâûøåíèÿ ñêîðîñòè çàïóñêà è îïòèìèçàöèè èñïîëüçîâàíèÿ îïåðàòèâíîé ïàìÿòè.
- Ïðèìèòèâ "Äîêóìåíò" ïåðåäåëàí äëÿ âåäåíèÿ àðõèâîâ, àðõèâíîãî ðåæèìà ïîëíîñòüþ â ÁÄ, à òàêæå äîáàâëåíà ôóíêöèÿ ïîëüçîâàòåëüñêîãî API äëÿ äîñòóïà ê ýëåìåíòàì àðõèâà.
- Äîáàâëåíà ïåðèîäè÷åñêàÿ (30 ìèíóò) ïðîâåðêà è çàêðûòèå óæå íåèñïîëüçîâàííûõ (ïîòåðÿííûõ) ñåàíñîâ ïðîåêòîâ.
- Óäàë¸í ïðåäûäóùèé (ïðîòèâîðå÷èâûé) ìåõàíèçì îòêàòà óäàëåíèÿ âëîæåííûõ âèäæåòîâ è çàìåí¸í ïîëíîöåííûì ìåõàíèçìîì îòêàòîâ â âèçóàëèçàòîðå UI.Vision.
- Âûïîëíåíà îïòèìèçàöèÿ èñïîëüçîâàíèÿ ïàìÿòè ýëåìåíòàìè ñåàíñà äî 20%.
- Óäàëåíà ïîääåðæêà ïåðâîé, óñòàðåâøåé, âåðñèè ñòðóêòóðû ÁÄ ñðåäû âèçóàëèçàöèè.
- Äîáàâëåíî îãðàíè÷åíèå íà âðåìÿ ãåíåðàöèè äîêóìåíòîâ â ïðèìèòèâå "Äîêóìåíò" â 5 ñåêóíä.
- Äîáàâëåíà ïîääåðæêà òèïà àòðèáóòîâ "Îáúåêò" è "Òåêñò".
- Îòêëþ÷åíà ïðèíóäèòåëüíàÿ èíèöèàëèçàöèÿ íîâûõ ïîëüçîâàòåëüñêèõ àòðèáóòîâ â EVAL.
- Äîáàâëåíà êîíòåêñòíàÿ ïîäñêàçêà ê àòðèáóòàì ïðèìèòèâîâ âèäæåòîâ.
- Ïðèìèòèâ "Äîêóìåíò" ïåðåêëþ÷åí â ðåæèì ïîëíîãî ðàçáîðà XML ñ öåëüþ ïîëíîöåííîãî ñîõðàíåíèÿ ðàçìåòêè XHTML.
- Äîáàâëåíà èíäèêàöèÿ ñîñòîÿíèÿ êîððåêòíîñòè ññûëîê â âèäå "(+)" â êîíöå.
- Äîáàâëåíî ïåðåíàïðàâëåíèå íåîáðàáîòàííûõ ñîáûòèé ê ñòðàíèöå âûøå. Ýòî ïîçâîëÿåò ãëîáàëüíî îáðàáàòûâàòü ñîáûòèÿ íà ñàìîé âåðõíåé ñòðàíèöå.
- Äîáàâëåíà âîçìîæíîñòü óñòàíîâêè ñâÿçè ìåæäó âèäæåòàìè òèïà "wdg:" êàê â âèäå àáñîëþòíîé, òàê è îòíîñèòåëüíîé ôîðìû.
- Äîáàâëåíà ïîääåðæêà òèïà ñâÿçè "arh:".
- Äîáàâëåíà ïîääåðæêà îáúåêòíîãî òèïà ïàðàìåòðîâ èñòî÷íèêà äàííûõ.
- UI.Vision:
- Äîáàâëåíî îòîáðàæåíèå ïîìîùè ïî àòðèáóòàì âèäæåòà.
- Àäàïòàöèÿ äëÿ ARM.
- Äîáàâëåíà èíäèêàöèÿ ñîîáùåíèÿ î ïîòåðå ñîåäèíåíèÿ ñ ñåðâåðîì âèçóàëèçàöèè, à òàêæå âîññòàíîâëåíèå ïðè óäàë¸ííîé âèçóàëèçàöèè.
- Äîáàâëåí îòäåëüíûé ïîëíîòåêñòîâûé ðåäàêòîð äëÿ òåêñòîâûõ àòðèáóòîâ.
- Äîáàâëåíà ðåàëèçàöèÿ ïîëíîöåííûõ îòêàòîâ è ïîâòîðîâ èçìåíåíèé ïðè âèçóàëüíîì ðåäàêòèðîâàíèè âèäæåòîâ.
- Óëó÷øåíèÿ â îòçûâ÷èâîñòè è îáíîâëåíèè èçìåíåíèé â ñåàíñå èñïîëíåíèÿ ïðîåêòà: îïòèìèçèðîâàíà ïðîèçâîäèòåëüíîñòü îòðèñîâêè ïðèìèòèâà "ElFigure", îáðàáîòêà èçìåíåíèÿ óðîâíÿ âèäæåòà "geomZ".
- Äîáàâëåí ýêñïîðò â CSV ôîðìàò èç ïðèìèòèâîâ "Äèàãðàììà" è "Äîêóìåíò".
- Ââåäåíî îãðàíè÷åíèå íà ðàçìåð äèàëîãîâ ââîäà è âêëþ÷åíî àäàïòèâíîå îïðåäåëåíèå èõ ðàçìåðîâ ïî ñîäåðæèìîìó.
- Ïîëíîñòüþ ïåðåïèñàí ìåõàíèçì èñïîëíåíèÿ ïðàâèë ïîäñâåòêè ñèíòàêñèñà.
- Äîáàâëåíî ñîçäàíèå íîâîãî ñåàíñà ïîñëå âîññòàíîâëåíèÿ óäàë¸ííîãî ïîäêëþ÷åíèÿ è îòñóòñòâèè ïðåäûäóùåãî ñåàíñà.
- Ôîí îêíà ðåäàêòèðóåìîãî âèäæåòà óñòàíîâëåí â øàáëîí QT::Dense7Pattern ñ öåëüþ óñòðàíåíèÿ âîçìîæíîãî ïåðåêðûòèÿ ïî öâåòó.
- Äîáàâëåíà îáðàáîòêà ñîáûòèé âûáîðà âèäæåòà ïðè íàæàòèè â îáëàñòè ñêðîëèíãà, íî çà ïðåäåëàìè âèäæåòà.
- Ïðèìèòèâ "Ýëåìåíòàðíàÿ ôèãóðà":
- Äîáàâëåí äèàëîã óñòàíîâêè ñâîéñòâ îòäåëüíî âûáðàííûõ ôèãóð.
- Âûïîëíåíà ðåîðãàíèçàöèÿ îïåðàöèé èç äèàëîãà ñâîéñòâ è êîíòåêñòíîãî ìåíþ ñ äèíàìè÷åñêèìè è ñòàòè÷åñêèìè ñâîéñòâàìè.
-  ïðîöåññå äîáàâëåíèÿ ôèãóðû ðåàëèçîâàíà å¸ îòðèñîâêà ïðè ïåðåìåùåíèè êóðñîðà ìûøè.
- UI.WebVision:
- Äîáàâëåíà ïîääåðæêà gif è jpg èçîáðàæåíèé â ýëåìåíòàõ ïðèìèòèâà "Ýëåìåíòàðíàÿ ôèãóðà".
- Èñïðàâëåíà îáðàáîòêà ìàñøòàáà âëîæåííûõ êàäðîâ, à òàêæå ïåðåñìîòðåí ìåõàíèçì ôîðìèðîâàíèÿ-âêëþ÷åíèÿ ñêðîëà.
- Äîáàâëåíà ôóíêöèÿ ïðåîáðàçîâàíèÿ èçîáðàæåíèé íà ñòîðîíå ñåðâåðà. Ôóíêöèþ ïðåîáðàçîâàíèÿ èñïîëüçîâàíî äëÿ èçìåíåíèÿ ðàçìåðà è îáåñöâå÷èâàíèÿ èçîáðàæåíèé íåàêòèâíûõ êíîïîê.
- Ðåàëèçîâàíî îòêðûòèå ìàëûõ îêîí âëîæåííûõ ñòðàíèö â âèäå DIV-áëîêîâ, ÷òî ðåøàåò ïðîáëåìó áëîêèðîâêè è ïðîäîëæèòåëüíîãî îòêðûòèÿ âíåøíèõ îêîí ìíîãèìè áðàóçåðàìè.
- Ãëàâíàÿ ñòðàíèöà èíòåðôåéñà îòöåíòðîâàíà â îêíå áðàóçåðà.
- UI.WebCfgD:
- Óìåíüøåíà ÿðêîñòü îáåñöâå÷åííûõ-ïàññèâíûõ êíîïîê.
- Âñå îêíà äèàëîãîâ ðåàëèçîâàíû â âèäå DIV-áëîêîâ ñ öåëüþ èñêëþ÷èòü ïðîáëåìû è çàäåðæêè â îòêðûòèè âíåøíèõ îêîí ðàçëè÷íûìè áðàóçåðàìè.
- Èñïîëüçîâàí ãðóïïîâîé çàïðîñ ñîäåðæèìîãî ñòðàíèö äëÿ çíà÷èòåëüíîãî ïîâûøåíèÿ ïðîèçâîäèòåëüíîñòè íà ìåäëåííûõ è âûñîêîëàòåíòíûõ êàíàëàõ.
- Äîáàâëåíà èíôîðìàöèÿ â ñòðîêå ñòàòóñà î òåêóùåì ïîëüçîâàòåëå è âîçìîæíîñòü åãî ñìåíû.
- Âûïîëíåíà àäàïòàöèÿ äëÿ ðàáîòû â ïîëíóþ øèðèíó ýêðàíà.
4 Ôîðìèðîâàíèå, ðàñøèðåíèå è ñòàáèëèçàöèÿ API ïîëüçîâàòåëüñêîãî ïðîãðàììèðîâàíèÿ
Áûëî ïðîäîëæåíî ôîðìèðîâàíèå îáúåêòíîãî API ïîëüçîâàòåëüñêîãî ïðîãðàììèðîâàíèÿ, êîòîðîå ïðåäóñìàòðèâàåò èíòåãðàöèþ ïîëüçîâàòåëüñêèõ ôóíêöèé â äåðåâî îáúåêòîâ ñèñòåìû OpenSCADA. Êðîìå ýòîãî áûë âíåñåí ðÿä èçìåíåíèé â ñóùåñòâóþùèå áèáëèîòåêè ôóíêöèé ïîëüçîâàòåëüñêîãî API.
 ÷àñòíîñòè áûëè îñóùåñòâëåíû ñëåäóþùèå èçìåíåíèÿ:
- SYS:
- Ïîëüçîâàòåëüñêîå API äëÿ îáúåêòà TArrayObj ðàñøèðåíî íà ïðåäìåò âîçìîæíîñòè èñïîëüçîâàíèÿ îáúåêòíûõ ñâîéñòâ, åñëè ñâîéñòâà - íå ÷èñëà.
- Â äåðåâî îáúåêòîâ OpenSCADA ïîëüçîâàòåëüñêîãî API äîáàâëåíà ôóíêöèÿ SYS.Security.access() äëÿ êîíòðîëÿ äîñòóïà ïîëüçîâàòåëÿ OpenSCADA ê ðåñóðñàì ñ íóæíûìè ïðàâàìè.
- Äîáàâëåíû ôóíêöèè ðàáîòû ñ ôàéëàìè: SYS.fileRead() è SYS.fileWrite().
- Ê API îáúåêòà "XMLNodeObj" äîáàâëåíà ôóíêöèÿ getElementBy() äëÿ ïîèñêà âëîæåííûõ óçëîâ ïî çíà÷åíèþ àòðèáóòà.
- Äîáàâëåíà ôóíêöèÿ îñóùåñòâëåíèÿ êîäèðîâàíèÿ òåêñòà ìåæäó ðàçëè÷íûìè ñèìâîëüíûìè êîäèðîâêàìè.
- Äîáàâëåíà ôóíêöèÿ NodeObj.nodePath().
- 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).
- TConfig, TBD, TTransportIn, TTransportOut, TUser, TGroup, TPrmTmplLib, TPrmTempl, TParamContr, TController, TVArchive, TVArchivator, TMArchivator: Äîáàâëåíû ôóíêöèè ïîëüçîâàòåëüñêîãî API cfg() è cfgSet() äëÿ äîñòóïà ê êîíôèãóðàöèè îáúåêòîâ (õðàíÿùåéñÿ â ÁÄ).
- TFunction, DAQ.JavaLikeCalc: Äîáàâëåí îáúåêò ïîëüçîâàòåëüñêîãî API "TFuncArgObj" äëÿ ïîëó÷åíèÿ àðãóìåíòîâ ôóíêöèè.
- DB: Äîáàâëåíû ôóíêöèè ïîëüçîâàòåëüñêîãî API fieldStruct(), fieldSeek(), fieldGet(), fieldSet() è fieldDel() äëÿ îáúåêòà òàáëèöû, ñ öåëüþ ïðåäîñòàâèòü ïîëüçîâàòåëüñêèé äîñòóï ê ÁÄ ïîñðåäñòâîì èíòåðôåéñà ÁÄ OpenSCADA.
- DAQ:
- Äîáàâëåíà ôóíêöèÿ TController::alarmSet() äëÿ ãåíåðàöèè òèïîâûõ íàðóøåíèé â îáúåêòå êîíòðîëëåðà ìîäóëåé ïîäñèñòåìû "Ñáîð äàííûõ".
- Äîáàâëåíà ôóíêöèÿ SYS.DAQ["Modul"]["Controller"]["Parameter"]["Attribute"].arch() äëÿ ïðÿìîãî îáðàùåíèÿ ê îáúåêòó àðõèâà, ñâÿçàííîãî ñ àòðèáóòîì ïàðàìåòðà.
- Äîáàâëåíû ôóíêöèè ïîëüçîâàòåëüñêîãî API enable() è start() äëÿ ïðÿìîãî êîíòðîëÿ çà ñîñòîÿíèåì îáúåêòà êîíòðîëëåðà.
- JavaLikeCalc:
- Äîáàâëåíà âñòðîåííàÿ ôóíêöèÿ typeof() äëÿ ïðîâåðêè òèïà çíà÷åíèÿ.
- Äëÿ òèïà äàííûõ "null" äîáàâëåíà ôóíêöèÿ isEVal(), êîòîðàÿ âñåãäà âîçâðàùàåò "true".
- Ê îáúåêòàì áèáëèîòå÷íûõ ôóíêöèé äîáàâëåíà ôóíêöèÿ ïîëüçîâàòåëüñêîãî API call().
- ModBus: Äîáàâëåíà ôóíêöèÿ ïîëüçîâàòåëüñêîãî API messIO() â îáúåêò êîíòðîëëåðà "ModBus" ñ öåëüþ ïðåäîñòàâëåíèÿ âîçìîæíîñòè îòïðàâêè íåñòàíäàðòíûõ ModBus-çàïðîñîâ ïðÿìî èç øàáëîíà ïàðàìåòðà.
- DAQ.JavaLikeCalc, Special.{FLibComplex1, FLibMath, FLibSYS}: Äîáàâëåíà ôóíêöèÿ äèíàìè÷åñêîãî âûçîâà áèáëèîòå÷íûõ ôóíêöèé SYS.DAQ.JavaLikeCalc["lib_{Lib}"].funcId(prms, ...).
- Archive: Äîáàâëåíû ôóíêöèè ïîëüçîâàòåëüñêîãî API status(), end() è begin() äëÿ äîñòóïà ê ñîñòîÿíèþ è ñâîéñòâàì îáúåêòà àðõèâàòîðà ñîîáùåíèé.
- UI.VCAEngine: Äîáàâëåíà ôóíêöèÿ ïîëüçîâàòåëüñêîãî API wdgAt() äëÿ ïðîñòîãî ïîäêëþ÷åíèÿ ê âèäæåòó êàê ïî àáñîëþòíîìó, òàê è îòíîñèòåëüíîìó ïóòè.
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, à òàêæå áåçîïàñíîé îáðàáîòêè ñèòóàöèè íàëè÷èÿ íåäîïóñòèìûõ äëÿ òåêóùåé êîäèðîâêè ñèìâîëîâ.
- TMess: Îáùèå ñîîáùåíèÿ èíòåðôåéñà óïðàâëåíèÿ ïåðåìåùåíû â îäíó ôóíêöèþ TMess::lab*.
- Îáúåêò õðàíåíèÿ ñòðîêè ñ ðåñóðñîì "ResString" çíà÷èòåëüíî ðàñøèðåí íà ïðåäìåò ïðîçðà÷íîãî ïðåîáðàçîâàíèÿ èç/â òèï "std::string".
- Äîáàâëåíà âîçìîæíîñòü ñîõðàíåíèÿ â êîíôèãóðàöèîííûé ôàéë:
- Äîáàâëåí ïðåôèêñ ÁÄ "<cfg>" äëÿ ïðåäñòàâëåíèÿ êîíôèãóðàöèîííîãî ôàéëà â ðîëè èñòî÷íèêà çàãðóçêè/ñîõðàíåíèÿ êîíôèãóðàöèè.
- Ôóíêöèè TDBS::dataSeek() è TDBS::dataDel() îáíîâëåíû äëÿ ñòðîãîé îáðàáîòêè êîíôèãóðàöèîííîãî ôàéëà.
- Ôóíêöèÿ chkSelDB() àäàïòèðîâàíà äëÿ ïîääåðæêè çàïèñè â êîíôèãóðàöèîííûé ôàéë.
- Äîáàâëåíî ñîõðàíåíèå áîëüøèõ è ìíîãîñòðî÷íûõ çíà÷åíèé ïîëåé êîíôèãóðàöèè â òåêñòîâîì ïîëå îòäåëüíîãî òåãà êîíôèãóðàöèîííîãî ôàéëà.
- Òèï "long long", îáû÷íî 64-ðÿçðÿäíîå öåëîå, çàìåí¸í âåçäå íà áîëåå îïðåäåë¸ííûé "int64_t" íà âñåõ àðõèòåêòóðàõ.
- Îáúåêòû ïîòîêîâ OpenSCADA æ¸ñòêî ñëèíêîâàíû ñî ñâîèì ïîòîêîì. Äîáàâëåíà ñòàòèñòèêà çàãðóçêè è âûçîâîâ ïåðèîäè÷íûõ ïîòîêîâ.
- Ðåàëèçîâàíà âîçìîæíîñòü ïðîâåðêè çàãðóæåííûõ îáúåêòîâ íà èõ îòñóòñòâèå â ÁÄ è óäàëåíèå. Ôóíêöèÿ ïðîâåðêè àêòèâèðóåòñÿ òîëüêî â ñëó÷àå ïðÿìîé çàãðóçêè èç ÁÄ.
- Äîáàâëåíà ñèñòåìíàÿ ïåðèîäè÷åñêàÿ ôóíêöèÿ perSYSCall() âûçîâà îáúåêòîâ ïîäñèñòåì è èõ ìîäóëåé. Èñïîëüçóåòñÿ äëÿ ñåðâèñíûõ öåëåé íåíàãðóæåííûõ è ðåäêèõ çàäà÷ ìîäóëåé è ïîäñèñòåì.
- Ôóíêöèÿ òåñòèðîâàíèÿ âûðàæåíèÿ ïî øàáëîíó ïåðåìåùåíà â îáúåêò "TRegExp".
- XMLNode:
- Ïîëíîñòüþ óäàë¸í êîä èñïîëüçîâàíèÿ XML-ïàðñåðà "Expat".
- Äîáàâëåíà âîçìîæíîñòü çàãðóçêè òåêñòîâûõ ÷àñòåé òåãà â îòäåëüíûå ñïåöèàëüíûå òåãè â ïîëíîì ðåæèìå. Ïðåäíàçíà÷åíî äëÿ ïîëíîãî ñîõðàíåíèÿ êîíôèãóðàöèè òåãà.
- Äîáàâëåíà âîçìîæíîñòü çàãðóçêè è ñîõðàíåíèÿ áëîêîâ êîììåíòàðèåâ â îòäåëüíûå ñïåöèàëüíûå òåãè, â ïîëíîì ðåæèìå.
- Äîáàâëåíà âñòðîåííàÿ ôóíêöèÿ âêëþ÷åíèÿ ãåíåðàöèè äàìïà ïàìÿòè (ñíÿòèÿ îãðàíè÷åíèÿ íà ðàçìåð ôàéëà) ïîñðåäñòâîì ïàðàìåòðà çàïóñêà OpenSCADA --CoreDumpAllow.
- Âî âñå ñêðèïòû çàïóñêà OpenSCADA äîáàâëåíà ïðîöåäóðà àâòîìàòè÷åñêîé îáðàáîòêè ôàéëà äàìïà ïàìÿòè (ôîðìèðîâàíèå ôàéëà ðàçâîðîòà ñòåêà — backtrace). Ôàéë äàìïà ïàìÿòè îæèäàåòñÿ â ðàáî÷åé äèðåêòîðèè â âèäå "core".
- Äîáàâëåíà âîçìîæíîñòü âêëþ÷åíèÿ (âñòðàèâàíèÿ) ìîäóëåé â áèáëèîòåêó ÿäðà OpenSCADA.
- Âåðñèÿ ìîäóëüíîãî API âñåõ ïîäñèñòåì óâåëè÷åíà äî 6.
- TConfig, TValFunc, TVal: Õðàíåíèå ñòðîêîâûõ êîíôèãóðàöèîííûõ ïîëåé ïåðåâåäåíî â îáúåêò ðåñóðñíîé ñòðîêè "ResString", à çàòåì âîçâðàùåíî ñ èñïîëüçîâàíèåì âíóòðåííåãî ðåñóðñà.
- TVariant: Ìåõàíèçì õðàíåíèÿ äëÿ ñòðîêè èçìåí¸í â õðàíåíèå óêàçàòåëÿ íà ìàññèâ â "union" ñ àäàïòèâíûì ìåõàíèçìîì âûäåëåíèÿ ïàìÿòè (ïðîñòàÿ, âïëîòü äî 7 ñèìâîëîâ õðàíèòñÿ ñòàòè÷åñêè, à ïîä áîëåå ïàìÿòü âûäåëÿåòñÿ äèíàìè÷åñêè).
- Ñáîðî÷íàÿ ñèñòåìà áûëà çíà÷èòåëüíî îáíîâëåíà íà ïðåäìåò:
- Äîáàâëåíà ïðîâåðêà è îòêëþ÷åíèå èñïîëüçîâàíèÿ "Iconv" è "Intl" (I18N) API.
- Äîáàâëåíî àâòîìàòè÷åñêîå îáíàðóæåíèå è âêëþ÷åíèå ïàðàìåòðà êîíôèãóðàöèè --enable-CrossCompile äëÿ îêðóæåíèÿ êðîññ-êîìïèëÿöèè.
- Äîáàâëåí ïàðàìåòð êîíôèãóðàöèè --enable-CoreLibStatic äëÿ îòêëþ÷åíèÿ ñáîðêè ðàçäåëÿåìîé áèáëèîòåêè ÿäðà OpenSCADA è ñòàòè÷åñêîé ëèíêîâêè ïðîãðàììû âûçîâà-çàïóñêà.
- Äîáàâëåíà ñâîäíàÿ òàáëèöà êîíôèãóðàöèè, â êîíöå.
- Ïåðåìåùåíèå êîäà îáðàáîòêè I18N â ôàéë I18N.mk è âêëþ÷åíèå åãî íåïîñðåäñòâåííî â Make-ôàéëû, ïî íàäîáíîñòè, íà ïîñëåäíåé ñòàäèè êîíôèãóðàöèè.
- Äîáàâëåí îáùèé ìàêðîñ AX_MOD_EN() äëÿ óíèôèöèðîâàííîãî êîíòðîëÿ ìîäóëåé.
- Äîáàâëåíà óñòàíîâêà âêëþ÷àåìûõ ôàéëîâ (çàãîëîâêè).
- Äîáàâëåí ôàéë openscada.pc äëÿ ïðîâåðêè êîíôèãóðàöèè OpenSCADA ïðè ïîñòðîåíèè âíåøíèõ ìîäóëåé.
- Ãëîáàëüíàÿ âåðñèÿ èñõîäíûõ ôàéëîâ OpenSCADA èçìåíåíà â 0.8.0 è âåðñèÿ áèáëèîòåêè ÿäðà OpenSCADA èçìåíåíà â 2.0.0.
- Ðåàëèçàöèÿ ìàíèïóëÿöèè îáúåêòàìè ÷åðåç àòðèáóòû ïàðàìåòðîâ:
- Ðåàëèçîâàíà îáùàÿ ïîòî÷íàÿ áåçîïàñíîñòü (threadsafe) äëÿ îáúåêòîâ ïîëüçîâàòåëüñêîãî API: "TVarObj", "TArrayObj" è "XMLNodeObj". Äîáàâëåíî àâòîìàòè÷åñêîå óäàëåíèå îáúåêòà â "AutoHD" ïðè âîçâðàòå ôóíêöèåé AHDDisConnect() — "true".
- Äîáàâëåíà îáðàòíàÿ ñåðèàëèçàöèÿ (ðàçáîð XML ïðåäñòàâëåíèÿ îáúåêòà) äëÿ îáúåêòîâ "TVarObj", "TArrayObj" è "XMLNodeObj". Âêëþ÷åíî äëÿ "TVariant", "TVal", "TValFunc", "UI.VCAEngine.Widget", ÷òî ïîçâîëÿåò ñîõðàíÿòü è çàãðóæàòü çíà÷åíèÿ òèïà Îáúåêò â ÁÄ.
- TVal, DAQ.{BlockCalc,JavaLikeCalc,LogicLev,ModBus,Siemens}, UI.VCAEngine: Äîáàâëåíà ïîääåðæêà òèïà çíà÷åíèÿ "Îáúåêò". Âêëþ÷åíî äëÿ ïîâñåìåñòíîãî èñïîëüçîâàíèÿ.
- DOC:
- Âûïîëíåíà ïðîâåðêà è èñïðàâëåíèå Àíãëèéñêèõ òåêñòîâ â ÿäðå OpenSCADA. Îáíîâëåíû ïåðåâîäû ÿäðà OpenSCADA íà Íåìåöêèé, Ðóññêèé è Óêðàèíñêèé ÿçûêè.
- Âûïîëíåíà ïðîâåðêà è èñïðàâëåíèå Àíãëèéñêèõ òåêñòîâ ìîäóëåé OpenSCADA. Îáíîâëåíû ïåðåâîäû ìîäóëåé OpenSCADA íà Íåìåöêèé, Ðóññêèé è Óêðàèíñêèé ÿçûêè.
- Îáíîâëåíû âñå îñíîâíûå äîêóìåíòû íà äîñòóïíûõ ÿçûêàõ: openscada.pdf, build.pdf, properties.pdf, "OpenSCADA API", "Ïðî OpenSCADA", "Áèáëèîòåêà TechApp", "Quick Start", "WLib Îñíîâíûå", "WLib Ýëåìåíòû ìíåìîñõåì".
- Áàçû äàííûõ áèáëèîòåê:
- Â áèáëèîòåêó îñíîâíûõ âèçóàëüíûõ ýëåìåíòîâ äîáàâëåíî:
- Êàäðû ðåàëèçàöèè ðåäàêòèðîâàíèÿ è èñïîëíåíèÿ "Ðåöåïòîâ" — "Ïîëüçîâàòåëüñêèõ ïðîãðàìì".
- Äèàëîã âûáîðà è êîíôèãóðàöèè ïàðàìåòðîâ äëÿ êàäðà "Ãðóïïà Ãðàôèêîâ".
- Äîáàâëåíû íåêîòîðûå óëó÷øåíèÿ â êàäð "Ãðóïïà Ãðàôèêîâ" äëÿ âûáîðà ïàðàìåòðîâ ïîëüçîâàòåëåì è äðóãîãî.
- Â êàäð "Ãðóïïà Ãðàôèêîâ" äîáàâëåí ãîðèçîíòàëüíûé ñêðîë-áàð îáçîðà àðõèâîâ.
- Ê êîìïëåêòó ïàêåòà áèáëèîòåê äîáàâëåíî áèáëèîòåêó ýëåìåíòîâ Ýëåêòðè÷åñêèõ ñõåì.
- Êàäð ãëàâíîé ñòðàíèöû äîïîëíåí ìåõàíèçìîì "ïðîèãðûâàíèÿ" ìîäåëåé òåõíîëîãè÷åñêèõ ïðîöåññîâ (ÒÏ).
- Ìîäåëü ïðîìûøëåííîãî êîòëîàãðåãàòà ïåðåâåäåíî íà Àíãëèéñêèé è Óêðàèíñêèé ÿçûêè.
- DB: Äîáàâëåíî âðåìåííîå îãðàíè÷åíèå â 5 ñåêóíä è ïîëå óêàçàíèÿ íà÷àëüíîãî ñìåùåíèÿ äëÿ çàïðîñà ñîäåðæèìîãî áîëüøèõ òàáëèö.
- Transport:
- Äîáàâëåíà ôóíêöèÿ TTransportS::traf2str() äëÿ ïðåîáðàçîâàíèÿ çíà÷åíèÿ ñ÷¸ò÷èêà òðàôèêà â ñòðîêó âðîäå "12.5ÊèÁ".
- Òèïû ôîðìàòîâ èñõîäÿùèõ çàïðîñîâ ðàñøèðåíû âàðèàíòàìè òåêñòà ñ ðàçíûì çàâåðøåíèåì ñòðîêè: LF, CR, CR/LF.
- DAQ:
- Äîáàâëåíà âîçìîæíîñòü âûáîðà òèïà àòðèáóòà øàáëîíà "Îáúåêò".
- DiamondBoards, ModBus, LogicLev: Äîáàâëåíà âîçìîæíîñòü ñìåíû òèïà ïàðàìåòðà äëÿ îòêëþ÷åííûõ ïàðàìåòðîâ ìíîãîòèïîâûõ ìîäóëåé ïîäñèñòåìû "Ñáîð äàííûõ".
- LogicLev, ModBus, Siemens:
-  ñëó÷àå âûïîëíåíèÿ ïî ðàñïèñàíèþ â àòðèáóò "f_frq" çàïèñûâàåòñÿ âðåìÿ ïîñëå ïîñëåäíåãî âû÷èñëåíèÿ â îòðèöàòåëüíîì çíà÷åíèè.
- Äîáàâëåíû èíèöèàëèçèðóþùèå è îñòàíàâëèâàþùèå âûçîâû ïðè âêëþ÷åíèè/âûêëþ÷åíèè ïàðàìåòðà.
- Äîáàâëåíî îáíîâëåíèå àòðèáóòîâ ïàðàìåòðà ëîãè÷åñêîãî òèïà ïðè èçìåíåíèè òèïà, ôëàãà "Òîëüêî×òåíèå" èëè èìåíè â øàáëîíå.
- TArchives:
- Äîáàâëåíà âîçìîæíîñòü èñïîëüçîâàíèÿ ðåãóëÿðíûõ âûðàæåíèé ïðè ïîèñêå ïî êàòåãîðèè ïîñðåäñòâîì "/match/"
- DBArch, FSArch: Äîáàâëåíà âðåìåííàÿ ãðàíèöà ïðè çàïðîñå ñîîáùåíèé èç àðõèâà.
- Àäðåñ ññûëêè íà àòðèáóò ïàðàìåòðà óïðîù¸í ê âèäó "DAQMod.Cntr.Prm.attr". Ïîääåðæêà ñòàðûõ àäðåñîâ ñîõðàíåíà.
6 Ïóáëèêàöèÿ ðåøåíèé OpenSCADA
 ïðîöåññå îñóùåñòâëåíèÿ ðàáîò íàä äàííûì ðåëèçîì íà ðàçíûõ êîíôåðåíöèÿõ è âûñòàâêàõ áûëè ïðåäñòàâëåíû ðåøåíèÿ íà îñíîâå ïðîåêòà OpenSCADA:
Çàêëþ÷åíèå
 ïðîöåññå ñîçäàíèÿ íîâîãî ñòàáèëüíîãî ðåëèçà 0.8.0 ïðîìûøëåííîãî íàçíà÷åíèÿ ñ ïðîäîëæèòåëüíûì ñðîêîì ïîääåðæêè ïðîäåëàíà áîëüøàÿ ðàáîòà ïî ñòàáèëèçàöèè, ðàñøèðåíèþ ôóíêöèîíàëüíûõ âîçìîæíîñòåé, à òàêæå àäàïòàöèè äëÿ ðàáîòû íà àëüòåðíàòèâíûõ àïïàðàòíûõ ïëàòôîðìàõ (íà àðõèòåêòóðå ARM). Âñ¸ ýòî â öåëîì ïîçâîëèëî ðàñøèðèòü ðàìêè ïîëíîöåííîãî ïðèìåíåíèÿ OpenSCADA íà âñå óðîâíè ñèñòåì àâòîìàòèçàöèè îò ÏËÊ, ñåðâåðîâ SCADA-ñèñòåì è äî ðàñïðåäåë¸ííûõ ñèñòåì âèçóàëèçàöèè.
 ïîÿâëåíèè íîâîé ïðîìûøëåííîé âåðñèè ñèñòåìû OpenSCADA 0.8.0 àêòèâíîå ó÷àñòèå ïðèíÿëè:
- Ñàâî÷åíêî Ðîìàí: Îñíîâíîé îáú¸ì ðàáîò ïî ðàçðàáîòêå, äîêóìåíòèðîâàíèþ è òåñòèðîâàíèþ.
- Ëûñåíêî Ìàêñèì: Ñîïðîâîæäåíèå è ñòàáèëèçàöèÿ ïðèìèòèâà "Ýëåìåíòàðíàÿ ôèãóðà" ñðåäû âèçóàëèçàöèè è óïðàâëåíèÿ (ÑÂÓ) è ïåðåâîä è îáíîâëåíèå áîëüøåé ÷àñòè äîêóìåíòàöèè íà Àíãëèéñêèé ÿçûê.
- Ïîïêîâà Èðèíà: Ïåðåâîä è îáíîâëåíèå èíòåðôåéñà ñèñòåìû OpenSCADA è å¸ ìîäóëåé íà Íåìåöêèé ÿçûê.
- Àëìàç Êàðèìîâ: Ðàñøèðåíèå ìîäóëÿ ïîääåðæêè ïðîòîêîëà DCON è àêòèâíîå òåñòèðîâàíèå.
- Ïîïêîâ Àëåêñåé?: Ñáîðêà ïàêåòîâ äëÿ Fedora-based äèñòðèáóòèâîâ.
- Ìíîãèå äðóãèå ïîëüçîâàòåëè ñèñòåìû OpenSCADA ïîñðåäñòâîì âñåñòîðîííåãî òåñòèðîâàíèÿ.
Ïîñëåäóþùèå óñèëèÿ ðàçðàáîòêè áóäóò íàïðàâëåíû íà ðåàëèçàöèþ ïðîãðàììíîé ìíîãîïëàòôîðìåííîñòè, à òàêæå ðàñøèðåíèå ôóíêöèîíàëüíîñòè ïóò¸ì ñîçäàíèÿ ìîäóëåé ïîääåðæêè íîâûõ èíòåðôåéñîâ, â òîì ÷èñëå è ïî ñõåìå àâàíñèðîâàííîé ðàçðàáîòêè, ñ ðàñïðåäåëåíèåì çàòðàò íà ðåàëèçàöèþ íà ïðîäàííûå ýêçåìïëÿðû (äëÿ ìîäóëåé âçàèìîäåéñòâóþùèõ ñ êîììåð÷åñêèìè ñèñòåìàìè è èíòåðôåéñàìè). Äëÿ ðåàëèçàöèè öåíòðàëèçîâàííîãî ðàñïðîñòðàíåíèÿ ðåøåíèé, óñëóã è ðàñøèðåíèé íà îñíîâå OpenSCADA ïëàíèðóåòñÿ ñîçäàíèå ìàãàçèíà â ðàìêàõ ãëàâíîãî èíôîðìàöèîííîãî ðåñóðñà OpenSCADA (
http://oscada.org ).
Ññûëêè
Ïðîòîêîë òåñòèðîâàíèÿ ïðîìûøëåííîãî ðåëèçà: http://wiki.oscada.org/Works/Tests/release080