- Автор: Роман Савоченко
- Початково створено: у старій Wiki
До початку програмування у OpenSCADA Ви маєте вивчити структуру об'єктів програми (Об'єктна модель) у посібнику по програмі OpenSCADA та на рисунку 1.
З цього документу Ви побачите, що можете, як користувач, програмувати наступні частини OpenSCADA:
- Джерела логічного рівня підсистеми "Збір даних".
- Транспортні протоколи, доступні для користувацького програмування, такі як: Користувацький протокол, ModBus вузли типу "Данні", Web-інтерфейси від користувача, ...
- Середовище Візуалізації та Управління (СВУ), у процедурах віджетів.
API користувацького програмування представляє собою дерево об'єктів OpenSCADA (Рис.1), кожний об'єкт якого може надавати власний перелік властивостей та функцій. Властивості та функції об'єктів можуть використовуватися користувачем у процедурах на мовах користувацького програмування OpenSCADA.
На цей час OpenSCADA надає тільки одну мову текстового програмування — JavaLikeCalc, відповідно Ви також повинні її вивчити перед початком. Точкою входу для доступу до об'єктів OpenSCADA (Рис.1) з мови користувацького програмування JavaLikeCalc є зарезервоване слово "SYS", кореневого об'єкту OpenSCADA. Наприклад, для доступу до функції вихідного транспорту треба записати: SYS.Transport.Serial.out_ModBus.messIO(mess);.
API об'єктів, які надаються модулями, описуються у власній документації модулів та тут до неї надаються посилання.
Contents
[hide]- 1 Користувацька мова програмування JavaLikeCalc
- 2 System-wide user objects
- 3 Program-system (SYS)
- 4 Any object (TCntrNode) of OpenSCADA objects tree (SYS.*)
- 5 Підсистема "Безпека" (SYS.Security)
- 6 Підсистема "БД" (SYS.BD)
- 7 Підсистема "Збір даних" (SYS.DAQ)
- 8 Підсистема "Архіви-Історія" (SYS.Archive)
- 9 Підсистема "Транспорти" (SYS.Transport)
- 10 Підсистема "Протоколи" (SYS.Protocols)
- 11 Підсистема "Користувацькі інтерфейси" (SYS.UI)
- 12 Підсистема "Спеціальні" (SYS.Special)
- 13 Бібліотеки функцій користувача
- 14 Посилання
1 Користувацька мова програмування JavaLikeCalc
1.1 Елементи мови
Ключові слова: if, else, while, for, in, break, continue, return, function, using.
Постійні:
- десяткові: цифри 0-9 (12, 111, 678);
- вісімкові: цифри 0-7 (012, 011, 076);
- шістнадцяткові: цифри 0-9, літери a-f або A-F (0x12, 0XAB);
- реальні: 345.23, 2.1e5, 3.4E-5, 3e6;
- логічні: true, false;
- строкові: "hello", без переходу на наступний рядок однак з підтримкою прямої конкатенації строкових констант.
Типи змінних:
- ціле: -263 ... 263, EVAL_INT(-9223372036854775807);
- реальне: 3.4*10308, EVAL_REAL(-1.79E308);
- логічне: false, true, EVAL_BOOL(2);
- рядок: послідовність символів-байтів (0...255) будь якої довжини, обмеженої об'ємом пам'яті та сховищем у БД; EVAL_STR("<EVAL>").
Вбудовані константи: pi = 3.14159265..., e = 2.71828182..., EVAL_BOOL(2), EVAL_INT(-9223372036854775807), null,EVAL,EVAL_REAL(-1.79E308), EVAL_STR("<EVAL>")
Глобальні атрибути параметрів DAQ (починаючи з підсистеми DAQ та у вигляді {Тип модуля DAQ}.{Об'єкт контролеру}.{Параметр}.{Атрибут}).
Функції та параметри об'єктної моделі OpenSCADA.
Варіанти EVAL (Error VALue) і null опрацьовуються особливо через перетворення одного у інше залежно від використаного базового типу, тобто ви вільні у використанні лише null або EVAL у будь яких випадках.
1.2 Операції мови
Операції, підтримувані мовою, представлено у таблиці нижче. Пріоритет операцій зменшується зверху донизу. Операції з однаковим пріоритетом входять до однієї групи кольору.
Символ | Опис |
() | Виклик функції. |
{} | Програмні блоки. |
++ | Інкремент (пост та пре). |
-- | Декремент (пост та пре). |
- | Унарний мінус. |
! | Логічне заперечення. |
~ | Побітове заперечення. |
* | Множення. |
/ | Ділення. |
% | Залишок від цілочисельного ділення. |
+ | Складання |
- | Віднімання |
<< | Порозрядний зсув ліворуч |
>> | Порозрядний зсув праворуч |
> | Більше |
>= | Більше або дорівнює |
< | Менше |
<= | Менше або дорівнює |
== | Дорівнює |
!= | Не дорівнює |
| | Порозрядне "АБО" |
& | Порозрядне "ТАК" |
^ | Порозрядне "Виключне АБО" |
&& | Логічне "ТАК" |
|| | Логічне "АБО" |
?: | Умовна операція "i=(i<0)?0:i;" |
= | Привласнення. |
+= | Привласнення із складанням. |
-= | Привласнення із відніманням. |
*= | Привласнення із множенням. |
/= | Привласнення із діленням. |
1.3 Вбудовані функції мови
Віртуальною машиною мови передбачено наступний набір вбудованих функцій загального призначення:
- double max(double x, double x1) — максимальне значення із x та x1;
- double min(double x, double x1) — мінімальне значення із x та x1;
- string typeof(ElTp vl) — тип значення vl;
- string tr(string base) — переклад базового base повідомлення.
Для забезпечення високої швидкості роботи у математичних обчисленнях модуль надає вбудовані математичні функції, які викликаються на рівні команд віртуальної машини:
- double sin(double x) — синус x;
- double cos(double x) — косинус x;
- double tan(double x) — тангенс x;
- double sinh(double x) — синус гіперболічний від x;
- double cosh(double x) — косинус гіперболічний від x;
- double tanh(double x) — тангенс гіперболічний від x;
- double asin(double x) — арксинус від x;
- double acos(double x) — арккосинус від x;
- double atan(double x) — арктангенс від x;
- double rand(double x) — випадкове число від 0 до x;
- double lg(double x) — десятковий логарифм від x;
- double ln(double x) — натуральний логарифм від x;
- double exp(double x) — експонента від x;
- double pow(double x, double x1) — зведення x у степінь x1;
- double sqrt(double x) — корінь квадратний від x;
- double abs(double x) — абсолютне значення від x;
- double sign(double x) — знак числа x;
- double ceil(double x) — округлення числа x до більшого цілого;
- double floor(double x) — округлення числа x до меншого цілого.
1.4 Оператори мови
Загальний перелік операторів мови:
- var — оператор ініціалізації змінної; визначення змінної без привласнення значення резервує її зі значенням null-EVAL, що дозволяє здійснити одноразову ініціалізацію складних типів даних на кшталт об'єкту, через пряме порівняння і перевірку із isEVal();
- if — оператор умови "ЯКЩО";
- else — оператор умови "ІНАКШЕ";
- while — визначення циклу "ПОКИ";
- for — визначення циклу "ДЛЯ";
- in — роздільник циклу "ДЛЯ" для перебору властивостей об'єкту;
- break — переривання виконання циклу;
- continue — продовжити виконання циклу з початку;
- function — визначення внутрішньої функції;
- using — дозволяє встановити простір видимості зовнішніх функцій часто використовної бібліотеки (using Special.FLibSYS;) для наступного звернення тільки за назвою функції, не має ефекту для об'єктного доступу;
- return — переривання функції та повернення результату, який копіюється до атрибуту із ознакою повернення (return 123;); в середині внутрішньої функції здійснюється її завершення з визначеним результатом;
- new — створення об'єкту, реалізовано для: загальний об'єкт "Object", масив "Array" та регулярні вирази "RegExp";
- delete — видалення/звільнення об'єкту або його властивостей, при цьому: внутрішні змінні встановлюються у null-EVAL, зовнішні замінюються порожнім об'єктом, а властивості об'єкту очищуються.
1.4.1 Умовні оператори
Мовою підтримуються два типи умов. Перший — це операції умови для використання всередині виразу, другий — глобальний, заснований на умовних операторах.
Умова всередині виразу будується на операціях '?' та ':'. У якості прикладу можна записати наступний практичний вираз:
st_open = (pos >= 100) ? true : false;
Що читається як — якщо змінна pos більша або дорівнює 100, тоді змінній st_open привласнюється значення true, інакше — false.
Глобальна умова будується на основі умовних операторів "if" та "else". У якості прикладу можна привести той-же вираз, але записаний у інший спосіб:
if(pos > 100) st_open = true; else st_open = false;
1.4.2 Цикли
Підтримується три типи циклів: while, for та for-in. Синтаксис циклів відповідає мовам програмування: C++, Java та JavaScript.
Цикл while, загалом, записується наступним чином: while({умова}) {тіло циклу};
Цикл for записується наступним чином: for({пре-ініціаліз};{умова};{пост-обчислення}) {тіло циклу};
Цикл for-in записується наступним чином: for({змінна} in {об'єкт}) {тіло циклу};
Де:
- {умова} — вираз, який визначає умову;
- {тіло циклу} — тіло циклу множинного виконання;
- {пре-ініціаліз} — вираз попередньої ініціалізації змінних циклу;
- {пост-обчислення} — вираз модифікації параметрів циклу після чергової ітерації;
- {змінна} — змінна, яка буде містити ім'я властивості об'єкта при переборі;
- {об'єкт} — об'єкт для якого здійснюється перебір властивостей.
1.4.3 Внутрішні функції
Мова підтримує визначення та виклик внутрішніх функцій. Для визначення внутрішньої функції використовується ключове слово "function" та в цілому визначення має синтаксис: function {ім'яФ} ({зм1}, {зм2}, ... {змN}) { {тіло функції} }. Визначення внутрішньої функції всередині іншої недозволене однак дозволено виклик раніш визначеної.
Виклик внутрішньої функції здійснюється у типовий спосіб, як процедура {ім'яФ}({var1}, {var2}, ... {varN}); або як функція {змРез} = {ім'яФ}({зм1}, {зм2}, ... {змN});. Виклик внутрішніх функцій допустимий тільки після їх декларації вище!
Всі змінні, визначені у основному тілі, недоступні всередині внутрішніх функцій і можуть бути передані через двобічні аргументи викликуваної внутрішньої функції або через аргументи основної функції. Всі змінні, визначені в середині внутрішньої функції, мають власний простір назв та недоступні із основного тіла, або будь якої іншої внутрішньої функції, та можуть бути передані в основне тіло через двобічні аргументи, результат викликуваної внутрішньої функції або через аргументи основної функції. Змінні внутрішньої функції реєструються для збереження/відновлення їх контексту після другого та більше входу до функції, тож вони цілковито підтримують рекурсивні виклики!
Оператор "return", в середині внутрішньої функції, здійснює контрольоване її завершення та розташування вказаної змінної, або результату виразу, як результату викликуваної внутрішньої функції.
Приклад типового визначення та використання внутрішньої функції наведено далі:
function sum(a, b, c, d) { return a + ((b==null)?0:b) + ((c==null)?0:c) + ((d==null)?0:d); }
rez = sum(1, 2);
1.4.4 Спеціальні символи строкових змінних
Мовою передбачено підтримку наступних спеціальних символів строкових змінних:
- "\n" — переведення рядка;
- "\t" — символ табуляції;
- "\b" — забій;
- "\f" — перевід сторінки;
- "\r" — повернення каретки;
- "\\" — сам символ '\';
- "\041" — символ '!', записаний вісімковим числом;
- "\x21" — символ '!', записаний шістнадцятковим числом.
2 System-wide user objects
JavaLikeCalc provides support of the data type "Object". The data type "Object" is an associated container of properties and functions. The properties can support data of fourth basic types and other objects. Access to object properties can be done through the record of property names to the object obj.prop, through a dot, and also through the inclusion of the property name in square brackets obj["prop"]. It is obvious that the first mechanism is static, while the second lets you to specify the name of the property through a variable. The name of the property through the dot must not start with a digit and contain operations symbols; otherwise, for the first digit, the object prefix should be used — SYS.BD.SQLite.db_1s, or write in square brackets — SYS.BD.SQLite["1+s"], for operations symbols in the name. Object's properties removing you can perform by the operator "delete". Reading of an undefined property will return null-EVAL. Creating an object is carried by the keyword new: varO = new Object(). The basic definition of the object does not contain functions. Copying of an object is actually makes the reference to the original object. When you delete an object is carried out the reducing of the reference count, and when the count is set to zero then the object is removed physically.
Different components of OpenSCADA can define the basic object with special properties and functions. The standard extension of the object is an array "Array", which is created by the command varO = new Array(prm1,prm2,prm3,...,prmN). Comma-separated parameters are placed in the array in the original order. If the parameter is the only one the array is initiated by the specified number of empty elements. Peculiarity of the array is that it works with the properties as the indexes and the main mechanism of addressing is placing the index into square brackets arr[1] is accessible. Array stores the properties in its own container of the one-dimensional array. Digital properties of the array are used to access directly to the array, and the characters work as the object properties. For more details about the properties and functions of the array can be read here.
The object of regular expression "RegExp" is created by command varO = new RegExp(pat, flg), where pat — pattern of the regular expression, and flg — match flags. The object for work with regular expressions, based on the library "PCRE". In the global search set object attribute "lastIndex", which allows you to continue searching for the next function call. In the case of an unsuccessful search for the attribute "lastIndex" reset to zero. For more details about the properties and functions of the regular expression object can be read here.
For random access to the function arguments provided the arguments object, which you can refer to by the symbol "arguments". This object contains the property "length" with a number of arguments in the function and allows you to access to a value of the argument by its number or ID. Consider the enumeration of the arguments on the cycle:
args = new Array();
for(var i = 0; i < arguments.length; i++)
args[i] = arguments[i];
The basic types have the partial properties of the object. Properties and functions of the basic types are listed below:
- NULL type, functions:
- bool isEVal(); — returns "true".
- Logical type, functions:
- bool isEVal(); bool isNaN( ); — checks the value to null-EVAL.
- string toString(); — performs the value as the string "true" or "false".
- real toReal(); — reads this Boolean as a real number.
- int toInt(); — reads this Boolean as an integer number.
- Integer and real number:
- Properties:
- MAX_VALUE — maximum value;
- MIN_VALUE — minimum value;
- NaN — error value.
- Functions:
- bool isEVal(); bool isNaN( ); — checks the value to null-EVAL, and NaN for Real.
- string toExponential( int numbs = -1 ); — returns the string of the number, formatted in the exponential notation, and with the number of significant digits numbs. If numbs is missing the number of digits will have as much as needed.
- string toFixed( int numbs = 0, int len = 0, bool sign = false ); — returns the string of the number, formatted in the notation of fixed-point, and with the number of significant digits after the decimal point numbs, for minimum length len and compulsion to the presence of a sign. If numbs is missing, the number of digits after the decimal point is equal to zero.
- string toPrecision( int prec = -1 ); — returns the string of the number, formatted with the number of significant digits prec.
- string toString( int base = 10, int len = -1, bool sign = false ); — returns the string of the number of the integer type, formatted with the following representation base (2-36), for minimum length len and compulsion to the presence of a sign.
- real toReal(); — reads this integer-real as a real number.
- int toInt(); — reads this integer-real as an integer number.
- String:
- Properties:
- int length — string length.
- Functions:
- bool isEVal(); — checks value to null-EVAL.
- bool isNaN( bool whole = true ); — checks the string to Not A Number and in whole for whole.
- string charAt( int symb, string type = "" ); — extracts from the string the symbol symb for the type. These types of the symbol are supported: ""-ASCII and raw one byte code, UTF-8, UTF-16, UTF-32. In the case of UTF-8, the symbol position symb is changed to the next symbol position due to length of this symbols type is variable one.
- int charCodeAt( int symb, string type = "" ); — extracts from the string the symbol code symb for the type. These types of the symbol are supported: ""-ASCII and raw one byte code, UTF-8, UTF-16, UTF-16LE, UTF-16BE, UTF-32, UTF-32LE, UTF-32BE. In the case of UTF-8, the symbol position symb is changed to the next symbol position due to length of this symbols type is variable one.
- string concat( string val1, string val2, ... ); — returns a new string formed by joining the values val1 etc. to the original one.
- int indexOf( string substr, int start = 0 ); — returns the position of the required string substr in the original row from the position start. If the initial position is not specified then the search starts from the beginning. If the search string is not found then "-1" is returned.
- int lastIndexOf( string substr, int start = {end} ); — returns the position of the search string substr in the original one beginning from the position of start when searching from the end. If the initial position is not specified then the search begins from the end. If the search string is not found then "-1" is returned.
- int search( string pat, string flg = "" ); — searches into the string by the pattern pat and pattern's flags flg. Returns found substring position or "-1" for else.
var rez = "Java123Script".search("script","i"); // rez = 7
- int search( RegExp pat ); — searches into the string by the "RegExp" pattern pat. Returns found substring position or "-1" for else.
var rez = "Java123Script".search(new RegExp("script","i")); // rez = 7
- Array match( string pat, string flg = "" ); — calls match for the string by the pattern pat and flags flg. Returns matched substring (0) and subexpressions (>0) array. Sets "index" attribute of the array to the substring position. Sets the "input" attribute to the source string. Sets the "err" attribute to the operation error code.
var rez = "1 plus 2 plus 3".match("\\d+","g"); // rez = [1], [2], [3]
- Array match( TRegExp pat ); — calls match for the string and "RegExp" pattern pat. Returns matched substring (0) and subexpressions (>0) array. Sets the "index" attribute of the array to substring position. Sets the "input" attribute to the source string. Sets the "err" attribute to the operation error code.
var rez = "1 plus 2 plus 3".match(new RegExp("\\d+","g")); // rez = [1], [2], [3]
- string slice( int beg, int end ); string substring( int beg, int end ); — returns the string extracted from the original one starting from the beg position and ending before the end (not included), numbering from zero. If the begin or end is negative, then the count is conducted from the end of the line. If the end is not specified, then the end is the end of the line. For example, the construction substring(-2) return two last symbols of the string.
- Array split( string sep, int limit = 0 ); — returns the array of strings separated by sep with the limit of the number of elements (0 for no limit).
- Array split( RegExp pat, int limit = 0 ); — returns the array of strings separated by the RegExp pattern pat with the limit of the number of elements (0 for no limit).
rez = "1,2, 3 , 4 ,5".split(new RegExp("\\s*,\\s*")); // rez = [1], [2], [3], [4], [5]
- string insert( int pos, string substr ); — inserts the substring substr into this string's position pos.
- string replace( int pos, int n, string str ); — replaces substring into the position pos and length n to the string str.
rez = "Javascript".replace(4,3,"67"); // rez = "Java67ipt"
- string replace( string substr, string str ); — replaces all the substrings substr to the string str.
rez = "123 321".replace("3","55"); // rez = "1255 5521"
- string replace( RegExp pat, string str ); — replaces substrings by the pattern pat to the string str.
rez = "value = \"123\"".replace(new RegExp("\"([^\"]*)\"","g"),"``$1''")); // rez = "value = ``123''"
- real toReal(); — converts this string to a real number.
- int toInt( int base = 0 ); — converts this string to an integer number in accordance with base (from 2 to 36). If the base is 0, then the prefix will be considered a prefix for determining the base (123-decimal; 0123-octal; 0x123-hex).
- string {parse,parseEnd}( int pos, string sep = ".", int off = {0,{length}}, bool mergeSepSymb = false ); — gets a token with the number pos from the string when separated by sep and from the offset off (stopping on the next token begin, end for parseEnd). mergeSepSymb specifies of allowing of merging of the group of identical symbols to one separator. Result offset is returned back to off. parseEnd() does the same but from the end.
- string parseLine( int pos, int off = 0 ); — gets a line with the number pos from the string and from the offset off. Result offset is returned back to off (stopping on the next token begin).
- string parsePath( int pos, int offCmptbl = 0, int off = 0 ); — gets a path token with the number pos from the string and from the offset off (stopping on the next token begin) or offCmtbl (stopping on next symbol of the current token end — for compatibility). Result offset is returned back to off or offCmptbl.
- string parsePathEnd( int pos, int off = {length} ); — gets a path token with the number pos from the string end and from the offset off (stopping on the next token end). Result offset is returned back to off.
- string path2sep( string sep = "." ); — converts path into this string to separated by sep string.
- string trim( string cfg = " \n\t\r" ); — trims the string at the begin and the end for the symbols cfg.
2.1 Об'єкт масиву (Array)
Особливістю масиву є те, що він працює з властивостями як з індексами та повне їх найменування не має сенсу, відтак доступний тільки механізм звернення охопленням індексу квадратними дужками "arr[1]". Масив зберігає властивості у власному контейнері одномірного масиву. Цифрові властивості масиву використовуються для доступу безпосередньо до масиву, а символьні працюють як властивості об'єкту.
Масив надає спеціальну властивість "length", для отримання розміру масиву "var = arr.length;". Також масив надає наступні функції:
- string join( string sep = "," ), string toString( string sep = "," ), string valueOf( string sep = "," ) — повертає рядок з елементами масиву, поділеними sep або символом ','.
- Array concat( Array arr ); — додає до первинного масиву елементи масиву arr. Повертає первинний масив зі змінами.
- int push( ElTp var, ... ); — поміщає елемент(и) var у кінець масиву, як до стеку. Повертає новий розмір масиву.
- ElTp pop( ); — видаляє останній елемент масиву та повертає його значення, як із стеку.
- Array reverse( ); — змінює порядок розташування елементів масиву. Повертає первинний масив зі змінами.
- ElTp shift( ); — зсуває масив догори, при цьому перший елемент масиву видаляється, а його значення повертається.
- int unshift( ElTp var, ... ); — засуває елемент(и) var до масиву. Перший елемент у 0, другий у 1 та так само далі.
- Array slice( int beg, int end ); — повертає фрагмент масиву від beg до end (виключаючи). Якщо значення початку або кінця негативне то відлік ведеться з кінця масиву. Якщо кінець не вказано то кінцем є кінець масиву.
- Array splice( int beg, int remN, ElTp val1, ElTp val2, ... ); — вставляє, видаляє або замінює елементи масиву. Повертає масив видалених елементів. У першу чергу здійснюється видалення елементів з позиції beg та кількістю remN, а потім вставляються значення val1 та інші, починаючи з позиції beg.
- int indexOf( ElTp var, int start = 0 ); — повертає індекс масиву потрібної змінної var у початковій послідовності, починаючи з позиції start. Якщо початкову позицію не вказано то пошук починається з початку. Якщо шуканої змінної не знайдено то повертається "-1".
- int lastIndexOf( ElTp var, int start = {end} ); — повертає індекс масиву потрібної змінної var у початковій послідовності, починаючи з позиції start за пошуком з кінця. Якщо початкову позицію не вказано то пошук починається з кінця. Якщо шуканої змінної не знайдено то повертається "-1".
- double sum( int beg, int end ); — сума значень частини масиву з позиції beg по end, виключно.
- Array sort( ); — сортує елементи масиву у лексикографічній послідовності.
2.2 Об'єкт регулярного виразу (RegExp)
Об'єкт роботи з регулярними виразами, засновано на бібліотеці PCRE. При глобальному пошуку встановлюється атрибут об'єкта "lastIndex", що дозволяє продовжити пошук при наступному виклику функції. У випадку невдалого пошуку атрибут "lastIndex" скидається у нуль.
У якості аргументів створення об'єкту передається рядок з текстом регулярного виразу та прапорці у вигляді рядка символів:
- 'g' — режим глобального пошуку;
- 'i' — режим регістронезалежного пошуку;
- 'm' — режим багаторядкового пошуку;
- 'u' — примусовий дозвіл символів UTF-8, для інших локалей;
- 'p' — тестування виразу за правилами звичайного шаблону з ключовими символами: '?', '*' та '\'.
Властивості об'єкту:
- source — початковий шаблон регулярного виразу, тільки читання.
- global — ознака глобального пошуку, тільки читання.
- ignoreCase — ознака ігнорування регістру символів при пошуку, тільки читання.
- multiline — ознака багаторядкового пошуку, тільки читання.
- UTF8 — ознака дозволу UTF-8 символів, тільки читання.
- lastIndex — індекс символу за підрядком останнього пошуку, використовується у глобальному режимі для продовження сканування, при наступному виклику.
Функції об'єкту:
- Array exec(string val); — викликає пошук за рядком val. Повертає знайдений підрядок (0) та підвирази (>0) у масиві. Встановлює атрибут масиву "index" у позицію знайденого підрядка. Встановлює атрибут масиву "input" у значення початкового рядку.
var re = new RegExp("(\\d\\d)[-/](\\d\\d)[-/](\\d\\d(?:\\d\\d)?)",""); var rez = re.exec("12/30/1969"); var month = rez[1]; var day = rez[2]; var year = rez[3];
- bool test(string val); — повертає "true" якщо підрядок знайдено у val.
var re = new RegExp("(\\d\\d)[-/](\\d\\d)[-/](\\d\\d(?:\\d\\d)?)",""); var OK = re.test("12/30/1969");
2.3 Об'єкт вузла-тегу XML (XMLNodeObj)
Функції:
- string name( ) — ім'я вузла, XML-тегу.
- string text( bool full = false ) — текст вузла, вміст XML-тегу. Встановити full для отримання комбінованого тексту зі всіма включеними вузлами.
- string attr( string id ) — значення атрибуту вузла id.
- XMLNodeObj setName( string vl ) — встановлює ім'я вузла у vl. Повертає поточний вузол.
- XMLNodeObj setText( string vl ) — встановлює текст вузла у vl. Повертає поточний вузол.
- XMLNodeObj setAttr( string id, string vl ) — встановлює атрибут id у значення vl. Повертає поточний вузол.
- XMLNodeObj clear( bool full = false ) — очищує вузол видаленням дочірніх вузлів, очищує текст та атрибути для full.
- int childSize( ) — кількість вкладених вузлів.
- XMLNodeObj childAdd( ElTp no = XMLNodeObj ); XMLNodeObj childAdd(string no) — додає об'єкт no як вкладений. no може бути як безпосередньо об'єктом-результатом функції "SYS.XMLNode()", так і рядком з ім'ям нового тегу. Повертається вкладений вузол.
- XMLNodeObj childIns( int id, ElTp no = XMLNodeObj ); XMLNodeObj childIns(int id, string no) — вставляє об'єкт no як вкладений, у позицію id. no може бути як безпосередньо об'єктом-результатом функції "SYS.XMLNode()", так і рядком з ім'ям нового тегу. Повертається вкладений вузол.
- XMLNodeObj childDel( int id ) — видаляє вкладений вузол у позиції id. Повертає поточний вузол.
- XMLNodeObj childGet( int id ) — отримує вкладений вузол у позиції id. Повертає 0 за відсутності.
- XMLNodeObj childGet( string name, int num = 0 ) — отримує вкладений вузол з ім'ям тегу name та порядковим номером num. Повертає 0 за відсутності.
- XMLNodeObj parent() — отримує батьківський вузол. Повертає false за відсутності.
- string load( string str, bool file = false, int flg = 0, string cp = "UTF-8" ) — завантажує XML з рядка str або з файлу з шляхом у str якщо file дорівнює "true", з кодуванням cp. Повертає рядок із помилкою у форматі "{errCod}:{errText}", який "0" для успішного завантаження. Де flg — прапорці завантаження:
- 0x01 — повне завантаження, з блоками тексту та коментарями у спеціальних вузлах;
- 0x02 — не видаляти пробіли на початку та кінці тексту тегу.
- string save( int flg = 0, string path = "", string cp = "UTF-8" ) — зберігає дерево XML у рядок або у файлі path, з параметрами форматування flg та кодуванням cp. Повертає текст XML або код помилки. Передбачено наступні прапорці форматування flg:
- 0x01 — переривати рядок перед відкривальним тегом;
- 0x02 — переривати рядок після відкривального тегу;
- 0x04 — переривати рядок після закривального тегу;
- 0x08 — переривати рядок після тексту;
- 0x10 — переривати рядок після інструкції;
- 0x1E — переривати рядок після всіх;
- 0x20 — вставляти стандартний XML-заголовок;
- 0x40 — вставляти стандартний XHTML-заголовок;
- 0x80 — очищати сервісні теги: <??>, <!-- -->;
- 0x100 — не кодувати назви тегів;
- 0x200 — не кодувати назви атрибутів;
- 0x400 — захист бінарних символів [\x0-\x8\xB-\xC\x0E-\x1F] та помилкових UTF-8.
- XMLNodeObj getElementBy( string val, string attr = "id" ) — отримує елемент з дерева за атрибутом attr зі значенням val.
- TArrayObj<XMLNodeObj> getElementsBy( string tag, string attrVal = "", string attr = "id", int limit = 0, int from = 0 ) — отримує масив елементів з дерева за тегом tag (порожній для всіх) та атрибутом attr зі значенням attrVal (порожній для пропуску), також починаючи із тегу з номером from і обмежуючи їх кількість у limit (нуль без обмеження).
3 Program-system (SYS)
Object functions:
- {string|int} system( string cmd, bool noPipe = false ); — calls the console commands cmd of the OS returning the result by the channel. If noPipe is set then the callback code is returned and program can be started in the background ("sleep 5 &"). The function provides OpenSCADA with a wide range of capabilities by calling any system programs, utilities, and scripts, as well as by providing them with access to a huge amount of system data. For example the command "ls-l" returns the detailed content of the working directory.
- int fileSize( string file ); — returns the file size.
- string fileRead( string file, int off = 0, int sz = -1 ); — returns a string of part of the file for the offset off and the block size sz.
- int fileWrite( string file, string str, bool append = false ); — writes the string str to the file, removes presented one, at append. Returns the wrote bytes count.
- int fileRemove( string file ); — removes the file. Returns the removing result.
- int message( string cat, int level, string mess ); — forms of the system message mess with the category cat, level level (-7...7). The negative value of the level forms the alarms.
- int messDebug( string cat, string mess ); int messInfo( string cat, string mess ); int messNote( string cat, string mess ); int messWarning( string cat, string mess ); int messErr( string cat, string mess ); int messCrit( string cat, string mess ); int messAlert( string cat, string mess ); int messEmerg( string cat, string mess ); — forms of the system message mess with the category cat and the appropriate level by the name.
- XMLNodeObj XMLNode( string name = "" ); — creates of the XML node object with the name.
- string cntrReq( XMLNodeObj req, string stat = "" ); — sends a request req in XML view to the Control Interface of the program. Returns a string with error in the format "{errCod}:{errText}", which is "0" for successful. A request is generally written in the form <get path="/OPath/%2felem" /> and with additional attributes specific to the particular request. If the station stat is specified into the request then the request will be sent to this external station. The address for the attribute "path" you can obtain into the OpenSCADA configurator, that is into the status line where the address appear at the mouse cursor point to a field of configuration or information. Some examples of common requests, more examples in description the Control Interface and releaseTests():
- Reading a value of the element (the user name "test"):
req = SYS.XMLNode("get").setAttr("path","/sub_Security/usr_test/%2fprm%2fDESCR"); SYS.cntrReq(req); idSt = req.text();
- Writing a value to the element (the user name "test"):
req = SYS.XMLNode("set").setAttr("path","/sub_Security/usr_test/%2fprm%2fDESCR").setText("New test user name"); SYS.cntrReq(req);
- Adding a new node (the user "test"):
req = SYS.XMLNode("add").setAttr("path","/sub_Security/%2fbr%2fusr_").setText("test"); SYS.cntrReq(req);
- Deleting a node (the user "test"):
req = SYS.XMLNode("del").setAttr("path","/sub_Security/%2fbr%2fusr_").setText("test"); SYS.cntrReq(req);
- Saving the node changes to DB (the user "test"):
req = SYS.XMLNode("save").setAttr("path","/sub_Security/usr_test/%2fobj"); SYS.cntrReq(req);
- Loading the node from DB (the user "test"):
req = SYS.XMLNode("load").setAttr("path","/sub_Security/usr_test/%2fobj"); SYS.cntrReq(req);
- Reading a value of the element (the user name "test"):
- string lang(string full); — returns the system language in two symbols and the full language in full.
- int sleep( real tm, int ntm = 0 ); — puts the execution thread to sleep on the tm seconds (precised up to nanoseconds) and ntm nanoseconds. The sleeping time you can set up to STD_INTERF_TM (5 seconds).
- int time( int usec ); — returns the absolute time in seconds from the epoch of 1/1/1970 and the microseconds part into usec if specified.
- int utime( ); int mtime( ); — returns the absolute time in microseconds and milliseconds from the epoch of 1/1/1970.
- int {localtime|gmtime}( int fullsec, int sec, int min, int hour, int mday, int month, int year, int wday, int yday, int isdst ); — returns the full date in seconds (sec), minutes (min), hours (hour), days of the month (mday), months (month), years (year), days in the week (wday), days in the year (yday) and sign of the summer time (isdst), based on the absolute time in seconds fullsec from the epoch 1/1/1970. gmtime returns time in GMT(UTC).
- int {mktime|timegm}( int sec, int min, int hour, int mday, int month, int year, int wday, int yday, int isdst ); — forms the time since Epoch 1/1/1970 from separated seconds, minutes, hours, days, month etc. The values for separated time items can be set out from this typical range, which allows you to use this function during checking, and as a result, units of time will be fixed and rotated in the normal range. timegm runs in time at GMT(UTC).
- string {strftime|strftimegm}( int sec, string form = "%Y-%m-%d %H:%M:%S" ); — converts an absolute time sec to the string of the desired format form. Record of the format corresponds to the POSIX-function strftime. strftimegm returns time into GMT(UTC).
- int {strptime|strptimegm}( string str, string form = "%Y-%m-%d %H:%M:%S" ); — returns the time in seconds from the epoch of 1/1/1970, based on the string record of time str, in accordance with the specified template form. For example the template "%Y-%m-%d %H:%M:%S" corresponds with the time "2006-08-08 11:21:55". Description of the template format can be obtained from the documentation on POSIX-function strptime. strptimegm works into GMT(UTC) time.
- int cron( string cronreq, int base = 0 ); — returns the time, planned in the format of the standard CRON, cronreq, beginning from the basic time base or current, if the basic is not specified. CRON is the standard form "* * * * *".
- Where items by the order
- minutes (0-59);
- hours (0-23);
- days (1-31);
- month (1-12);
- week day (0[Sunday]-6).
- Where the item variants
- "*" — any value;
- "1,2,3" — list of the allowed values;
- "1-5" — raw range of the allowed values;
- "*/2" — divider to the all allowed values range.
- Examples
- "* * * * *" — each minute;
- "10 23 * * *" — only at 23 hour and 10 minute for any day and month;
- "*/2 * * * *" — for minutes: 0,2,4,...,56,58;
- "* 2-4 * * *" — for any minutes in hours from 2 to 4(include).
- string time2str( real tm, bool inParts = true ); — Converts the time interval tm in seconds to human string like "1hour 23minutes 10s" at setting inParts or "1.5 hour" else.
- string cpct2str( real cnt ); — Converts the capacity cnt in bytes to the human representing string.
- string str2time( string val, bool inParts = true ); — Converts the human representing relative time val of the function time2str() to the time in seconds, with parsing parts at setting inParts.
- string strFromCharCode( int char1, int char2, int char3, ... ); — creates a string from symbol codes char1, char2 ... charN.
- string strFromCharUTF([string type = "UTF-8",] int char1, int char2, int char3, ...); — creates a string from UTF symbols char1, char2 ... charN. These types of the symbol are supported: UTF-8, UTF-16, UTF-16LE, UTF-16BE, UTF-32, UTF-32LE, UTF-32BE.
- string strCodeConv( string src, string fromCP, string toCP ); — transcodes the text src from the encoding fromCP to toCP. If the encoding is omitted (empty string), it is used the internal one.
- string strEncode( string src, string tp = "Bin", string opt = "" ); — encodes the string src by the rule tp and the option opt. Allowed rules:
- "PathEl" — symbols [/%] to "%2f" and "%25", respectively;
- "HttpURL" — symbols [ \t%] and "> 0x80" to "%20", "%09", "%25" and etc.;
- "HTML" — symbols of the HTML-entities [><"&'] to ">", "<", """ and etc.;
- "JavaScript" — symbol '\n' shielding to "\\n";
- "SQL" — shielding of the symbols ['"`\] by appending '\' or doubling of the listed symbols into opt;
- "Custom" — symbols into opt to the view "%NN";
- "Base64" — same Base 64 binary encoding, into opt sets a line termination symbol(s) after 57 symbols;
- "FormatPrint" — symbol '%' to "%%";
- "OscdID" — almost all symbols like [ /\&(] to '_';
- "Bin" — ASCII bytes list ("XX XX XX XX ...") to the binary represent;
- "Reverse" — reversion the sequence;
- "ToLower" — symbols to the lower register;
- "Limit" — limiting the string to the length into opt, counting UTF-8 variable length;
- "ShieldSymb" — shielding symbols from opt (by default ['"`]) with the slash symbol "\" like to '\n', '\r', ..., '\0NNN';
- "ShieldBin" — shielding all binary symbols [\x0-\x8\xB-\xC\x0E-\x1F] with the slash symbol "\".
- string strDecode( string src, string tp = "Bin", string opt = "" ); — decodes the string src by the rule tp and the option opt. Allowed rules:
- "PathEl", "HttpURL", "Custom" — symbols like "%NN" to the binary represent;
- "Base64" — same from Base 64;
- "Bin" — the binary string to ASCII bytes ("XX XX XX XX .. A.b.c.."), opt points to the separator or "<text>" for enable the offset to the left and the text part to the right;
- "ShieldSymb" — shielded symbols like to '\n', '\r', ..., '\0NNN', '\xNN' to the binary represent.
4 Any object (TCntrNode) of OpenSCADA objects tree (SYS.*)
Object functions:
- PropTp property(string id, PropTp val = NULL); — Returns of the object's property id for the group grp with setting its at val non NULL and EVAL. Where val in EVAL is clearing the property and NULL (no the argument) just doesn't set nothing. You can access directly the properties for the TCntrNode objects and of course for absent objects in the Object Model.
- TArrayObj nodeList( string grp = "", string path = "" ); — Get child nodes full identifiers list for group grp and node from path path. If grp empty then return nodes for all groups. The full identifier is "{grp}{nID}".
- TCntrNodeObj nodeAt( string path, string sep="" ); — Attach to node path into OpenSCADA objects tree. If a separator set into sep then path process as separated string. For missed and invalid nodes the function will return "false" when a correct node in it conversion to BOOLEAN will return "true".
- TCntrNodeObj nodePrev( ); — Get previous, parent, node.
- string nodePath( string sep = "", bool from_root = true ); — Getting the path of the current node in the object tree OpenSCADA. One separator character is specified in sep to get the path through the separator, for example, "DAQ.ModBus.PLC1.P1.var", otherwise "/DAQ/ModBus/PLC1/P1/var". from_root indicates a need to form a path from the root, and without the Station ID.
- int messSys( int level, string mess ) — Formation of the system message mess with the level with the node path as a category and with the human readable path before the message.
5 Підсистема "Безпека" (SYS.Security)
Функції об'єкту підсистеми (SYS.Security):
- int access( string user, int mode, string owner, string group, int access ) — перевіряє доступ користувача user до ресурсу, який належить owner та group з доступом access та для режиму mode:
- user — користувач перевірки доступу;
- mode — режим доступу (4-R, 2-W, 1-X);
- owner — власник ресурсу;
- group — група ресурсу;
- access — режим доступу до ресурсу (RWXRWXRWX — 0777).
Функції об'єкту "Користувач" (SYS.Security["usr_{User}"]):
- ElTp cfg( string nm ) — отримує значення конфігураційного поля nm об'єкту.
- bool cfgSet( string nm, ElTp val ) [доступ до відповідної підсистеми] — встановлює конфігураційне поле nm об'єкту у значення val.
- bool auth( string pass ) — повертає TRUE у випадку вдалої автентифікації користувача за pass.
- Array groups( ) — повертає перелік груп користувача.
Функції об'єкту "Група користувачів" (SYS.Security["grp_{Group}"]):
- ElTp cfg( string nm ) — отримує значення конфігураційного поля nm об'єкту.
- bool cfgSet( string nm, ElTp val ) [доступ до відповідної підсистеми] — встановлює конфігураційне поле nm об'єкту у значення val.
- bool user( string nm ) — перевіряє присутність користувача nm у даній групі.
6 Підсистема "БД" (SYS.BD)
Функції об'єкту бази даних (SYS.BD["TypeDB"]["DB"]):
- ElTp cfg( string nm ) — отримує значення конфігураційного поля nm об'єкту.
- bool cfgSet( string nm, ElTp val ) [доступ до відповідної підсистеми] — встановлює конфігураційне поле nm об'єкту у значення val.
- Array SQLReq( string req, bool tr = EVAL ); — здійснює SQL-запит req до БД, всередині (tr=true), назовні (tr=false) або байдуже (tr=EVAL) до транзакції. Повертає масив рядків таблиці результату з полями за індексами і за іменами стовпців. У випадку помилки її значення розташовується у властивості "err" результату.
DBTbl = SYS.BD.MySQL.GenDB.SQLReq("SELECT * from DB;"); if(DBTbl.err.length) SYS.messInfo("TEST DB","Error: "+DBTbl.err); else for(var iRw = 0; iRw < DBTbl.length; iRw++) { var rec = ""; for(var iFld = 0; iFld < DBTbl[iRw].length; iFld++) rec += DBTbl[iRw][iFld] + "\t"; SYS.messInfo("TEST DB", "Row "+iRw+": "+rec); //Get column value by the name if(iRw) SYS.messInfo("TEST DB", "Row "+iRw+": 'NAME'"+DBTbl[iRw]["NAME"]); }
Функції об'єкту таблиці (SYS.BD["TypeDB"]["DB"]["Table"]):
- XMLNodeObj fieldStruct( ); — отримує структуру таблиці у вигляді XML вузла "field" з дочірніми вузлами-стовпчиками <RowId type="real" len="10.2" key="1" def="Default value">{Value}</RowId>, де:
- {RowId} — ідентифікатор стовпчика;
- {Value} — значення стовпчика;
- type — тип значення стовпчика: str — рядок, int — ціле, real — реальне та bool — логічне;
- len — розмір значення стовпчика, у знаках;
- key — ознака того, що стовпчик є ключем, та пошук здійснюється за його значенням;
- def — значення стовпчика по замовченню.
- string fieldSeek( int row, XMLNodeObj fld ); — запитує поле row таблиці. Якщо поле отримано то повертається "1" інакше "0". У випадку помилки повертається "0:Error".
- string fieldGet( XMLNodeObj fld ); — запитує значення поля. У випадку помилки повертається "0:Error".
req = SYS.XMLNode("field"); req.childAdd("user").setAttr("type","str").setAttr("key","1").setText("root"); req.childAdd("id").setAttr("type","str").setAttr("key","1").setText("/Lang2CodeBase"); req.childAdd("val").setAttr("type","str"); SYS.BD.MySQL.GenDB.SYS.fieldGet(req); SYS.messDebug("TEST DB","Value: "+req.childGet(2).text());
- string fieldSet( XMLNodeObj fld ); — встановлює поле. У випадку помилки повертається "0:Error".
- string fieldDel( XMLNodeObj fld ); — видаляє поле. У випадку помилки повертається "0:Error".
7 Підсистема "Збір даних" (SYS.DAQ)
Функції об'єкту підсистеми (SYS.DAQ):
- TCntrNodeObj daqAt(string path, string sep = "", waitForAttr = true) — підключається до DAQ вузла (об'єкт контролеру, параметр, атрибут) за шляхом path або поділюваним рядком за поділювачем sep, від DAQ-підсистеми. Перевіряти на атрибут у кінці шляху, за waitForAttr.
- bool funcCall( string progLang, TVarObj args, string prog, string fixId = "", string err = "" ); — виконує текст функції prog з аргументами у об'єкті args на мові програмування progLang та з ідентифікатором фіксації fixId (автоматично якщо порожній). Повертає "true" при коректному виконанні, інакше "false" та встановлюється "err". Фіксована функція відрізняється від автоматичної тим, що вона не видаляється після виконання, а використовується повторно за адресою у fixId, яка замінює оригінальний ідентифікатор при першому виклику. Для переформування функції треба змінити програму або очистити fixId у її оригінальний ідентифікатор.
var args = new Object(); args.y = 0; args.x = 123; SYS.DAQ.funcCall("JavaLikeCalc.JavaScript",args,"y=2*x;"); SYS.messDebug("TEST Calc","TEST Calc rezult: "+args.y);
- string funcSnthHgl(string progLang); — запит правил підсвітлення синтаксису мови програми progLang у XML-тегу SnthHgl.
Функції об'єкту контролеру (SYS.DAQ["Modul"]["Controller"]):
- ElTp cfg( string nm ) — отримує значення конфігураційного поля nm об'єкту.
- bool cfgSet( string nm, ElTp val ) [доступ до відповідної підсистеми] — встановлює конфігураційне поля nm об'єкту у значення val.
- string name( ) — ім'я об'єкту контролера.
- string descr( ) — опис об'єкту та контролеру.
- string status( ) — статус контролеру.
- bool messSet( string mess, int lev, string type2Code = "OP", string prm = "", string cat = "") — встановлює повідомлення джерела даних mess із рівнем lev, для параметру prm ({PrmId}), додатковою інформацією категорії cat та кодом типу type2Code. Ця функція формує повідомлення з уніфікованою категорією транспортування через джерело даних {type2Code}{ModId}:{CntrId}[.{PrmId}][:{cat}], де:
- type2Code — двосимвольний код типу повідомлення, по замовченню означає дію оператору "OP";
- ModId — ідентифікатор модуля;
- CntrId — ідентифікатор об'єкту контролера;
- PrmId — ідентифікатор параметру, з аргументу prm;
- cat — додаткова інформація категорії яку визначено для типу type2Code.
- bool alarmSet( string mess, int lev = -5, string prm = "", bool force = false ) — встановлює/знімає порушення mess із рівнем lev (негативне для встановлення інакше зняття), для параметру prm ({PrmId}\n{PrmNm}). Очищення порушень, так як і встановлення, працює у режимі перемикача, що передбачає пропуск повідомлень очищення до буферу повідомлень, та саме очищення, лише за наявності відповідного порушення, що може бути вимкнено встановленням force. Функція формує порушення з категорією al{ModId}:{CntrId}[.{PrmId}] та текстом {CntrNm} > {PrmNm}: {MessText}, де:
- ModId — ідентифікатор модуля;
- CntrId — ідентифікатор об'єкту контролера;
- PrmId — ідентифікатор параметру, з аргументу prm;
- CntrNm — назва об'єкту контролера;
- PrmNm — назва параметру, з аргументу prm;
- MessText — текст повідомлення.
- bool enable( bool newSt = EVAL ) — отримує стан "Включений" або змінює його призначенням атрибуту newSt.
- bool start( bool newSt = EVAL) — отримує стан "Виконується" або змінює його призначенням атрибуту newSt.
Функції об'єкту параметру контролера (SYS.DAQ["Modul"]["Controller"]["Parameter"]):
- ElTp cfg( string nm ) — отримує значення конфігураційного поля nm об'єкту.
- bool cfgSet( string nm, ElTp val ) [доступ до відповідної підсистеми] — встановлює конфігураційне поля nm об'єкту у значення val.
- TCntrNodeObj cntr( ) — повертає об'єкт контролеру цього параметру, незалежно від вкладеності.
- bool messSet( string mess, int lev, string type2Code = "OP", string cat = "") — встановлює повідомлення джерела даних mess із рівнем lev, для параметру.
- bool alarmSet( string mess, int lev = -5, bool force = false ) — встановлює/знімає порушення mess з рівнем lev (негативне для встановлення інакше зняття) для цього параметру. Очищення порушень, так як і встановлення, працює у режимі перемикача, що передбачає пропуск повідомлень очищення до буферу повідомлень, та саме очищення, лише за наявності відповідного порушення, що може бути вимкнено встановленням force.
Функції об'єкту атрибута параметра контролера (SYS.DAQ["Modul"]["Controller"]["Parameter"]["Attribute"]):
- ElTp get( int tm = 0, int utm = 0, bool sys = false ) — запитує значення атрибуту на час tm.utm та ознакою системного доступу sys. Атрибути часу tm.utm є також виходами, відтак реальний час отриманого значення розміщується у них, якщо це змінні.
- bool set( ElTp val, int tm = 0, int utm = 0, bool sys = false ) — записує значення val до атрибуту з міткою часу tm:utm та ознакою системного доступу sys.
- TCntrNodeObj arch( ) — отримує об'єкт архіву, пов'язаний з цим атрибутом. У випадку відсутності пов'язаного архіву повертається "false".
- string descr( ) — опис атрибуту.
- int time( int utm ) — час останнього значення у секундах та мікросекундах у utm, якщо вказано та є змінною.
- int len( ) — довжина поля у БД.
- int dec( ) — роздільна здатність реального числа поля у БД.
- int flg( ) — прапорці поля.
- string def( ) — значення по замовченню.
- string values( ) — перелік допустимих значень або діапазон.
- string selNames( ) — перелік імен допустимих значень.
- string reserve( ) — резервна властивість значення.
Функції об'єкта бібліотеки шаблона (SYS.DAQ[tmplb_Lib"]) та шаблону (SYS.DAQ[tmplb_Lib"]["Tmpl"]) параметра контролеру:
- ElTp cfg( string nm ) — отримує значення конфігураційного поля nm об'єкту.
- bool cfgSet( string nm, ElTp val ) [доступ до відповідної підсистеми] — встановлює конфігураційне поля nm об'єкту у значення val.
7.1 Модуль DAQ.JavaLikeCalc
Об'єкт "Бібліотека функцій" (SYS.DAQ.JavaLikeCalc["lib_Lfunc"])
- ElTp {funcID}(ElTp prm1, ...) — викликає функцію "funcID" бібліотеки "Lfunc" з параметрами prm{N}. Повертає результат викликаної функції. Префікс "lib_" перед ідентифікатором бібліотеки обов'язковий!
Об'єкт "Користувацька функція" (SYS.DAQ.JavaLikeCalc["lib_Lfunc"]["func"])
- ElTp call(ElTp prm1, ...) — викликає функцію "func" бібліотеки "Lfunc" з параметрами prm{N}. Повертає результат викликаної функції. Префікс "lib_" перед ідентифікатором бібліотеки обов'язковий!
7.2 Модуль DAQ.LogicLev
7.3 Модуль DAQ.BlockCalc
Об'єкт "Блок" (SYS.DAQ.BlockCalc["cntr"]["blk_block"])
- ElTp cfg(string nm) — отримання значення конфігураційного поля nm об'єкта.
- bool cfgSet(string nm, ElTp val) [доступ до відповідної підсистеми] — установка конфігураційного поля nm об'єкта у значення val.
- TCntrNodeObj cntr() — повертає об'єкт контролеру цього параметру, незалежно від вкладеності.
7.4 Модуль DAQ.ModBus
Об'єкт "Контролер" [this.cntr()]
- string messIO(string pdu) — відправка PDU pdu через транспорт об'єкту контролеру за посередництвом ModBus протоколу. PDU результату запиту розташовується замість запиту у pdu, а помилка повертається у результаті функції.
- ElTp value( string addr, ElTp setVl = NULL ) — прямий доступ до значення-регістрів із реєстрацією для збору.
- addr — адреса значення-регістрів у стандартному форматі;
- setVl — встановлюване значення, NULL (не визначено) лише для отримання.
7.5 Модуль DAQ.Siemens
Об'єкт "Контролер" [this.cntr()]
- ElTp value( string addr, ElTp setVl = NULL ) — прямий доступ до значення із реєстрацією для збору.
- addr — адреса значення у стандартному форматі;
- setVl — встановлюване значення, NULL (не визначено) лише для отримання.
7.6 Модуль DAQ.OPC_UA
Об'єкт "Контролер" [this.cntr()]
- ElTp value( string addr, ElTp setVl = NULL ) — прямий доступ до значення-вузла із реєстрацією для збору.
- addr — адреса значення-вузла у стандартному форматі;
- setVl — встановлюване значення, NULL (не визначено) лише для отримання.
8 Підсистема "Архіви-Історія" (SYS.Archive)
Функції об'єкту підсистеми:
- Array messGet( int btm, int etm, string cat = "", int lev = 0, string arch = "", int upTm = 0 ); — запитує повідомлення програми або порушеня (lev < 0) на час від btm по etm для категорії cat, рівня lev (-7...7) та архіваторів arch (поділені символом ';'; "" — буфер та архіватори; "<buffer>" — буфер; "{ArhMod}.{Arh}" — конкретний архіватор модуля). upTm встановлює обмеження тривалості операції у визначений час; негативне значення використовується як відносний час; менше ніж STD_INTERF_TM (5). Повертається час зупинки читання (атрибут "tm" масиву) та масив об'єктів повідомлень/порушень з властивостями:
- tm — час повідомлення, секунди;
- utm — час повідомлення, мікросекунди;
- categ — категорія повідомлення;
- level — рівень повідомлення;
- mess — текст повідомлення.
- bool messPut( int tm, int utm, string cat, int lev, string mess, string arch = "" ); — записує повідомлення mess з категорією cat, рівнем lev (-7...7) та часом tm.utm до архіваторів arch (поділені символом ';') та/або перелік порушень.
Функції об'єкту архіватору повідомлень (SYS.Archive["mod_Modul"]["mess_Archivator"]):
- ElTp cfg( string nm ) — отримує значення конфігураційного поля nm об'єкту.
- bool cfgSet( string nm, ElTp val ) [доступ до відповідної підсистеми] — встановлює конфігураційне поля nm об'єкту у значення val.
- bool status( ) — статус архіватору "Виконання".
- int end( ) — час закінчення даних архіватору.
- int begin( ) — час початку даних архіватору.
Функції об'єкту архіватору значень (SYS.Archive["val_Modul"]["val_Archivator"]):
- ElTp cfg( string nm ) — отримує значення конфігураційного поля nm об'єкту.
- bool cfgSet( string nm, ElTp val ) [доступ до відповідної підсистеми] — встановлює конфігураційне поля nm об'єкту у значення val.
- bool status( ) — статус архіватору "Виконання".
Функції об'єкту архіву (SYS.Archive["va_Archive"]):
- ElTp cfg( string nm ) — отримує значення конфігураційного поля nm об'єкту.
- bool cfgSet( string nm, ElTp val ) [доступ до відповідної підсистеми] — встановлює конфігураційне поля nm об'єкту у значення val.
- bool status( ) — статус архіву "Виконання".
- int end( string arch = "" ) — час закінчення даних архіву для архіватору arch, у мікросекундах.
- int begin( string arch = "" ) — час початку даних архіву для архіватору arch, у мікросекундах.
- int period( string arch = "" ) — період даних архіву для архіватору arch, у мікросекундах.
- TArrayObj archivatorList( ) — перелік архіваторів, які використовують цей архів як джерело.
- VarType getVal( int tm, bool up_ord = false, string arch = "" ) — отримує значення з архіву на час tm, підтягненням догори up_ord та архіватору arch:
- tm — час запитаного значення, у мікросекундах, встановити у 0 для "end()"; цей атрибут є також виходом, відтак реальний час отриманого значення поміщається сюди, якщо це змінна;
- up_ord — підтягувати час запитаного значення догори ґратки;
- arch — архіватор запиту, встановити у порожній рядок для перевірки всіх архіваторів, встановити у "<buffer>" для обробки тільки буферу.
- bool setVal( int tm, VarType vl, string arch = "" ) [доступ до підсистеми Архіви-Історія] — встановлює значення vl у архів на час tm та архіватор arch:
- tm — час встановленого значення, у мікросекундах;
- vl — значення;
- arch — архіватор встановлення, встановити у порожній рядок для всіх архіваторів, встановити у "<buffer>" для обробки тільки буферу.
- Array getVals( int begTm, int endTm, int period, string arch = "" ) — отримує архів/історію значень з begTm та до endTm для архіватору arch:
- begTm — час початку запитаного діапазону даних, у мікросекундах, буде змінено у реальний початок даних;
- endTm — час закінчення запитаного діапазону даних, у мікросекундах;
- period — період даних, у мікросекундах, має бути обов'язково визначене та буде використане максимальне значення для цього архіву, буде змінено у періодичність реальних даних;
- arch — архіватор запиту, встановити у порожній рядок для перевірки всіх архіваторів, встановити у "<buffer>" для обробки тільки буферу.
- bool setVals( Array buf, int tm, int period, string arch = "" ) [доступ до підсистеми Архіви-Історія] — встановлює значення архіву/історії buf у архів від часу початку tm, для періоду значень period та архіватору arch.
- buf — масив значень до встановлення;
- tm — час початку встановлюваного діапазону даних, у мікросекундах;
- period — період встановлюваних даних, у мікросекундах, має бути обов'язково визначене та буде використане максимальне значення для цього архіву, буде змінено у періодичність реальних даних;
- arch — архіватор запиту, встановити у порожній рядок для перевірки всіх архіваторів, встановити у "<buffer>" для обробки тільки буферу.
9 Підсистема "Транспорти" (SYS.Transport)
Функції об'єкту підсистеми:
- TCntrNodeObj outAt( string addr ); — загальне-уніфіковане підключення вихідного транспорту за адресою addr у формі:
- "{TrModule}.[out_]{TrID}[:{TrAddr}]" — типове вихідне із автоматичним створенням TrID за відсутності та наявності TrAddr;
- "{TrModule}.in_{TrID}:{RemConId}" — ініціативне вхідне із ідентифікатором підключення у RemConId.
Функції об'єкту вхідного транспорту (SYS.Transport["Modul"]["in_Transp"]):
- ElTp cfg( string nm ) — отримує значення конфігураційного поля nm об'єкту.
- bool cfgSet( string nm, ElTp val ) [доступ до відповідної підсистеми] — встановлює конфігураційне поля nm об'єкту у значення val.
- string status() — рядок статусу транспорту.
- string addr( string vl = "" ) — адреса транспорту, встановлює у непорожнє значення vl.
- string writeTo( string sender, string mess ) — відправляє повідомлення mess відправнику sender, як відповідь.
- TArrayObj associateTrsList( ) — перелік асоційованих вихідних транспортів із цим вхідним.
- TCntrNodeObj associateTr( string id ) — отримання асоційованого транспорту за підключенням id.
- ElTp conPrm( string id, ElTp val = EVAL, string cfg = "" ) — загальне поводження із параметром часу підключення id з встановленням у значення val за наявності; запит конфігураційного параметру часу підключення із реєстрацією конфігурації cfg у форматі "{SRC}\n{NAME}\n{HELP}" вперше.
- bool setConPrm( string id, ElTp val ) — встановлення параметру часу підключення id у значення val, лише для сумісності.
Функції об'єкту вихідного транспорту (SYS.Transport["Modul"]["out_Transp"]):
- bool isNetwork() — ознака — "Транспорт мережевий", що визначає таймаути у секундах.
- ElTp cfg(string nm) — отримує значення конфігураційного поля nm об'єкту.
- bool cfgSet(string nm, ElTp val) [доступ до відповідної підсистеми] — встановлює конфігураційне поле nm об'єкту у значення val.
- string status() — рядок статусу транспорту.
- bool start( bool vl = EVAL, int tm = 0 ) — повертає статус "Виконання", запускає/зупиняє за vl (якщо не <EVAL>). Для запуску можна вказувати особливий таймаут tm.
- string addr( string vl = "" ) — адреса транспорту, встановлює у непорожнє значення vl.
- string timings( string vl = "", isDef = true ) — таймінги транспорту, встановлює у непорожнє значення vl та по замовченню для isDef.
- int attempts( int vl = EVAL ) — спроб підключень транспорту, встановлює у не-EVAL значення vl.
- ElTp conPrm( string id, ElTp val = EVAL, string cfg = "" ) — загальне поводження із параметром часу підключення id з встановленням у значення val за наявності; запит конфігураційного параметру часу підключення із реєстрацією конфігурації cfg у форматі "{SRC}\n{NAME}\n{HELP}" вперше.
- bool setConPrm( string id, ElTp val ) — встановлення параметру часу підключення id у значення val, лише для сумісності.
- string messIO( string mess, real timeOut = 0, int inBufLen = -1 ); — відправляє повідомлення mess через транспорт з таймаутом очікування відповіді timeOut (у секундах) та читає відповідь (буфер) розміром inBufLen байт. У випадку нульового таймауту цей час береться з налаштувань вихідного транспорту. Негативний час timeOut (< -1e-3) вимикає роботу транспорту у режимі запит/відповідь та дозволяє незалежно читати/писати у буфер ВВ, з таймаутом читання timeOut у абсолютному значенні. Для негативного inBufLen розмір буферу встановлюється у STR_BUF_LEN(10000), а "0" вимикає читання взагалі.
Якщо Ваш транспорт у відповідь на запит передбачає отримання даних частинами тоді використовуйте цю функцію у одному потоці для декількох пристроїв на одній шині-транспорті оскільки тут не існує способу блокування транспорту з користувацького API. Один потік це об'єкт контролеру підсистеми "Збір даних", а модуль "Протокол користувача" блокує транспорт всередині, перед виконанням своїх користувацьких процедур.
rez = SYS.Transport.Serial.out_ttyUSB0.messIO(SYS.strFromCharCode(0x4B,0x00,0x37,0x40),0.2); //Wait for all the message tail by timeout and empty result while(rez.length && (trez=SYS.Transport.Serial.out_ttyUSB0.messIO("")).length) rez += trez;
- string messIO( XMLNodeObj req, string prt ); — відправляє запити req до протоколу prt для здійснення сеансу зв'язку через транспорт за посередництвом протоколу. Повертає рядок із помилкою у форматі "{errCod}:{errText}", який порожній для успішного запиту.
req = SYS.XMLNode("TCP"); req.setAttr("id","test").setAttr("reqTm",500).setAttr("node",1).setAttr("reqTry",2).setText(SYS.strFromCharCode(0x03,0x00,0x00,0x00,0x05)); SYS.Transport.Sockets.out_testModBus.messIO(req,"ModBus"); test = Special.FLibSYS.strDec4Bin(req.text());
10 Підсистема "Протоколи" (SYS.Protocols)
10.1 Модуль Protocol.HTTP
Вхідна частина об'єкту модуля (SYS.Protocol.HTTP.{In})
- bool setUser( string user ) — змінює користувача пов'язаного із ідентифікатором сеансу автентифікації.
- user — користувач для зміни.
- bool pgAccess(string URL) — перевіряє доступність сторінки, визначеної у URL.
- URL — URL сторінки, що перевіряється.
- string pgCreator(string cnt, string rcode = "", string httpattrs = "Content-Type: text/html;charset={SYS}", string htmlHeadEls = "", string forceTmplFile = "") — формує сторінку або ресурс із вмістом cnt, загорнутим у HTTP з результатом rcode, із додатковими атрибутами HTTP httpattrs, додатковим елементом заголовку HTML htmlHeadEls та використанням файлу шаблону forceTmplFile та для мови lang.
- cnt — вміст сторінки або ресурсу (зображення, XML, CSS, JavaScript, ...);
- rcode — результуючий код HTTP, на кшталт "200 OK"; порожнє значення вимикає додання HTTP заголовку;
- httpattrs — додаткові атрибути HTTP, переважно це "Content-Type" із значенням по замовченню "text/html;charset={SYS}"; тільки для "Content-Type: text/html" буде здійснюватися загортання у внутрішній/сервісний, або визначений forceTmplFile, HTML-шаблон;
- htmlHeadEls — додатковий тег заголовку HTML, переважно це META з "Refresh" для вказаного URL;
- forceTmplFile — файл прямо визначеного шаблону для перекриття внутрішнього/сервісного або головної сторінки.
11 Підсистема "Користувацькі інтерфейси" (SYS.UI)
- string mimeGet(string fnm); — отримання типу MIME за назвою файлу fnm.
11.1 Модуль QTStarter
Об'єкт модуля (SYS.UI.QTStarter)
- Array sensors() — отримати всі наявні сенсори від Qt mobility, повертає "false" якщо не доступно жодного сенсору.
11.2 Модуль UI.VCAEngine
Об'єкт "Сеанс" ( this.ownerSess() )
- string user( ) — поточний користувач сеансу.
- int alrmQuietance( int quit_tmpl, string wpath = "", bool ret = false ) — стишує порушення wpath з шаблоном quit_tmpl. Якщо wpath це порожній рядок то здійснюється глобальне стишення. У рядку wpath, через символ ';', може бути перелічено адреси декількох віджетів. При встановлені ret здійснюється повернення стишення.
- int reqTm( ) — час останнього запиту у секундах від епохи 1.1.1970.
- string reqUser( ) — користувач останнього запиту.
- string reqLang( ) — мова останнього запиту.
- int userActTm( ) — час останньої дії користувача у секундах від епохи 1.1.1970.
- bool uiCmd( string cmd, string prm, string src ) — надсилає UI команду керування сторінками, як то: "open", "next", "prev"; детальніше дивиться у секції подій. Ця функція має бути пріоритетною для використання у керуванні сторінками перед прямим записом до атрибутів сторінок "pgOpen" та "pgOpenSrc", оскільки це єдиний метод коректної поводження з лінкованими сторінками.
- int period( bool isReal = false ) — отримання періоду опрацювання сеансу, isReal для реального періоду.
Об'єкт "Віджет" (this)
- TCntrNodeObj ownerSess( ) — об'єкт сеансу даного віджету.
- TCntrNodeObj ownerPage( ) — об'єкт батьківської сторінки даного віджету.
- TCntrNodeObj ownerWdg( bool base = false ) — об'єкт батьківського віджету даного віджету. При указанні base буде повернено й об'єкти сторінок.
- TCntrNodeObj wdgAdd( string wid, string wname, string parent ) — додає віджет wid з ім'ям wname на основі бібліотечного віджету parent.
//Додає новий віджет на основі віджету текстового примітиву
nw = this.wdgAdd("nw", "Новий віджет", "/wlb_originals/wdg_Text");
nw.attrSet("geomX", 50).attrSet("geomY", 50);
- bool wdgDel( string wid ) — видаляє віджет wid.
- TCntrNodeObj wdgAt( string wid, bool byPath = false ) — підключається до дочірнього або глобального віджету, за посередництвом шляху byPath. Для відсутніх і некоректних віджетів ця функція повертатиме "false", тоді як коректний віджет при перетворені у BOOLEAN повертатиме "true". У випадку глобального підключення можна використати абсолютний або відносний шлях до віджету. Точкою відліку абсолютної адреси виступає об'єкт кореня модуля "VCAEngine", а значить, першим елементом абсолютної адреси є ідентифікатор сеансу, який опускається. Відносна адреса бере відлік від поточного віджету. Спеціальним елементом відносної адреси є елемент вищестоящого вузла "..".
- Array attrList() — перелік атрибутів віджету.
- bool attrPresent( string attr ) — перевіряє атрибут віджета attr на факт присутності.
- ElTp attr( string attr, bool fromSess = false ) — значення атрибуту віджету attr або з сеансу fromSess. Для відсутніх атрибутів повертає порожній рядок.
- TCntrNodeObj attrSet( string attr, ElTp vl, bool toSess = false ) — встановлює значення vl у атрибут віджету attr або сеанс, для toSess. Повертає поточний об'єкт, для конкатенації функцій встановлення.
- string link( string attr, bool prm = false ) — посилання атрибуту віджету attr. При встановленні prm запитує посилання групи атрибутів (параметр), представлене вказаним атрибутом.
- string linkSet( string attr, string vl, bool prm = false ) — встановлює посилання атрибуту віджету attr. При встановленні prm здійснює встановлення посилання групи атрибутів (параметр), представленого вказаним атрибутом.
//Встановлює посилання восьмого тренду параметром
this.linkSet("el8.name", "prm:/LogicLev/experiment/Pi", true);
- string {resource,mime}( string addr, string MIME = "" ) — ресурс об'єкту за адресою addr (пряме посилання на ресурс або атрибут віджету з цим посиланням) з типом MIME, з таблиці сеансу або джерела. Призначено для редагування ресурсу об'єкта та підставлення його у контексті сеансу, наприклад, зображень SVG.
- int {resourceSet,mimeSet}( string addr, string data, string MIME = "" ) — встановлює ресурс об'єкту у data з типом MIME за адресою addr.
- int messDebug( string mess ); int messInfo( string mess ); int messNote( string mess ); int messWarning( string mess ); int messErr( string mess ); int messCrit( string mess ); int messAlert( string mess ); int messEmerg( string mess ); — формує повідомлення програми mess з категорією — шлях до даного віджету.
- int calcPer( int set = EVAL ) — отримання, та встановлення за set не EVAL, щодо актуального періоду обчислення-опрацювання. Зарезервовано наступні спеціальні значення:
- 0 — якщо бажаєте періодичного опрацювання сеансу;
- -1 — якщо бажаєте використати період опрацювання батьківського віджету/сторінки/проєкту каскадно;
- -2 — для цілковитого вимкнення періодичного опрацювання.
- -3 — відсутній період часу сеансу, отримання проєктного.
Об'єкт "Віджет", примітиву "Документ" (this)
- string getArhDoc( int nDoc) — текст документу архіву на глибині nDoc (0-{aSize-1}).
12 Підсистема "Спеціальні" (SYS.Special)
12.1 Модуль Бібліотека системного API середовища користувацького програмування (Special.FLibSYS)
Об'єкт "Бібліотека функцій" (SYS.Special.FLibSYS)
- ElTp {funcID}(ElTp prm1, ...) — виклик функції бібліотеки {funcID}. Повертає результат викликаної функції.
Об'єкт "Користувацька функція" (SYS.Special.FLibSYS["funcID"])
- ElTp call(ElTp prm1, ...) — виклик цієї функції з параметрами <prm{N}>. Повертає результат викликаної функції.
12.2 Модуль Бібліотека стандартних математичних функцій (Special.FLibMath)
Об'єкт "Бібліотека функцій" (SYS.Special.FLibMath)
- ElTp {funcID}(ElTp prm1, ...) — виклик функції бібліотеки {funcID}. Повертає результат викликаної функції.
Об'єкт "Користувацька функція" (SYS.Special.FLibMath["funcID"])
- ElTp call(ElTp prm1, ...) — виклик цієї функції з параметрами <prm{N}>. Повертає результат викликаної функції.
12.3 Модуль Бібліотека функцій сумісності з SCADA Complex1 фірми ТОВ НІП "DIYA" (Special.FLibComplex1)
Об'єкт "Бібліотека функцій" (SYS.Special.FLibComplex1)
- ElTp {funcID}(ElTp prm1, ...) — виклик функції бібліотеки {funcID}. Повертає результат викликаної функції.
Об'єкт "Користувацька функція" (SYS.Special.FLibComplex1["funcID"])
- ElTp call(ElTp prm1, ...) — виклик цієї функції з параметрами <prm{N}>. Повертає результат викликаної функції.
13 Бібліотеки функцій користувача
На цей час OpenSCADA має бібліотеки функцій користувача, написані з використанням цього API користувача. Деякі з них розроблено для виключного використання з цього API. Всі бібліотеки користувача представлено у наступній таблиці:
Назва | Версія | Ліцензія | Джерело | Мови |
---|---|---|---|---|
Бібліотеки джерел даних, служб та обробки | ||||
Основна бібліотека | 2.3 | GPLv2 | OscadaLibs.db (SQL, GZip) > DAQ.tmplb_base | en, uk, ru |
Бібліотека промислових пристроїв | 3.1 | GPLv2 | OscadaLibs.db (SQL, GZip) > DAQ.tmplb_DevLib | en, uk, ru |
Бібліотека низькорівневих сенсорів та чипів | 1.6 | GPLv2 | OscadaLibs.db (SQL, GZip) > DAQ.tmplb_LowDevLib | en, uk, ru |
Бібліотека сервісних процедур | 1.2 | GPLv2 | OscadaLibs.db (SQL, GZip) > DAQ.JavaLikeCalc.servProc | en, uk, ru |
Бібліотека елементів регулювання | 1.0 | GPLv2 | OscadaLibs.db (SQL, GZip) > DAQ.JavaLikeCalc.regEl | en, uk, ru |
Бібліотека моделей апаратів технологічних процесів | 2.0 | GPLv2 | OscadaLibs.db (SQL, GZip) > DAQ.JavaLikeCalc.techApp | en, uk, ru |
Бібліотеки графічних елементів OpenSCADA модуля UI.VCAEngine | ||||
Бібліотека основних елементів інтерфейсу користувача | 2.2 | GPLv2 | vcaBase.db (SQL, GZip) > VCA.wlb_Main | en, uk, ru |
Бібліотека елементів мнемосхем інтерфейсу користувача | 1.0 | GPLv2 | vcaBase.db (SQL, GZip) > VCA.wlb_mnEls | en, uk, ru |
Бібліотека електричних елементів користувацького інтерфейсу | 2.0 | GPLv2 | vcaElectroEls.db (SQL, GZip) > VCA.wlb_ElectroEls | en, uk, ru |
Комбіновані бібліотеки | ||||
Бібліотека звітів та документів | 2.0, 2.1 | GPLv2 |
OscadaLibs.db (SQL, GZip) > DAQ.JavaLikeCalc.doc |
en, uk, ru |
Рецепти | 1.1, 1.1 | GPLv2 |
OscadaLibs.db (SQL, GZip) > DAQ.tmplb_PrescrTempl |
en, uk, ru |