This is an old revision of
Doc/ModBus from 2015-11-13 09:13:58..
Ìîäóëè <ModBus> ïîäñèñòåì "Ñáîð äàííûõ" è "Òðàíñïîðòíûå ïðîòîêîëû"
Ïàðàìåòð | Ìîäóëü 1 | Ìîäóëü 2 |
ID: | ModBus |
Èìÿ: | ModBus |
Òèï: | DAQ | Ïðîòîêîë |
Èñòî÷íèê: | daq_ModBus.so |
Âåðñèÿ: | 1.8.0 | 1.0.0 |
Àâòîð: | Ðîìàí Ñàâî÷åíêî |
Îïèñàíèå: | Ïðåäîñòàâëÿåò ðåàëèçàöèþ êëèåíòñêîãî ñåðâèñà ïðîòîêîëà ModBus. Ïîääåðæèâàþòñÿ ModBus/TCP, ModBus/RTU è ModBus/ASCII ïðîòîêîëû. | Ïðåäîñòàâëÿåò ðåàëèçàöèþ ïðîòîêîëîâ ModBus. Ïîääåðæèâàþòñÿ ModBus/TCP, ModBus/RTU è ModBus/ASCII ïðîòîêîëû. |
Ëèöåíçèÿ: | GPL |
Ââåäåíèå
ModBus — êîììóíèêàöèîííûé ïðîòîêîë, îñíîâàííûé íà êëèåíò-ñåðâåðíîé àðõèòåêòóðå. Ðàçðàáîòàí ôèðìîé Modicon äëÿ èñïîëüçîâàíèÿ â êîíòðîëëåðàõ ñ ïðîãðàììèðóåìîé ëîãèêîé (PLC). Ñòàë ñòàíäàðòîì äå-ôàêòî â ïðîìûøëåííîñòè è øèðîêî ïðèìåíÿåòñÿ äëÿ îðãàíèçàöèè ñâÿçè ïðîìûøëåííîãî ýëåêòðîííîãî îáîðóäîâàíèÿ. Èñïîëüçóåò äëÿ ïåðåäà÷è äàííûõ ÷åðåç ïîñëåäîâàòåëüíûå ëèíèè ñâÿçè RS-485, RS-422, RS-232, à òàêæå ñåòè TCP/IP.  íàñòîÿùåå âðåìÿ ïîääåðæèâàåòñÿ íåêîììåð÷åñêîé îðãàíèçàöèåé ModBus-IDA.
Ñóùåñòâóþò òðè ðåæèìà ïðîòîêîëà: ModBus/RTU, ModBus/ASCII è ModBus/TCP. Ïåðâûå äâà èñïîëüçóþò ïîñëåäîâàòåëüíûå ëèíèè ñâÿçè (â îñíîâíîì RS-485, ðåæå RS-422/RS-232), ïîñëåäíèé èñïîëüçóåò äëÿ ïåðåäà÷è äàííûõ ñåòè TCP/IP.
Ìîäóëü ñáîðà äàííûõ ïðåäîñòàâëÿåò âîçìîæíîñòü ñîáèðàòü èíôîðìàöèþ ó ðàçëè÷íûõ óñòðîéñòâ ïî ïðîòîêîëó ModBus âî âñåõ ðåæèìàõ. Òàêæå ìîäóëåì ðåàëèçóþòñÿ ôóíêöèè ãîðèçîíòàëüíîãî ðåçåðâèðîâàíèÿ, à èìåííî ñîâìåñòíîé ðàáîòû ñ óäàë¸ííîé ñòàíöèåé ýòîãî-æå óðîâíÿ.  òî æå âðåìÿ ìîäóëü ïðîòîêîëà ïîçâîëÿåò ñôîðìèðîâàòü è âûäàòü äàííûå ïî ïðîòîêîëó ModBus â ðàçëè÷íûõ ðåæèìàõ è ÷åðåç èíòåðôåéñû, ïîääåðæèâàåìûå ìîäóëÿìè ïîäñèñòåìû "Òðàíñïîðòû".
1. Îáùåå îïèñàíèå ïðîòîêîëà ModBus
Ïðîòîêîë ModBus/RTU ïðåäïîëàãàåò îäíî âåäóùåå (çàïðàøèâàþùåå) óñòðîéñòâî â ëèíèè (master), êîòîðîå ìîæåò ïåðåäàâàòü êîìàíäû îäíîìó èëè íåñêîëüêèì âåäîìûì óñòðîéñòâàì (slave), îáðàùàÿñü ê íèì ïî óíèêàëüíîìó â ëèíèè àäðåñó. Ñèíòàêñèñ êîìàíä ïðîòîêîëà ïîçâîëÿåò àäðåñîâàòü 247 óñòðîéñòâ íà îäíîé ëèíèè ñâÿçè ñòàíäàðòà RS-485 (ðåæå RS-422 èëè RS-232).  ñëó÷àå ñ ðåæèìîì TCP àäðåñàöèÿ èñêëþ÷åíà èç ïðîòîêîëà, ïîñêîëüêó âûïîëíÿåòñÿ íà óðîâíå TCP/IP ñòåêà.
Èíèöèàòèâà ïðîâåäåíèÿ îáìåíà âñåãäà èñõîäèò îò âåäóùåãî óñòðîéñòâà. Âåäîìûå óñòðîéñòâà ïðîñëóøèâàþò ëèíèþ ñâÿçè. Ìàñòåð ïîäà¸ò çàïðîñ (ïîñûëêà, ïîñëåäîâàòåëüíîñòü áàéò) â ëèíèþ è ïåðåõîäèò â ñîñòîÿíèå ïðîñëóøèâàíèÿ ëèíèè ñâÿçè. Âåäîìîå óñòðîéñòâî îòâå÷àåò íà çàïðîñ, ïðèøåäøèé â åãî àäðåñ.
Îêîí÷àíèå îòâåòíîé ïîñûëêè îïðåäåëÿåòñÿ â çàâèñèìîñòè îò ðåæèìà.  ðåæèìå RTU îêîí÷àíèå ïîñûëêè îïðåäåëÿåòñÿ ïî âðåìåííîìó èíòåðâàëó ìåæäó îêîí÷àíèåì ïðè¸ìà ïðåäûäóùåãî áàéòà è íà÷àëîì ïðè¸ìà ñëåäóþùåãî, âðåìÿ ñèìâîëà. Åñëè ýòîò èíòåðâàë ïðåâûñèë âðåìÿ, íåîáõîäèìîå äëÿ ïðè¸ìà ïîëòîðà áàéòà íà çàäàííîé ñêîðîñòè ïåðåäà÷è òî ïðè¸ì ôðåéìà îòâåòà ñ÷èòàåòñÿ çàâåðø¸ííûì.  ðåæèìå ASCII êðèòåðèåì îêîí÷àíèÿ ïîñûëêè ÿâëÿåòñÿ ñèìâîë '\r', à â ðåæèìå TCP — îæèäàåìûé ðàçìåð ïîñûëêè, èíôîðìàöèÿ î êîòîðîì ïðèñóòñòâóåò â çàãîëîâêå ïàêåòà.
1.1. Àäðåñàöèÿ
Âñå îïåðàöèè ñ äàííûìè ïðèâÿçàíû ê íóëþ, êàæäûé âèä äàííûõ (ðåãèñòð, áèò, ðåãèñòð âõîäà èëè áèòà âõîäà) íà÷èíàþòñÿ ñ àäðåñà 0 è çàêàí÷èâàþòñÿ 65535.
1.2. Ñòàíäàðòíûå êîäû ôóíêöèé
 ïðîòîêîëå ModBus ìîæíî âûäåëèòü íåñêîëüêî ïîäìíîæåñòâ êîìàíä (Òàáëèöà 1).
Òàáëèöà 1: Ïîäìíîæåñòâî êîìàíä ïðîòîêîëà ModBus
Ïîäìíîæåñòâî | Äèàïàçîí êîäîâ |
Ñòàíäàðòíûå | 1-21 |
Ðåçåðâ äëÿ ðàñøèðåííûõ ôóíêöèé | 22-64 |
Ïîëüçîâàòåëüñêèå | 65-119 |
Ðåçåðâ äëÿ âíóòðåííèõ íóæä | 120-255 |
Ìîäóëåì ñáîðà äàííûõ èñïîëüçóþòñÿ êîìàíäû 0x03 è 0x06(0x10) äëÿ ÷òåíèÿ è çàïèñè ðåãèñòðîâ, 0x01 è 0x05(0x0F) äëÿ ÷òåíèÿ è çàïèñè áèòîâ, 0x02 è 0x04 äëÿ ÷òåíèÿ áèòà è ðåãèñòðà âõîäà ñîîòâåòñòâåííî. Äëÿ ðåàëèçàöèè îñòàëüíûõ-íåòèïè÷íûõ êîìàíä ìîäóëåì ïðåäóñìîòðåíà ôóíêöèÿ API ïîëüçîâàòåëüñêîãî ïðîãðàììèðîâàíèÿ, êîòîðóþ ìîæíî âûçûâàòü èç ïðîöåäóðû øàáëîíà, îòïðàâëÿÿ ïðîèçâîëüíûå PDU ïàêåòû è îáðàáàòûâàÿ ïîëó÷åííûå â îòâåò.
Ìîäóëü ïðîòîêîëà îáðàáàòûâàåò çàïðîñû êîìàíäàìè 0x03 è 0x06(0x10) äëÿ ÷òåíèÿ è çàïèñè ðåãèñòðîâ, 0x01 è 0x05(0x0F) äëÿ ÷òåíèÿ è çàïèñè áèòîâ.
2. Ìîäóëü ðåàëèçàöèè ïðîòîêîëà
Ìîäóëü ïðîòîêîëà ModBus ñîäåðæèò êîä ðåàëèçàöèè ïðîòîêîëüíîé ÷àñòè ModBus, à èìåííî îñîáåííîñòè âàðèàíòîâ ïðîòîêîëîâ ModBus/TCP, ModBus/RTU è ModBus/ASCII. Ìîäóëü ïðîòîêîëà, ñîâìåñòíî ñ âûáðàííûì òðàíñïîðòîì, àêòèâíî èñïîëüçóåòñÿ ìîäóëåì ñáîðà äàííûõ äëÿ îñóùåñòâëåíèÿ íåïîñðåäñòâåííûõ çàïðîñîâ. Ïîñêîëüêó ìîäóëü ïðîòîêîëà ÿâëÿåòñÿ àâòîíîìíûì òî, èñïîëüçóÿ åãî, ìîæíî ñîçäàâàòü äîïîëíèòåëüíûå ìîäóëè ñáîðà äàííûõ ïîñðåäñòâîì íåñòàíäàðòíûõ ôóíêöèé ðàñøèðåíèÿ ModBus ðàçëè÷íîãî îáîðóäîâàíèÿ àâòîìàòèçàöèè.
2.1. API ôóíêöèè èñõîäÿùèõ çàïðîñîâ
API ôóíêöèè èñõîäÿùèõ çàïðîñîâ (messIO()?) îïåðèðóþò îáìåíîì áëîêàìè PDU, çàâ¸ðíóòûìè â XML-ïàêåòû ñî ñëåäóþùåé ñòðóêòóðîé:
<prt id="sId" reqTm="reqTm" node="node" reqTry="reqTry">{pdu}</prt>
Ãäå:
- prt — èìÿ òåãà çàïðîñà ñ íàçâàíèåì èñïîëüçóåìîãî âàðèàíòà ïðîòîêîëà (TCP, RTU èëè ASCII).
- sId — èäåíòèôèêàòîð èñòî÷íèêà çàïðîñà. Èñïîëüçóåòñÿ äëÿ ïîìåùåíèÿ â îò÷¸ò âûõîäíîãî ïðîòîêîëà.
- reqTm — âðåìÿ çàïðîñà, à èìåííî âðåìÿ â òå÷åíèå êîòîðîãî îæèäàòü îòâåò, â ìèëëèñåêóíäàõ.
- node — íîìåð óçëà íàçíà÷åíèÿ èëè èäåíòèôèêàòîð þíèòà ModBus/TCP.
- reqTry — êîëè÷åñòâî ïîïûòîê ïîâòîðåíèÿ çàïðîñà ñ îøèáêîé â îòâåòå. Òîëüêî äëÿ âàðèàíòîâ ModBus/RTU è ModBus/ASCII.
- pdu — íåïîñðåäñòâåííî áëîê þíèòà äàííûõ ïðîòîêîëà (PDU) ModBus.
Ðåçóëüòèðóþùèé pdu çàìåíÿåò pdu çàïðîñà â XML-ïàêåòå, à òàêæå óñòàíàâëèâàåòñÿ àòðèáóò "err" ñ êîäîì è òåêñòîì îøèáêè, åñëè òàêîâàÿ èìåëà ìåñòî.
2.2. Îáñëóæèâàíèå çàïðîñîâ ïî ïðîòîêîëó ModBus
Âõîäíàÿ ÷àñòü îáñëóæèâàíèÿ çàïðîñîâ ê ìîäóëþ ïðîòîêîëà îñóùåñòâëÿåò ïðîâåðêó è îáðàáîòêó çàïðîñîâ ïîñðåäñòâîì îáúåêòîâ óçëîâ, ïðåäóñìîòðåííûõ ìîäóëåì (ðèñ.1). Ôàêòè÷åñêè ðåàëèçóåòñÿ ìåõàíèçì, ïîçâîëÿþùèé âûïîëíÿòü ñèñòåìîé OpenSCADA ðîëü ñåðâåðà ModBus/TCP èëè ïîä÷èí¸ííîãî óñòðîéñòâà ModBus/RTU è ModBus/ASCII. Òàêèì îáðàçîì ñèñòåìà OpenSCADA ïîëó÷àåò âîçìîæíîñòü èñïîëüçîâàòüñÿ â ðîëè ëþáîãî ó÷àñòíèêà ñåòåé ModBus.

Ðèñ.1. Âêëàäêà ïåðå÷íÿ óçëîâ îáñëóæèâàíèÿ âõîäÿùèõ çàïðîñîâ ïðîòîêîëà.
Óçåë ïðîòîêîëà ýêâèâàëåíòåí ôèçè÷åñêîìó óçëó óñòðîéñòâà ñåòè ModBus. Óçåë ïðîòîêîëà ìîæåò ðàáîòàòü â òð¸õ ðåæèìàõ:
- "Äàííûå" — ðåæèì îòðàæåíèÿ äàííûõ ñèñòåìû OpenSCADA íà ìàññèâû ðåãèñòðîâ è áèòîâ ModBus ñ ïåðåäà÷åé èõ ïî çàïðîñó êëèåíòñêîãî óçëà èëè ìàñòåðà.
- "Øëþç óçëà" — ðåæèì ïåðåíàïðàâëåíèÿ (øëþçîâàíèÿ) çàïðîñîâ ê óçëó â äðóãîé ñåòè ModBus ÷åðåç äàííûé óçåë.
- "Øëþç ñåòè" — ðåæèì ïåðåíàïðàâëåíèÿ çàïðîñîâ ê ëþáîìó óçëó â äðóãóþ ñåòü ModBus, ôàêòè÷åñêè âûïîëíÿÿ èíòåãðàöèþ íåñêîëüêèõ ñåòåé ModBus â îäíó.
Ïîñêîëüêó óçëîâ ïðîòîêîëà ìîæåò áûòü ñîçäàíî ìíîæåñòâî òî ïîëó÷àåòñÿ, ÷òî íà îäíîì èíòåðôåéñå, ò.å. â îäíîé ñåòè, îäíà ñòàíöèÿ íà îñíîâå OpenSCADA ìîæåò ïðîçðà÷íî ïðåäñòàâëÿòü íåñêîëüêî óçëîâ ñåòè ModBus ñ ðàçëè÷íûìè äàííûìè.
Ðàññìîòðèì îñîáåííîñòè êîíôèãóðàöèè óçëà ïðîòîêîëà â ðàçëè÷íûõ ðåæèìàõ.
Ðåæèì óçëà ïðîòîêîëà "Äàííûå"
Ðåæèì èñïîëüçóåòñÿ äëÿ îòðàæåíèÿ äàííûõ ñèñòåìû OpenSCADA íà ìàññèâû ðåãèñòðîâ è áèòîâ ModBus. Îáùàÿ êîíôèãóðàöèÿ óçëà îñóùåñòâëÿåòñÿ âî âêëàäêå "Óçåë" (ðèñ.2) ïàðàìåòðàìè:
- Ñîñòîÿíèå óçëà, à èìåííî: ñòàòóñ, "Âêëþ÷åí" è èìÿ ÁÄ, ñîäåðæàùåé êîíôèãóðàöèþ.
- Èäåíòèôèêàòîð, èìÿ è îïèñàíèå óçëà.
- Ñîñòîÿíèå, â êîòîðîå ïåðåâîäèòü óçåë ïðè çàãðóçêå: "Âêëþ÷åí".
- Àäðåñ óçëà ñåòè ModBus îò 1 äî 247.
- Âõîäÿùèé òðàíñïîðò, ê ñåòè êîòîðîãî îòíîñèòñÿ óçåë. Âûáèðàåòñÿ èç ïåðå÷íÿ âõîäíûõ òðàíñïîðòîâ ïîäñèñòåìû "Òðàíñïîðòû" OpenSCADA. Óêàçàíèå â êà÷åñòâå òðàíñïîðòà ñèìâîëà "*" äåëàåò äàííûé óçåë ó÷àñòíèêîì ëþáîé ñåòè ModBus ñ îáðàáîòêîé çàïðîñîâ îò ëþáîãî òðàíñïîðòà.
- Âàðèàíò ïðîòîêîëà ModBus, çàïðîñû â êîòîðîì äîëæåí îáðàáàòûâàòü óçåë èç ñïèñêà: Âñå, RTU, ASCII, TCP/IP.
- Âûáîð ðåæèìà, â äàííîì ñëó÷àå ýòîò ðåæèì "Äàííûå".
- Ïåðèîä îáñ÷¸òà äàííûõ â ñåêóíäàõ. Óêàçûâàåò ïåðèîäè÷íîñòü îáðàáîòêè ôîðìèðóåìûõ äëÿ çàïðîñîâ äàííûõ, à èìåííî: òàáëèöû äàííûõ ModBus, ïðîãðàììû îáñ÷¸òà äàííûõ è îáñëóæèâàíèå ññûëîê íà äàííûå OpenSCADA.
Óçëîì â ýòîì ðåæèìå îáðàáàòûâàþòñÿ ñëåäóþùèå ñòàíäàðòíûå êîìàíäû ïðîòîêîëà ModBus:
- 0x01 — ÷òåíèå ãðóïïû áèòîâ;
- 0x02 — ÷òåíèå ãðóïïû áèòîâ âõîäîâ;
- 0x03 — ÷òåíèå ãðóïïû ðåãèñòðîâ;
- 0x04 — ÷òåíèå ãðóïïû ðåãèñòðîâ âõîäîâ;
- 0x05 — óñòàíîâêà îäíîãî áèòà;
- 0x06 — óñòàíîâêà îäíîãî ðåãèñòðà;
- 0x0F — óñòàíîâêà ãðóïïû áèòîâ;
- 0x10 — óñòàíîâêà ãðóïïû ðåãèñòðîâ.

Ðèñ.2. Âêëàäêà "Óçåë" ñòðàíèöû êîíôèãóðàöèè óçëà ïðîòîêîëà â ðåæèìå "Äàííûå".
Äëÿ ôîðìèðîâàíèÿ òàáëèöû îòðàæåíèÿ äàííûõ ñåòè ModBus, à èìåííî ðåãèñòðîâ è áèòîâ ïðåäóñìàòðèâàåòñÿ âêëàäêà "Äàííûå" (ðèñ.3). Âêëàäêà "Äàííûå" ñîäåðæèò òàáëèöó ïàðàìåòðîâ è ïðîãðàììó îáðàáîòêè ïàðàìåòðîâ ñ óêàçàííûì ÿçûêîì ïðîãðàììèðîâàíèÿ, äîñòóïíûì â ñèñòåìå OpenSCADA. Òàáëèöà ñîäåðæèò ïàðàìåòðû ñî ñâîéñòâàìè:
- Id — èäåíòèôèêàòîð ïàðàìåòðà. ßâëÿåòñÿ êëþ÷åâûì äëÿ ôîðìèðîâàíèÿ òàáëèö ðåãèñòðîâ è áèòîâ ModBus. Ðåãèñòðû è áèòû ModBus óêàçûâàþòñÿ ñëåäóþùèì îáðàçîì:
R{N}[w], RI{N}[w] — ñïåöèôè÷íàÿ ôîðìà ðåãèñòðà (è âõîäà), ìîæåò áûòü ðàñøèðåí ñóôôèêñàìè: "i"—Int32, "f"—Float, "d"—Double, "s"—Ñòðîêà (ðàçìåð ïî óìîë÷àíèþ 10 è äî 100 ðåãèñòðîâ);
R:{N}:[w], RI:{N}:[w] — êëàññè÷åñêàÿ ôîðìà ðåãèñòðà (è âõîäà), ìîæåò áûòü ðàñøèðåí ñóôôèêñàìè: "i4"—Int32, "i8"—Int64, "f"—Float, "d"—Double, "s"—Ñòðîêà;
C{N}[w], CI{N}[w], C:{N}:[w], CI:{N}:[w] — áèò (è âõîä).
Ãäå:
{N} — àäðåñ äàííûõ ModBus óñòðîéñòâà (äåñÿòè÷íûé, øåñòíàäöàòåðè÷íûé, èëè âîñüìåðè÷íûé) [0...65535];
w — íåîáÿçàòåëüíûé ñèìâîë äëÿ èíäèêàöèè âîçìîæíîñòè çàïèñè.
Ïðèìåðû:
"R0x300" — äîñòóï ê ðåãèñòðó;
"C100w" — äîñòóï ê áèòó, äîñòóïåí äëÿ çàïèñè;
"R_f200" — ïîëó÷èòü âåùåñòâåííîå èç ðåãèñòðîâ 200 è 201;
"R_i400,300" — ïîëó÷èòü int32 èç ðåãèñòðîâ 400 è 300;
"R_s15,20" — ïîëó÷èòü ñòðîêó, áëîê ðåãèñòðîâ, èç ðåãèñòðà 15 è ðàçìåðîì 20;
"R_i8:0x10:w" — ïîëó÷èòü è óñòàíîâèòü int64 â ðåãèñòðû [0x10-0x13];
"R_d:0x20,0x30" — ïîëó÷èòü âåùåñòâåííîå äâîéíîé òî÷íîñòè (8 byte) èç ðåãèñòðîâ [0x20,0x30-0x32].
Âñå îñòàëüíûå ïàðàìåòðû, íå ïîïàâøèå ïîä âûøåóêàçàííûå ïðàâèëà, ÿâëÿþòñÿ âíóòðåííèìè, èñïîëüçóþòñÿ äëÿ ðàçëè÷íûõ ïðîìåæóòî÷íûõ âû÷èñëåíèé, îáðàáîòêè, ïðåîáðàçîâàíèé è çíà÷åíèÿ èõ ìîãóò áûòü îïåðàòèâíî ïðîêîíòðîëëèðîâàíû è èçìåíåíû èç ýòîé òàáëèöû â ðåæèìå èñïîëíåíèÿ.
Èìÿ — Èìÿ ïàðàìåòðà, èñïîëüçóåòñÿ äëÿ èìåíîâàíèÿ ñâÿçè.
Òèï — Òèï ïàðàìåòðà èç ñïèñêà: "Âåùåñòâåííûé", "Öåëûé", "Ëîãè÷åñêèé" è "Ñòðîêà". Äëÿ ðåãèñòðîâ è áèòîâ ModBus èìååò ñìûñë óñòàíàâëèâàòü "Öåëûé" è "Ëîãè÷åñêèé" òèï ñîîòâåòñòâåííî. Äëÿ ðåãèñòðîâ ðàñøèðåííûõ ïðåôèêñàìè "f" è "s" íóæíî óêàçûâàòü òèïû "Âåùåñòâåííûé" è "Ñòðîêà", ñîîòâåòñòâåííî.
Ñâÿçü — Ïðèçíàê òîãî, ÷òî äàííûé ïàðàìåòð äîëæåí ñâÿçûâàòüñÿ ñ àòðèáóòîì ïàðàìåòðà ïîäñèñòåìû "Ñáîð äàííûõ". Óêàçàííûå ýòèì ôëàãîì ñâÿçè óñòàíàâëèâàþòñÿ âî âêëàäêå "Ñâÿçè".
Çíà÷åíèå — Èñõîäíîå èëè òåêóùåå, åñëè óçåë âêëþ÷åí, çíà÷åíèå ïàðàìåòðà.
 òàáëèöå, ïî óìîë÷àíèþ, îïðåäåëÿþòñÿ íåñêîëüêî ïàðàìåòðîâ ñïåöèàëüíîãî íàçíà÷åíèÿ:
- f_frq — ÷àñòîòà âû÷èñëåíèÿ òàáëèöû ïðîãðàììîé;
- f_start — ïðèçíàê ïåðâîãî èñïîëíåíèÿ — çàïóñêà ïðîãðàììû.
- f_stop — ïðèçíàê ïîñëåäíåãî èñïîëíåíèÿ — îñòàíîâà ïðîãðàììû.

Ïîñêîëüêó â óêàçàòåëå ðàñøèðåííûõ òèïîâ ðåãèñòðîâ ìîæåò èñïîëüçîâàòüñÿ íåäîïóñòèìûé ñèìâîë ',' òî äîñòóï ê íåìó èç ïðîöåäóðû ìîæíî îñóùåñòâèòü òîëüêî àëüòåðíàòèâíûì ñïîñîáîì, ÷åðåç îáúåêò "arguments":
arguments["R_s10,5w"] = "9876543210";

Ðèñ.3. Âêëàäêà "Äàííûå", ñòðàíèöû êîíôèãóðàöèè óçëà ïðîòîêîëà â ðåæèìå "Äàííûå".
Äëÿ óêàçàííûõ â êà÷åñòâå ñâÿçåé ïàðàìåòðîâ ìîæíî óñòàíîâèòü ñâÿçè òîëüêî äëÿ âûêëþ÷åííîãî óçëà ïðîòîêîëà âî âêëàäêå "Ñâÿçè" (ðèñ.4).

Ðèñ.4. Âêëàäêà "Ñâÿçè" ñòðàíèöû êîíôèãóðàöèè óçëà ïðîòîêîëà â ðåæèìå "Äàííûå".
Ðåæèì óçëà ïðîòîêîëà "Øëþç óçëà"
Ðåæèì èñïîëüçóåòñÿ äëÿ ïðîáðîñà çàïðîñîâ ê îòäåëüíîìó óñòðîéñòâó â äðóãîé ñåòè ModBus èç ñåòè ModBus, äëÿ êîòîðîé ñêîíôèãóðèðîâàí äàííûé óçåë. Îáùàÿ êîíôèãóðàöèÿ óçëà îñóùåñòâëÿåòñÿ âî âêëàäêå "Óçåë" (ðèñ.5) ïàðàìåòðàìè:
- Ñîñòîÿíèå óçëà, à èìåííî: ñòàòóñ, "Âêëþ÷åí" è èìÿ ÁÄ, ñîäåðæàùåé êîíôèãóðàöèþ.
- Èäåíòèôèêàòîð, èìÿ è îïèñàíèå óçëà.
- Ñîñòîÿíèå, â êîòîðîå ïåðåâîäèòü óçåë ïðè çàãðóçêå: "Âêëþ÷åí".
- Àäðåñ óçëà èñõîäíîé ñåòè ModBus îò 1 äî 247.
- Âõîäÿùèé òðàíñïîðò, ê ñåòè êîòîðîãî îòíîñèòñÿ óçåë. Âûáèðàåòñÿ èç ïåðå÷íÿ âõîäíûõ òðàíñïîðòîâ ïîäñèñòåìû "Òðàíñïîðòû" OpenSCADA. Óêàçàíèå â êà÷åñòâå òðàíñïîðòà ñèìâîëà "*" äåëàåò äàííûé óçåë ó÷àñòíèêîì ëþáîé ñåòè ModBus ñ îáðàáîòêîé çàïðîñîâ îò ëþáîãî òðàíñïîðòà.
- Âàðèàíò ïðîòîêîëà ModBus çàïðîñû â êîòîðîì äîëæåí îáðàáàòûâàòü óçåë èç ñïèñêà: Âñå, RTU, ASCII, TCP/IP.
- Âûáîð ðåæèìà, â äàííîì ñëó÷àå ýòîò ðåæèì "Øëþç óçëà".
- Òðàíñïîðò, â êîòîðûé ïåðåíàïðàâëÿòü çàïðîñ, èç ïåðå÷íÿ èñõîäÿùèõ òðàíñïîðòîâ ïîäñèñòåìû "Òðàíñïîðòû".
- Ïðîòîêîë â êîòîðîì ïåðåíàïðàâëÿòü çàïðîñ.
- Àäðåñ óçëà ñåòè ModBus, îò 1 äî 247, â êîòîðóþ ïåðåíàïðàâëÿåòñÿ çàïðîñ.

Ðèñ.5. Âêëàäêà "Óçåë" ñòðàíèöû êîíôèãóðàöèè óçëà ïðîòîêîëà â ðåæèìå "Øëþç óçëà".
Ðåæèì óçëà ïðîòîêîëà "Øëþç ñåòè"
Ðåæèì èñïîëüçóåòñÿ äëÿ ïðîáðîñà çàïðîñîâ ñåòè öåëèêîì â äðóãóþ ñåòü ModBus èç ñåòè ModBus äëÿ êîòîðîé ñêîíôèãóðèðîâàí äàííûé óçåë ïðîòîêîëà. Ò.å. çàïðîñ íà óñòðîéñòâî ñ ëþáûì àäðåñîì áóäåò íàïðàâëÿòüñÿ â äðóãóþ ñåòü, áåç ïåðåàäðåñîâêè. Îáùàÿ êîíôèãóðàöèÿ óçëà ïðîòîêîëà îñóùåñòâëÿåòñÿ âî âêëàäêå "Óçåë" (ðèñ.6) ïàðàìåòðàìè:
- Ñîñòîÿíèå óçëà, à èìåííî: ñòàòóñ, "Âêëþ÷åí" è èìÿ ÁÄ, ñîäåðæàùåé êîíôèãóðàöèþ.
- Èäåíòèôèêàòîð, èìÿ è îïèñàíèå óçëà.
- Ñîñòîÿíèå, â êîòîðîå ïåðåâîäèòü óçåë ïðè çàãðóçêå: "Âêëþ÷åí".
- Âõîäÿùèé òðàíñïîðò ñåòè, èç êîòîðîé ïðîáðàñûâàþòñÿ çàïðîñû. Âûáèðàåòñÿ èç ïåðå÷íÿ âõîäíûõ òðàíñïîðòîâ ïîäñèñòåìû "Òðàíñïîðòû" OpenSCADA.
- Âàðèàíò ïðîòîêîëà ModBus, çàïðîñû â êîòîðîì äîëæåí îáðàáàòûâàòü óçåë èç ñïèñêà: Âñå, RTU, ASCII, TCP/IP.
- Âûáîð ðåæèìà, â äàííîì ñëó÷àå ýòîò ðåæèì "Øëþç ñåòè".
- Òðàíñïîðò ñåòè, â êîòîðóþ ïåðåíàïðàâëÿòü çàïðîñ, èç ïåðå÷íÿ èñõîäÿùèõ òðàíñïîðòîâ ïîäñèñòåìû "Òðàíñïîðòû".
- Ïðîòîêîë â êîòîðîì ïåðåíàïðàâëÿòü çàïðîñ.

Ðèñ.6. Âêëàäêà "Óçåë" ñòðàíèöû êîíôèãóðàöèè óçëà ïðîòîêîëà â ðåæèìå "Øëþç ñåòè".
2.3 Îò÷¸ò çàïðîñîâ ModBus
Äëÿ âîçìîæíîñòè êîíòðîëÿ è äèàãíîñòèêè çà êîððåêòíîñòüþ îñóùåñòâëåíèÿ çàïðîñîâ ðàçëè÷íûìè êîìïîíåíòàìè ìîäóëåì ïðåäîñòàâëÿåòñÿ âîçìîæíîñòü âêëþ÷åíèÿ îò÷¸òà çàïðîñîâ, ïðîõîäÿùèõ ÷åðåç ìîäóëü ïðîòîêîëà. Îò÷¸ò âêëþ÷àåòñÿ óêàçàíèåì íåíóëåâîãî êîëè÷åñòâà çàïèñåé âî âêëàäå "Îò÷¸ò" ñòðàíèöû ìîäóëÿ ïðîòîêîëà (ðèñ.7).

Ðèñ.7. Âêëàäà "Îò÷¸ò" ñòðàíèöû ìîäóëÿ ïðîòîêîëà.
3. Ìîäóëü ñáîðà äàííûõ
Ìîäóëü ñáîðà äàííûõ ïðåäîñòàâëÿåò âîçìîæíîñòü îïðîñà è çàïèñè ðåãèñòðîâ è áèòîâ óñòðîéñòâ ïîñðåäñòâîì ðåæèìà ïðîòîêîëîâ TCP, RTU, ASCII è êîìàíä çàïðîñà 0x01 — 0x06, 0x0F, 0x10.
3.1. Êîíòðîëëåð äàííûõ
Äëÿ äîáàâëåíèÿ èñòî÷íèêà äàííûõ ModBus ñîçäà¸òñÿ è êîíôèãóðèðóåòñÿ êîíòðîëëåð â ñèñòåìå OpenSCADA. Ïðèìåð âêëàäêè êîíôèãóðàöèè êîíòðîëëåðà äàííîãî òèïà èçîáðàæåí íà ðèñ.8.

Ðèñ.8. Âêëàäêà êîíôèãóðàöèè êîíòðîëëåðà.
Ñ ïîìîùüþ ýòîé âêëàäêè ìîæíî óñòàíîâèòü:
- Ñîñòîÿíèå êîíòðîëëåðà, à èìåííî: Ñòàòóñ, "Âêëþ÷åí", Çàïóùåí" è èìÿ ÁÄ, ñîäåðæàùåé êîíôèãóðàöèþ.
- Èäåíòèôèêàòîð, èìÿ è îïèñàíèå êîíòðîëëåðà.
- Ñîñòîÿíèå, â êîòîðîå ïåðåâîäèòü êîíòðîëëåð ïðè çàãðóçêå: "Âêëþ÷åí" è "Çàïóùåí".
- Èìÿ òàáëèö äëÿ õðàíåíèÿ êîíôèãóðàöèè ïàðàìåòðîâ êîíòðîëëåðà ñòàíäàðòíîãî è ëîãè÷åñêîãî òèïà.
- Ïîëèòèêà ïëàíèðîâàíèÿ è ïðèîðèòåò çàäà÷è ñáîðà äàííûõ.
- ModBus ïðîòîêîë, èñïîëüçóåìûé äëÿ îïðîñà ôèçè÷åñêîãî óñòðîéñòâà (TCP/IP, RTU èëè ASCII).
- Àäðåñ èñõîäÿùåãî òðàíñïîðòà? èç ñïèñêà ñêîíôèãóðèðîâàííûõ èñõîäÿùèõ òðàíñïîðòîâ â ïîäñèñòåìå "Òðàíñïîðòû" OpenSCADA.
- ModBus óçåë íàçíà÷åíèÿ.  ñëó÷àå ñ ïðîòîêîëàìè RTU è ASCII ýòî èíäèâèäóàëüíûé àäðåñ ôèçè÷åñêîãî óñòðîéñòâà, à ïðè TCP/IP — èäåíòèôèêàòîð åäèíèöû.
- Îáúåäèíåíèå ôðàãìåíòîâ ðåãèñòðîâ. Ñòàíäàðòíûå ôóíêöèè 01-04 ïîçâîëÿþò çàïðîñèòü ñðàçó íåñêîëüêî ñìåæíûõ ðåãèñòðîâ èëè áèòîâ. Òàêàÿ ñòðàòåãèÿ ÷àñòî ïîçâîëÿåò îïòèìèçèðîâàòü òðàôèê è âðåìÿ. Îäíàêî íóæíûå ðåãèñòðû íå âñåãäà ðàñïîëîæåíû ñìåæíî äðóã ê äðóãó è äàííàÿ îïöèÿ ïîçâîëÿåò ñîáèðàòü èõ â áëîêè äî 100 ðåãèñòðîâ èëè 1600 áèòîâ.

Ê óñòàíîâêå äàííîãî ïàðàìåòðà íóæíî ïîäõîäèòü ñ îñòîðîæíîñòüþ, ïîñêîëüêó íå âñå óñòðîéñòâà ïîääåðæèâàþò äîñòóï ê ðåãèñòðàì ìåæäó ôðàãìåíòàìè.
- Èñïîëüçîâàòü ôóíêöèè çàïèñè íåñêîëüêèõ ýëåìåíòîâ (0x0F,0x10). Âìåñòî ôóíêöèé îäíî-ýëåìåíòíîé çàïèñè áóäóò èñïîëüçîâàíû ìíîãî-ýëåìåíòíûå.
- Âðåìÿ îæèäàíèÿ ñîåäèíåíèÿ â ìèëëèñåêóíäàõ. Óêàçûâàåò ïðîìåæóòîê âðåìåíè, â òå÷åíèå êîòîðîãî îæèäàòü îòâåòà.  ñëó÷àå óêàçàíèÿ íóëåâîãî çíà÷åíèÿ èñïîëüçóåòñÿ âðåìÿ îæèäàíèÿ ïî óìîë÷àíèþ â òðàíñïîðòå. Ïîçâîëÿåò ó÷èòûâàòü èíäèâèäóàëüíûå ñâîéñòâà êîíòðîëëåðà â îáùåé ñåòè.
- Âðåìÿ âîññòàíîâëåíèÿ ñîåäèíåíèÿ â ñåêóíäàõ. Óêàçûâàåò ïðîìåæóòîê âðåìåíè ïî èñòå÷åíèþ êîòîðîãî îñóùåñòâëÿòü ïîâòîðíóþ ïîïûòêó çàïðîñà ê ðàíåå íåäîñòóïíîìó óñòðîéñòâó.
- Ïîïûòîê çàïðîñà äëÿ ïðîòîêîëîâ RTU è ASCII. Óêàçûâàåò íà êîëè÷åñòâî ïîïûòîê ïîâòîðåíèÿ çàïðîñà â ñëó÷àå ïîëó÷åíèÿ íåïîëíîãî èëè ïîâðåæä¸ííîãî îòâåòà.
- Ìàêñèìàëüíûé ðàçìåð áëîêà çàïðîñà (áàéòû). Óñòàíàâëèâàåò ìàêñèìàëüíûé ðàçìåð áëîêà ãðóïïîâûõ çàïðîñîâ ðåãèñòðîâ è áèòîâ, â áàéòàõ. Ïîëåçåí äëÿ êîíòðîëëåðîâ ñ ïîäîáíûì îãðàíè÷åíèåì.
3.2. Ïàðàìåòðû
Ìîäóëü ñáîðà äàííûõ ïðåäîñòàâëÿåò äâà òèïà ïàðàìåòðà: "Ñòàíäàðòíûé"(std) è "Ëîãè÷åñêèé"(logic). Äîïîëíèòåëüíûìè êîíôèãóðàöèîííûìè ïîëÿìè ïàðàìåòðîâ äàííîãî ìîäóëÿ ÿâëÿþòñÿ:
- "Ñòàíäàðòíûé"(std):
- Ïåðå÷åíü àòðèáóòîâ — ñîäåðæèò ñòðóêòóðèðîâàííûé ñïèñîê êîíôèãóðàöèè àòðèáóòîâ ModBus.
- "Ëîãè÷åñêèé"(logic):
- Øàáëîí ïàðàìåòðà — àäðåñ øàáëîíà ïàðàìåòðà DAQ.
Ñòàíäàðòíûé òèï ïàðàìåòðà(std)
Ãëàâíàÿ ñòðàíèöà êîíôèãóðàöèè ïàðàìåòðà ñòàíäàðòíîãî òèïà ïðåäñòàâëåíà íà ðèñóíêå 9.

Ðèñ.9. Âêëàäêà êîíôèãóðàöèè ïàðàìåòðà ñòàíäàðòíîãî òèïà.
Ñòðóêòóðà àòðèáóòà, â ïàðàìåòðå ñïèñêà àòðèáóòîâ, çàïèñûâàåòñÿ ñëåäóþùèì îáðàçîì: "{dt}:{numb}:{rw}:{id}:{name}".
Ãäå:
dt — ModBus òèï äàííûõ ("R"—ðåãèñòð[3,6(16)], "C"—áèò[1,5(15)], "RI"—ðåãèñòð âõîäà[4], "CI"—áèò âõîäà[2]);
"R" è "RI" ìîãóò áûòü ðàñøèðåíû ñóôôèêñàìè: "i2"—Int16, "i4"—Int32, "i8"—Int64, "u2"—UInt16, "u4"—UInt32, "f"—Float, "d"—Double, "b5"—Bit5, "s"—Ñòðîêà (ðàçìåð ïî óìîë÷àíèþ 10 è äî 100 ðåãèñòðîâ);
numb — àäðåñ ModBus óñòðîéñòâà (äåñÿòè÷íûé, øåñòíàäöàòåðè÷íûé, èëè âîñüìåðè÷íûé) [0...65535];
rw — ðåæèì ÷òåíèÿ/çàïèñè ("r"—÷òåíèå; "w"—çàïèñü, "rw"—çàïèñü è ÷òåíèå);
id — èäåíòèôèêàòîð ñîçäàâàåìîãî àòðèáóòà;
name — èìÿ ñîçäàâàåìîãî àòðèáóòà.
Ïðèìåðû:
"R:0x300:rw:var:Variable" — äîñòóï ê ðåãèñòðó;
"C:100:rw:var1:Variable 1" — äîñòóï ê áèòó;
"R_f:200:r:float:Float" — ïîëó÷èòü âåùåñòâåííîå èç ðåãèñòðîâ 200 è 201;
"R_i4:400,300:r:int32:Int32" — ïîëó÷èòü int32 èç ðåãèñòðîâ 400 è 300;
"R_b10:25:r:rBit:Reg bit" — ïîëó÷èòü áèò 10 èç ðåãèñòðà 25;
"R_s:15,20:r:str:Reg blk" — ïîëó÷èòü ñòðîêó, áëîê ðåãèñòðîâ, èç ðåãèñòðà 15 è ðàçìåðîì 20.
Ñòðîêà, êîòîðàÿ íà÷èíàåòñÿ ñ ñèìâîëà '#', ñ÷èòàåòñÿ êîììåíòàðèåì è íå îáðàáàòûâàåòñÿ.
 ñîîòâåòñòâèè ñ óêàçàííûì ñïèñêîì àòðèáóòîâ âûïîëíÿåòñÿ îïðîñ è ñîçäàíèå àòðèáóòîâ ïàðàìåòðà (ðèñ.10).

Ðèñ.10. Âêëàäêà àòðèáóòîâ ïàðàìåòðà ñòàíäàðòíîãî òèïà.
Ëîãè÷åñêèé òèï ïàðàìåòðà(logic)
Ãëàâíàÿ ñòðàíèöà êîíôèãóðàöèè ïàðàìåòðà ëîãè÷åñêîãî òèïà ïðåäñòàâëåíà íà ðèñóíêå 11.

Ðèñ.11. Âêëàäêà êîíôèãóðàöèè ïàðàìåòðà ëîãè÷åñêîãî òèïà.
Ïðè ôîðìèðîâàíèè øàáëîíà, äëÿ ëîãè÷åñêîãî òèïà ïàðàìåòðà äàííîãî êîíòðîëëåðà, íå íóæíî ó÷èòûâàòü ôîðìàò ññûëêè øàáëîíà, ïîñêîëüêó îí íå èñïîëüçóåòñÿ è ìîæåò áûòü îïóùåí. Ñàìî æå çíà÷åíèå ññûëêè, ïðè êîíôèãóðàöèè øàáëîíà (ðèñ.12), çàïèñûâàåòñÿ â ôîðìàòå: "{dt}:{numb}:{rw}".
Ãäå:
dt — ModBus òèï äàííûõ ("R"—ðåãèñòð[3,6(16)], "C"—áèò[1,5(15)], "RI"—ðåãèñòð âõîäà[4], "CI"—áèò âõîäà[2]);
"R" è "RI" ìîãóò áûòü ðàñøèðåíû ñóôôèêñàìè: "i2"—Int16, "i4"—Int32, i8-Int64, u2-UInt16, u4-UInt32, "f"—Float, "d"—Double, "b5"—Bit5, "s"—Ñòðîêà (ðàçìåð ïî óìîë÷àíèþ 10 è äî 100 ðåãèñòðîâ);
numb — àäðåñ äàííûõ ModBus óñòðîéñòâà (äåñÿòè÷íûé, øåñòíàäöàòåðè÷íûé, èëè âîñüìåðè÷íûé) [0...65535];
rw — ðåæèì ÷òåíèÿ/çàïèñè ("r"—÷òåíèå; "w"—çàïèñü, "rw"—çàïèñü è ÷òåíèå);
Ïðèìåðû:
"R:0x300:rw" — äîñòóï ê ðåãèñòðó;
"C:100:rw" — äîñòóï ê áèòó;
"R_f:200:r" — ïîëó÷èòü âåùåñòâåííîå èç ðåãèñòðîâ 200 è 201;
"R_i4:400,300:r" — ïîëó÷èòü int32 èç ðåãèñòðîâ 400 è 300;
"R_b10:25:r" — ïîëó÷èòü áèò 10 èç ðåãèñòðà 25;
"R_s:15,20:r" — ïîëó÷èòü ñòðîêó, áëîê ðåãèñòðîâ, èç ðåãèñòðà 15 è ðàçìåðîì 20.

Ðèñ.12. Âêëàäêà "Êîíôèãóðàöèÿ øàáëîíà" ïàðàìåòðà ëîãè÷åñêîãî òèïà.
Ìîäóëåì ïðåäóñìîòðåíà îñîáàÿ îáðàáîòêà ðÿäà àòðèáóòîâ øàáëîíà:
- f_frq — ×àñòîòà âû÷èñëåíèÿ ïðîöåäóðû øàáëîíà èëè âðåìÿ ïîñëå ïîñëåäíåãî âû÷èñëåíèÿ, îòðèöàòåëüíîå â ñåêóíäàõ, äëÿ ïëàíèðîâàíèÿ ïî CRON, òîëüêî ÷òåíèå.
- f_start — Ôëàã ïåðâîãî âûïîëíåíèÿ ïðîöåäóðû øàáëîíà, çàïóñê, òîëüêî ÷òåíèå.
- f_stop — Ôëàã ïîñëåäíåãî âûïîëíåíèÿ ïðîöåäóðû øàáëîíà, îñòàíîâ, òîëüêî ÷òåíèå.
- f_err — Îøèáêà ïàðàìåòðà, ïîëíûé äîñòóï. Çíà÷åíèå ýòîãî àòðèáóòà øàáëîíà ïîïàäàåò â àòðèáóò îøèáêè ïàðàìåòðà "err".
- SHIFR — Çíà÷åíèå øèôðà ïàðàìåòðà, òîëüêî ÷òåíèå.
- NAME — Çíà÷åíèå èìåíè ïàðàìåòðà, òîëüêî ÷òåíèå.
- DESCR — Çíà÷åíèå îïèñàíèÿ ïàðàìåòðà, òîëüêî ÷òåíèå.
- this — Îáúåêò äàííîãî ïàðàìåòðà, ïîçâîëÿåò ïîëó÷èòü äîñòóï ê àòðèáóòàì ïàðàìåòðà, íàïðèìåð, äëÿ äîñòóïà ê àðõèâàì.
 ñîîòâåòñòâèè ñ øàáëîíîì, ëåæàùèì â îñíîâå ïàðàìåòðà, ìû ïîëó÷àåì íàáîð àòðèáóòîâ ïàðàìåòðà ðèñ.13.

Ðèñ.13. Âêëàäêà àòðèáóòîâ ïàðàìåòðà ëîãè÷åñêîãî òèïà.
3.3. API ïîëüçîâàòåëüñêîãî ïðîãðàììèðîâàíèÿ
 âèäó ïîääåðæêè ìîäóëåì ïàðàìåòðîâ ëîãè÷åñêîãî òèïà èìååò ñìûñë ïðåäîñòàâëåíèå ðÿäà ôóíêöèé ïîëüçîâàòåëüñêîãî API äëÿ âûçîâà èç øàáëîíà ëîãè÷åñêîãî ïàðàìåòðà.
Îáúåêò "Êîíòðîëëåð" [this.cntr()]
- string messIO(string pdu) — îòïðàâêà PDU pdu ÷åðåç òðàíñïîðò îáúåêòà êîíòðîëëåðà ïîñðåäñòâîì ModBus ïðîòîêîëà. PDU ðåçóëüòàòà çàïðîñà ïîìåùàåòñÿ âìåñòî çàïðîñà â pdu, à îøèáêà âîçâðàùàåòñÿ â ðåçóëüòàòå ôóíêöèè.
Îáúåêò "Ïàðàìåòð" [this]
- bool attrAdd( string id, string name, string tp = "real", string selValsNms = "" ) (äëÿ âêëþ÷åííîãî ïàðàìåòðà ëîãè÷åñêîãî òèïà) — äîáàâèòü àòðèáóò id ñ èìåíåì name è äëÿ òèïà tp. Åñëè àòðèáóò óæå ïðèñóòñòâóåò, òî áóäóò ïðèìåíåíû ñâîéñòâà, êîòîðûå âîçìîæíî èçìåíèòü "íà õîäó": èìÿ, ðåæèì âûáîðà è ïàðàìåòðû âûáîðà.
- id, name — èäåíòèôèêàòîð è èìÿ íîâîãî àòðèáóòà;
- tp — òèï àòðèáóòà [boolean | integer | real | string | text | object] + ðåæèì âûáîðà [sel | seled];
- selValsNms — äâå ñòðîêè ñî çíà÷åíèÿìè â ïåðâîé è èõ èìåíàìè âî âòîðîé (ðàçäåë¸ííûå ";").
- bool attrDel( string id ) (äëÿ âêëþ÷åííîãî ïàðàìåòðà ëîãè÷åñêîãî òèïà) — óäàëèòü àòðèáóò id.
Ññûëêè