|
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 c именем 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 секунд (c точностью до наносекунд) и 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 по правилe 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.
- 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.
Объект "Виджет" (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, виджету. В случае глобального подключения можно использовать абсолютный или относительный путь к виджету. Точкой отсчёта абсолютного адреса выступает объект корня модуля "VCAEngine", а значит первым элементом абсолютного адреса является идентификатор сеанса, который опускается. Относительный адрес берёт отсчёт от текущего виджета. Специальным элементом относительного адреса является элемент вышестоящего узла "..".
- bool attrPresent( string attr ) — проверка атрибута виджета attr на факт присутствия.
- ElTp attr( string attr, bool fromSess = false ) — получение значения атрибута виджета attr или из сеанса fromSess. Для отсутствующих атрибутов возвращается пустая строка.
- TCntrNodeObj attrSet( string attr, ElTp vl, bool toSess = false ) — установка атрибута виджета attr в значение vl, или в сеанс 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 mime( string addr, string type = "" ) — получение "mime" объекта по адресу addr (прямая ссылка на ресурс или атрибут виджета с этой ссылкой) с типом в type, из таблицы сеанса или источника. Предназначено для редактирования "mime" объекта и подстановки его в контексте сеанса, например, изображений SVG.
- int mimeSet( string addr, string data, string type = "" ) — установка "mime" объекта data с типом type по адресу 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 с категорией как путь к данному виджету.
Объект "Виджет", примитива "Документ" (this)
- string getArhDoc( int nDoc) — получить текст документа архива на глубине nDoc (0-{aSize-1}).
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 ...