|
The translation checking and actualizing
|
Автор: Роман Савоченко
До початку програмування у OpenSCADA Ви маєте вивчити структуру об'єктів програми у посібнику по програмі OpenSCADA. З цього документу Ви побачите, що Ви можете як користувач програмувати наступні частини OpenSCADA:
API користувацького програмування представляє собою дерево об'єктів OpenSCADA, кожний об'єкт якого може надавати власний перелік властивостей та функцій. Властивості та функції об'єктів можуть використовуватися користувачем у процедурах на мовах користувацького програмування OpenSCADA.
На цей час OpenSCADA надає тільки одну мову текстового програмування це JavaLikeCalc, відповідно Ви також повинні її вивчити перед початком. Точкою входу для доступу до об'єктів OpenSCADA з мови користувацького програмування JavaLikeCalc є зарезервоване слово "SYS" кореневого об'єкту OpenSCADA. Наприклад, для доступу до функції вихідного транспорту треба записати: SYS.Transport.Serial.out_ModBus.messIO(mess);.
API об'єктів, які надаються модулями, описуються у власній документації модулів.
1 Загальносистемні користувацькі об'єкти
JavaLikeCalc надає підтримку типу даних об'єкт "Object". Об'єкт представляє собою асоціативний контейнер властивостей та функцій. Властивості можуть містити як дані чотирьох базових типів, так і інші об'єкти. Доступ до властивостей об'єкту може здійснюватися за посередництвом запису імен властивостей через точку до об'єкту obj.prop, а також за посередництвом заключення імені властивості у квадратні дужки obj["prop"]. Очевидно, що перший механізм статичний, а другий дозволяє вказувати ім'я властивості через змінну. Видалити властивість об'єкту можна директивою "delete". Читання невизначеної властивості поверне EVAL. Створення об'єкту здійснюється за посередництвом ключового слова new: varO = new Object(). Базове визначення об'єкту не містить функцій. Операції копіювання об'єкту насправді роблять посилання на вихідний об'єкт. При видаленні об'єкту здійснюється зменшення лічильника посилань, а при досягнення лічильника посилань нуля об'єкт видаляється фізично.
Різні компоненти можуть довизначати базовий об'єкт особливими властивостями та функціями. Стандартним розширенням об'єкту є масив "Array", який створюється командою varO = new Array(prm1,prm2,prm3,...,prmN). Перелічені через кому параметри поміщаються до масиву у вихідній послідовності. Якщо параметр тільки один тоді масив ініціюється вказаною кількістю порожніх елементів. Особливістю масиву є те, що він працює із властивостями як з індексами та основним механізмом звернення є заключення індексу у квадратні дужки arr[1]. Масив зберігає властивості у власному контейнері одномірного масиву. Цифрові властивості масиву використовуються для доступу безпосередньо до масиву, а символьні працюють як властивості об'єкту. Детальніше про властивості та функції масиву можна прочитати за посиланням.
Об'єкт регулярного виразу "RegExp" створюється командою varO = new RegExp(pat,flg), де pat — шаблон регулярного виразу, а flg — ознаки пошуку. Об'єкт роботи із регулярними виразами оснований на бібліотеці "PCRE". При глобальному пошуку встановлюється атрибут об'єкту "lastIndex", що дозволяє продовжити пошук при наступному виклику функції. У випадку невдалого пошуку атрибут "lastIndex" скидається у нуль. Детальніше про властивості та функції об'єкту регулярного виразу можна прочитати за посиланням.
Для довільного доступу до аргументів функції передбачено об'єкт аргументів, звернутися до якого можна за посередництвом символу "arguments". Цей об'єкт містить властивість "length" з кількістю аргументів у функції та дозволяє звернутися до значень аргументу за посередництвом його номеру або ідентифікатору. Розглянемо перебір аргументів по циклу:
args = new Array();
for(var i=0; i < arguments.length; i++)
args[i] = arguments[i];
Часткові властивості об'єкту мають і базові типи. Властивості та функції базових типів приведено нижче:
- Нульовий тип, функції:
- bool isEVal(); — Повертає "true".
- Логічний тип, функції:
- bool isEVal(); — Перевірка значення на "EVAL".
- string toString(); — Надання значення у вигляді рядка "true" або "false".
- Властивості:
- MAX_VALUE — максимальне значення;
- MIN_VALUE — мінімальне значення;
- NaN — недостовірне значення.
- Функції:
- bool isEVal(); — Перевірка значення на "EVAL".
- string toExponential( int numbs = -1 ); — Повернення рядка, відформатованого числа у експоненціальній нотації та кількістю значущих цифр numbs. Якщо numbs відсутній то цифр буде стільки скільки потрібно.
- string toFixed( int numbs = 0, int len = 0, bool sign = false ); — Повернення рядку відформатованого числа в нотації з фіксованою точкою та кількістю цифр після десяткової точки numbs з мінімальною довжиною len та обов'язковим знаком sign. Якщо numbs відсутній то кількість цифр після десяткової точки дорівнює нулю.
- string toPrecision( int prec = -1 ); — Повернення рядка відформатованого числа з кількістю значущих цифр prec.
- string toString( int base = 10, int len = -1, bool sign = false ); — Повернення рядку відформатованого числа цілого типу з базою представлення base (2-36) з мінімальною довжиною len та обов'язковим знаком sign.
- Властивості:
- int length — довжина рядка.
- Функції:
- bool isEVal(); — Перевірка значення на "EVAL".
- string charAt( int symb ); — Вилучає із рядка символ номер symb, нумерація символів з нуля.
- int charCodeAt( int symb ); — Вилучає із рядка код символу symb.
- string concat( string val1, string val2, ... ); — Повертає новий рядок сформований шляхом приєднання значень val1 і т.п. до початкового.
- int indexOf( string substr, int start ); — Повертає позицію пошукового рядка substr у вихідному рядку починаючи з позиції start. Якщо вихідна позиція не вказана то пошук починається з початку. Якщо шуканого рядка не знайдено то повертається "-1".
- int lastIndexOf( string substr, int start ); — Повертає позицію шуканого рядка substr у вихідному рядку починаючи з позиції start, при пошуку з кінця. Якщо вихідна позиція не вказана то пошук починається з кінця. Якщо шуканого рядку не знайдено то повертається "-1".
- int search( string pat, string flg = "" ); — Пошук у рядку за шаблоном pat та ознаками шаблону flg. Повертає положення найденого рядку інакше "-1".
var rez = "Java123Script".search("script","i"); // rez = 7
- int search( RegExp pat ); — Пошук у рядку за шаблоном "RegExp" pat. Повертає положення найденого підрядку інакше "-1".
var rez = "Java123Script".search(new RegExp("script","i")); // rez = 7
- Array match( string pat, string flg = "" ); — Пошук в рядку за шаблоном pat та ознаками шаблону flg. Повертає масив із знайденим підрядком (0) та підвиразами (>1). Атрибут "index" масиву встановлюється у позицію знайденого підрядка. Атрибут "input" встановлюється у початковий рядок.
var rez = "1 плюс 2 плюс 3".match("\\d+","g"); // rez = [1], [2], [3]
- Array match( TRegExp pat ); — Пошук у рядку за шаблоном "RegExp" pat. Повертає масив зі знайденим підрядком (0) та підвиразами (>1). Атрибут "index" масиву встановлюється у позицію знайденого підрядка. Атрибут "input" встановлюється у початковий рядок.
var rez = "1 плюс 2 плюс 3".match(new RegExp("\\d+","g")); // rez = [1], [2], [3]
- string slice( int beg, int end ); string substring( int beg, int end ); — Повернення підрядку вилученого з вихідного починаючи з позиції beg та до end (не включаючи), нумерація з нуля. Якщо значення початку або кінця негативне, то відлік ведеться з кінця рядку. Якщо кінець не вказано, то кінцем є кінець рядку. Наприклад, конструкція substring(-2) поверне останні два символи рядку.
- Array split( string sep, int limit ); — Повернення масиву елементів рядку поділених sep з обмеженням кількості елементів limit.
- Array split( RegExp pat, int limit ); — Повертає масив елементів рядку поділених шаблоном "RegExp" pat з обмеженням кількості елементів limit.
rez = "1,2, 3 , 4 ,5".split(new RegExp("\\s*,\\s*")); // rez = [1], [2], [3], [4], [5]
- string insert( int pos, string substr ); — Вставка в позицію pos поточного рядку підрядку substr.
- string replace( int pos, int n, string str ); — Заміна підрядку з позиції pos та довжиною n у поточному рядку на рядок str.
rez = "Javascript".replace(4,3,"67"); // rez = "Java67ipt"
- string replace( string substr, string str ); — Заміна всіх підрядків substr на рядок str.
rez = "123 321".replace("3","55"); // rez = "1255 5521"
- string replace( RegExp pat, string str ); — Заміна підрядків за шаблоном pat на рядок str.
rez = "value = \"123\"".replace(new RegExp("\"([^\"]*)\"","g"),"``$1''")); // rez = "value = ``123''"
- real toReal(); — Перетворення поточного рядку у реальне число.
- int toInt( int base = 0 ); — Перетворення поточного рядки в ціле число, у відповідності із основою base (от 2 до 36). Якщо основа дорівнює 0 тоді буде враховуватися префіксний запис для визначення основи (123-десяткове; 0123-вісімкове; 0x123-шістнадцяткове).
- string parse( int pos, string sep = ".", int off = 0 ); — Виокремлення із вихідного рядку елементу pos для поділювача елементів sep від зміщення off. Результуюче зміщення поміщається назад до off.
- string parseLine( int pos, int off = 0 ); — Виокремлення рядку з номером pos від зміщення off. Результуюче зміщення поміщається назад до off.
- string parsePath( int pos, int off = 0 ); — Виділення із початкового шляху елементу pos від зміщення off. Результуюче зміщення поміщається назад до off.
- string path2sep( string sep = "." ); — Перетворення шляху у поточному рядку у рядок з розділювачем sep.
- string trim( string cfg = " \n\t\r" ); — Обрізка рядка з початку та кінцю для символів cfg.
1.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.
- Array sort( ); — Сортування елементів масиву у лексикографічній послідовності.
1.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");
1.3 Об'єкт 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.
- XMLNodeObj childGet( string name, int num = 0 ) — Отримання вкладеного вузла з ім'ям тегу name та порядковим номером num.
- XMLNodeObj parent() — Отримання батьківського вузла.
- string load( string str, bool file = false, int flg = 0, string cp = "UTF-8" ) — Завантаження XML з рядка str або з файлу з шляхом у str якщо file "true", з кодуванням cp. 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 — опускати кодування назв атрибутів.
- XMLNodeObj getElementBy( string val, string attr = "id" ) — отримати елемент з дерева за атрибутом attr зі значенням val.
- TArrayObj<XMLNodeObj> getElementsBy( string tag, string attrVal = "", string attr = "id" ) — отримання масиву елементів з дерева за тегом tag (порожній для всіх) та атрибутом attr зі значенням attrVal (порожні для пропуску).
2 Система (SYS)
Функції об'єкту:
- {string|int} system( string cmd, bool noPipe = false); — здійснює виклик консольних команд cmd ОС з поверненням результату по каналу. Якщо noPipe встановлено то повертається код повернення виклику та можливий запуск програм у фоні ("sleep 5 &"). Функція відкриває широкі можливості користувачу OpenSCADA, викликом будь яких системних програм, утиліт та скриптів, а також отримання за посередництвом них доступу до величезного об'єму системних даних. Наприклад, команда "ls -l" поверне деталізований вміст робочої теки.
- string fileRead( string file ); — Повертає вміст файлу file у рядку.
- int fileWrite( string file, string str, bool append = false ); — Записує рядок str до файлу file, видаляючи присутній файл або додаючи до нього append. Повертає кількість записаних байт.
- int fileRemove( string file ); — Видалити файл file. Повертає результат видалення.
- int message( string cat, int level, string mess ); — формування системного повідомлення mess з категорією cat, рівнем level (-7...7). Негативне значення рівня формує порушення (Alarm).
- 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 ); — формування системного повідомлення mess з категорією cat та відповідним рівнем.
- XMLNodeObj XMLNode( string name = "" ); — створення об'єкту вузла XML з ім'ям name.
- string cntrReq( XMLNodeObj req, string stat = "" ); — запит інтерфейсу управління до системи за посередництвом XML. Зазвичай запит записується у вигляді "<get path="/OPath/%2felem"/>". При вказані станції stat здійснюється запит до вказаної зовнішньої станції. Адресу, атрибут "path", можна дізнатися у конфігураторі OpenSCADA, а саме у рядку статусу де ця адреса висвітлюється при наведені курсору миші на конфігураційне або інформаційне поле. Приклади розповсюджених запитів:
- Читання значення елементу (ім'я користувача "test"):
req = SYS.XMLNode("get").setAttr("path","/sub_Security/usr_test/%2fprm%2fDESCR");
SYS.cntrReq(req);
idSt = req.text();
- Запис значення елемента (ім'я користувача "test"):
req = SYS.XMLNode("set").setAttr("path","/sub_Security/usr_test/%2fprm%2fDESCR").setText("New test user name");
SYS.cntrReq(req);
- Додання нового вузла (користувача "test"):
req = SYS.XMLNode("add").setAttr("path","/sub_Security/%2fbr%2fusr_").setText("test");
SYS.cntrReq(req);
- Видалення вузла (користувача "test"):
req = SYS.XMLNode("del").setAttr("path","/sub_Security/%2fbr%2fusr_").setText("test");
SYS.cntrReq(req);
- Збереження змін вузла у БД (користувача "test"):
req = SYS.XMLNode("save").setAttr("path","/sub_Security/usr_test/%2fobj");
SYS.cntrReq(req);
- Завантаження вузла з БД (користувача "test"):
req = SYS.XMLNode("load").setAttr("path","/sub_Security/usr_test/%2fobj");
SYS.cntrReq(req);
- int sleep(real tm, int ntm = 0); — заспати потік виконання на tm секунд (з точністю до наносекунд) та ntm наносекунд. Час сну можна встановити не більш STD_INTERF_TM (5 секунд).
- int time( int usec ); — повертає абсолютний час у секундах від епохи 1.1.1970 та мікросекунди у usec, якщо вказано.
- int utime( ); int mtime( ); — повертає абсолютний час у мікросекундах та мілісекундах від епохи 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 ); — повертає повну дату у секундах (sec), хвилинах (min), годинах (hour), днях місяця (mday), місяцях (month), роках (year), днях тижня (wday), днях у році (yday) та ознака літнього часу (isdst), виходячи з абсолютного часу у секундах fullsec від епохи 1.1.1970. gmtime повертає час у GMT(UTC).
- int {mktime|timegm}(int sec, int min, int hour, int mday, int month, int year, int wday, int yday, int isdst); — формує час з епохи 1.1.1970 з окремо вказаних секунд, хвилин, годин, днів, місяців та інше. Значення окремих одиниць часу можуть вказуватися за їх звичним діапазоном, що дозволяє використовувати цю функцію при переборі, у результаті чого одиниці часу буде відкориговано та повернуто у звичайному діапазоні. timegm працює з часом у GMT(UTC).
- string {strftime|strftimegm}( int sec, string form = "%Y-%m-%d %H:%M:%S" ); — Перетворює абсолютний час sec у рядок потрібного формату form. Запис формату відповідає POSIX-функції strftime. strftimegm повертає час у GMT(UTC).
- int {strptime|strptimegm}( string str, string form = "%Y-%m-%d %H:%M:%S" ); — Повертає час у секундах від епохи 1.1.1970, виходячи з строкового запису часу str, відповідно до вказаного шаблону form. Наприклад, шаблону "%Y-%m-%d %H:%M:%S" відповідає час "2006-08-08 11:21:55". Опис формату шаблону можна отримати з документації на POSIX-функцію "strptime". strptimegm працює з часом у GMT(UTC).
- int cron( string cronreq, int base = 0 ); — Повертає час, спланований у форматі стандарту Cron cronreq, починаючи від базового часу base або від поточного, якщо базовий не вказано.
- string strFromCharCode( int char1, int char2, int char3, ... ); — Створення рядку з кодів символів char1, char2 ... charN.
- string strCodeConv( string src, string fromCP, string toCP ); — Кодування тексту src з кодування fromCP у toCP. Якщо кодування опущено (порожній рядок), то використовується внутрішнє.
- string strEncode( string src, string tp = "Bin", string opt1 = "" ); — Кодування рядка src за правилом tp та опцією opt1. Доступні правила:
- "PathEl" — символи '/' та '%' у "%2f" та "%25", відповідно;
- "HttpURL" — символи ' ', '\t', '%' та "> 0x80" у "%20", "%09", "%25" та інше;
- "HTML" — символи HTML-сутностей '>', '<', '"', '&', '\ у ">", "<", """ та інше;
- "JavaScript" — символ '\n' екрануванням "\\n";
- "SQL" — екрановані символи '\, '\"', '`', '\\' або дублювання перелічених символів у opt1;
- "Custom" — вказаних символів у opt1 у "%NN";
- "Base64" — бінарне кодування у Base 64, у opt1 встановлюються символ(и) переривання рядку після 57 символів;
- "FormatPrint" — символ '%' в "%%";
- "OscdID" — майже всі символи на кшталт ' ', '/', '\\', '&', '(' у '_';
- "Bin" — перелік ASCII байтів ("XX XX XX XX ...") у бінарне представлення;
- "Reverse" — інверсія послідовності;
- "ShieldSimb" — захищені символи типу '\a', '\b', ..., '\0NNN', '\xNN' у бінарне представлення.
- string strDecode( string src, string tp = "Bin", string opt1 = "" ); — Декодування рядку src за правилом tp та опцією opt1. Доступні правила:
- "PathEl", "HttpURL", "Custom" — декодування символів типу "%NN" у бінарне представлення;
- "Base64" — відповідно з Base 64;
- "Bin" — бінарного рядку у ASCII байти ("XX XX XX XX .. A.b.c.."), opt1 вказує на роздільник або "<text>" для включення зміщення ліворуч та текстової частини праворуч.
3 Будь який об'єкт (TCntrNode) дерева OpenSCADA (SYS.*)
Функції об'єкту:
- TArrayObj nodeList(string grp = "", string path = ""); — Отримання переліку ідентифікаторів дочірніх вузлів для групи grp та вузла за шляхом path. Якщо grp порожній то повертаються вузли всіх груп.
- TCntrNodeObj nodeAt(string path, string sep=""); — Підключення до вузла path у дереві об'єктів OpenSCADA. Якщо вказується роздільник у sep то шлях обробляється як рядок з роздільником. Для відсутніх та некоректних вузлів ця функція повертатиме "false" тоді як коректний вузол, при перетворені у BOOLEAN, повертатиме "true.
- TCntrNodeObj nodePrev(); — Отримати попередній, батьківський, вузол.
- string nodePath(string sep = "", bool from_root = true); — Отримання шляху до поточного вузла, у дереві об'єктів OpenSCADA. Один символ роздільника вказується у sep для отримання шляху через роздільник, наприклад, "DAQ.ModBus.PLC1.P1.var", інакше "/DAQ/ModBus/PLC1/P1/var". from_root вказує на необхідність формувати шлях від кореня та без указання ідентифікатору станції.
- int messSys( int level, string mess ) — Формування системного повідомлення mess з рівнем level, зі шляхом вузла у якості категорії та з читабельним шляхом перед повідомленням.
4 Підсистема "Безпека" (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.
- Array groups( ) — перелік груп користувача.
Функції об'єкту групи (SYS.Security["grp_Group"]):
- ElTp cfg(string nm) — отримання значення конфігураційного поля nm об'єкту.
- bool cfgSet(string nm, ElTp val) — встановлення конфігураційного поля nm об'єкту у значення val.
- bool user( string nm ) — перевірка на присутність користувача nm у даній групі.
5 Підсистема "БД" (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-запиту до БД, всередині (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".
6 Підсистема "Збір даних" (SYS.DAQ)
Функції об'єкту підсистеми (SYS.DAQ):
- bool funcCall(string progLang, TVarObj args, string prog, string fixId = ""); — виклик тексту функції prog з аргументами у об'єкті args для мови програмування progLang та з ідентифікатором фіксації fixId (автоматично якщо порожній). Повертає "true" при коректному виклику. Фіксована функція відрізняється від автоматичної тим, що вона не видаляється після виконання, а використовується повторно за адресою у 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);
Функції об'єкту контролеру (SYS.DAQ["Modul"]["Controller"]):
- ElTp cfg(string nm) — отримання значення конфігураційного поля nm об'єкту.
- bool cfgSet(string nm, ElTp val) — встановлення конфігураційного поля nm об'єкту у значення val.
- string name() — ім'я контролеру.
- string descr() — опис контролеру.
- string status() — статус контролеру.
- bool alarmSet(string mess, int lev = -5, string prm = "") — встановлення/зняття порушення mess з рівнем lev (негативне для встановлення інакше зняття), для параметру prm. Функція формує порушення з категорією: al{ModId}:{CntrId}[.{PrmId}], де:
- ModId — ідентифікатор модуля;
- CntrId — ідентифікатор контролеру;
- PrmId — ідентифікатор параметру, з аргументу prm.
- 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() — повертає об'єкт контролеру цього параметру, незалежно від вкладеності.
Функції об'єкту атрибута параметра контролера (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.
Об'єкт "Бібліотека функцій" (SYS.DAQ.JavaLikeCalc["lib_Lfunc"])
- ElTp {funcID}(ElTp prm1, ...) — виклик функції "funcID" бібліотеки "Lfunc". Повертає результат викликаної функції. Префікс "lib_" перед ідентифікатором бібліотеки обов'язковий!
Об'єкт "Користувацька функція" (SYS.DAQ.JavaLikeCalc["lib_Lfunc"]["func"])
- ElTp call(ElTp prm1, ...) — виклик функції "func" бібліотеки "Lfunc" з параметрами "prm{N}". Повертає результат викликаної функції. Префікс "lib_" перед ідентифікатором бібліотеки обов'язковий!
Об'єкт "Параметр" [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] + тільки для читання [ro];
- selValsNms — два рядки зі значеннями у першому та їх іменами у другому (поділені ";").
- bool attrDel( string id ) [для увімкненого параметру стандартного типу] — видалити атрибут id.
Об'єкт "Блок" (SYS.DAQ.BlockCalc["cntr"]["blk_block"])
- ElTp cfg(string nm) — отримання значення конфігураційного поля nm об'єкта.
- bool cfgSet(string nm, ElTp val) — установка конфігураційного поля nm об'єкта у значення val.
- TCntrNodeObj cntr() — повертає об'єкт контролеру цього параметру, незалежно від вкладеності.
Об'єкт "Контролер" [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] + тільки для читання [ro];
- selValsNms — два рядки зі значеннями у першому та їх іменами у другому (поділені ";").
- bool attrDel( string id ) [для включеного параметру логічного типу] — видалити атрибут id.
7 Підсистема "Архіви" (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>" для обробки тільки буферу.
8 Підсистема "Транспорти" (SYS.Transport)
Функції об'єкту вхідного транспорту (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 assTrsList() — перелік пов'язаних вихідних транспортів з цим вхідним.
Функції об'єкту вихідного транспорту (SYS.Transport["Modul"]["out_Transp"]):
- 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 = "" ) — повертає таймінги транспорту, встановлює у непорожнє значення vl.
- 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((trez=SYS.Transport.Serial.out_ttyUSB0.messIO("")).length) rez += trez;
- string messIO( XMLNodeObj req, string prt ); — відправка запиту req до протоколу prt для здійснення сеансу зв'язку через транспорт за посередництвом протоколу.
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());
9 Підсистема "Протоколи" (SYS.Protocols)
Саме цей об'єкт модуля "Protocol.HTTP" [SYS.Protocol.HTTP.pgCreator()]
- bool pgAccess(string URL) — перевірка доступності сторінки визначеної у URL.
- URL — URL сторінки що перевіряється.
- string pgCreator(string cnt, string rcode = "200 OK", string httpattrs = "Content-Type: text/html;charset={SYS}", string htmlHeadEls = "", string forceTmplFile = "", string lang = "" ) — формування сторінки або ресурсу із вмісту 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 — файл прямо визначеного шаблону для перекриття внутрішнього/сервісного шаблоном головної сторінки або іншим.
- lang — мова інтерфейсу, що формується.
10 Підсистема "Користувацькі інтерфейси" (SYS.UI)
Object "Session" ( this.ownerSess() )
- string user( ) — current session user.
- int alrmQuittance( int quit_tmpl, string wpath = "", bool ret = false ) — violations quittance wpath with the template quit_tmpl. If wpath is empty string then make global quittance. Into the string wpath, by symbol ';', can be enumerated addresses of several widgets. The ret sets will cause the quittance return.
- int reqTm( ) — last request time.
- string reqUser( ) — last request user.
- string reqLang( ) — last request language.
- int userActTm( ) — last user action time.
Object "Widget" (this)
- TCntrNodeObj ownerSess( ) — the session's object is getting for current widget.
- TCntrNodeObj ownerPage( ) — the parent object's page is getting for current widget.
- TCntrNodeObj ownerWdg( bool base = false ) — the parent widget is getting for current widget. If set base then will return the parent pages' objects also.
- TCntrNodeObj wdgAdd( string wid, string wname, string parent ) — add new widget wid with the name wname and based on the library widget parent.
//New widget adding, based at the text primitive
nw = this.wdgAdd("nw", "New widget", "/wlb_originals/wdg_Text");
nw.attrSet("geomX", 50).attrSet("geomY", 50);
- bool wdgDel( string wid ) — delete the widget wid.
- TCntrNodeObj wdgAt( string wid, bool byPath = false ) — attach to child or global, by byPath, widget. In the case of global connection, you can use absolute or relative path to the widget. For starting point of the absolute address acts the root object of the module "VCAEngine", which means the first element of the absolute address is session identifier, which is omitted. The relative address takes the countdown from the current widget. Special element of the relative address is an element of parent node "..".
- bool attrPresent( string attr ) — the attribute attr of the widget checking to presence fact.
- ElTp attr( string attr, bool fromSess = false ) — value of the attribute attr of the widget getting or from the session fromSess. For missing attributes will return empty string.
- TCntrNodeObj attrSet( string attr, ElTp vl, bool toSess = false ) — value of the attribute attr of the widget setting to vl, or to the session toSess. The object is returned for the function concatenation.
- string link( string attr, bool prm = false ) — the link return for the widget's attribute attr. At set prm requests the link for the attributes block (parameter), represented by the attribute.
- string linkSet( string attr, string vl, bool prm = false ) — the link set for the widget's attribute attr. At set prm makes the link set for the attributes block (parameter), represented by the attribute.
//Set link for eight trend to the parameter
this.linkSet("el8.name", "prm:/LogicLev/experiment/Pi", true);
- string mime( string addr, string type = "" ) — the "mime" object by the address addr (the direct link to the resource or the widget's attribute contained the link) getting with the type to type, from the session table or the source. It is designed for the "mime" objects edition and that substitution to this session's context, for example, images SVG.
- int mimeSet( string addr, string data, string type = "" ) — the "mime" object data with type type by address addr setting.
- 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 ); — formation of the system message mess with the category as the widget path.
Object "Widget" of the primitive "Document" (this)
- string getArhDoc( int nDoc) — getting the archive document's text to "nDoc" (0-{aSize-1}) depth.
11 Підсистема "Спеціальні" (SYS.Special)
Об'єкт "Бібліотека функцій" (SYS.Special.FLibSYS)
- ElTp {funcID}(ElTp prm1, ...) — виклик функції бібліотеки {funcID}. Повертає результат викликаної функції.
Об'єкт "Користувацька функція" (SYS.Special.FLibSYS["funcID"])
- ElTp call(ElTp prm1, ...) — виклик цієї функції з параметрами <prm{N}>. Повертає результат викликаної функції.
Об'єкт "Бібліотека функцій" (SYS.Special.FLibMath)
- ElTp {funcID}(ElTp prm1, ...) — виклик функції бібліотеки {funcID}. Повертає результат функції що викликається.
Об'єкт "Користувацька функція" (SYS.Special.FLibMath["funcID"])
- ElTp call(ElTp prm1, ...) — виклик цієї функції з параметрами <prm{N}>. Повертає результат функції що викликається.
Об'єкт "Бібліотека функцій" (SYS.Special.FLibComplex1)
- ElTp {funcID}(ElTp prm1, ...) — виклик функції бібліотеки {funcID}. Повертає результат функції що викликається.
Об'єкт "Користувацька функція" (SYS.Special.FLibComplex1["funcID"])
- ElTp call(ElTp prm1, ...) — виклик даної функції з параметрами <prm{N}>. Повертає результат функції що викликається.
Link to DB API libraries ...