OpenSCADAWiki: Home Page Uk/Doc/ Java Like Calc ...

Home | Index | Changes | Comments | Users | Registration | Login  Password:  
 
This is an old revision of HomePageUk/Doc/JavaLikeCalc from 2016-11-05 10:20:10..
English (1 Kb) English
Russian (1 Kb) Русская
 (2 Kb) Переклад

Модуль <JavaLikeCalc> підсистеми "Збір даних"

Модуль: JavaLikeCalc
Ім'я: Обчислювач на мові подібній до Java.
Тип: DAQ
Джерело: daq_JavaLikeCalc.so
Версія: 3.3.0
Автор: Роман Савоченко
Опис: Надає основані на мові подібній до Java обчислювач та рушій бібліотек. Користувач може створювати та модифікувати функції та їх бібліотеки.
Ліцензія: GPL

Contents

Вступ

Модуль контролеру JavaLikeCalc надає у системі OpenSCADA механізм створення функцій та їх бібліотек на мові подібній до Java. Опис функції на мові подібній до Java зводиться до обв'язки параметрів функції алгоритмом. Крім цього модуль наділено функціями безпосередніх обчислень шляхом створення обчислювальних контролерів.


Безпосередні обчислення забезпечуються створенням контролеру та зв'язуванням його із функцією цього-ж модуля. Для зв'язування функції створюється кадр значень, над яким і виконуються періодичні обчислення.


Модулем реалізуються функції горизонтального резервування, а саме — спільної роботи з віддаленою станцією цього-ж рівня. Окрім синхронізації значень та архівів атрибутів параметрів модулем здійснюється синхронізація значень обчислювальної функції, з метою безударного "підхоплення" алгоритмів.


Параметри функції можуть вільно створюватися, видалятися або модифікуватися. Поточна версія модуля підтримує до 65535 параметрів функції у підсумку із внутрішніми змінними. Вигляд редактору функцій показано на рис.1.


Вигляд редактору функцій. (130 Kb)
Рис.1. Вигляд редактору функцій.

Після будь-якої зміни програми або конфігурації параметрів здійснюється перекомпіляція програми із повідомленням пов'язаних з функцією об'єктів значень TValCfg. Компілятор мови побудовано із використанням відомого генератору граматики "Bison", який сумісний з не менш відомою утилітою "Yacc".


Мова використовує неявне визначення локальних змінних, яке полягає у визначені нової змінної у випадку привласнення їй значення. Причому тип локальної змінної встановлюється у відповідності з типом значення, що привласнюється. Наприклад, вираз "Qr=Q0*Pi+0.01;" визначить змінну Qr з типом змінної Q0.


У роботі з різними типами ця мова використовує механізм автоматичного приведення типів у місцях, де подібне приведення є доцільним.


Для коментування ділянок коду у мові передбачено символи "//" та "/* ... */". Все, що йде після "//" до кінця рядку та між "/* ... */", ігнорується компілятором.


У процесі генерації коду компілятор мови здійснює оптимізацію за константам та приведення типів констант до потрібного типу. Під оптимізацією констант мається на увазі виконання обчислень у процесі побудови байт-коду над двома константами та вставка результату у код. Наприклад, вираз "y=pi*10;" згорнеться у просте привласнення "y=31.4159;". Під приведенням типів констант до потрібного типу мається на увазі формування у коді константи, яка виключає приведення типу в процесі виконання. Наприклад, вираз "y=x*10", у випадку реального типу змінної x, перетвориться у "y=x*10.0".


Вирази привласнення можуть записуватися через символ ',', наприклад:

var1=1, var2=3, var4=var1+var2;
for(var1=0, var2=0, var3=-1; var1 < 10; var1++, var2++) var3++;

Мова підтримує виклики зовнішніх та внутрішніх функцій. Ім'я будь-якої функції взагалі сприймається як символ, перевірка на належність якого до тієї або іншої категорії здійснюється у наступній послідовності:


Виклик зовнішньої функції, як і атрибуту системного параметра, записується як адреса до об'єкту динамічного дерева об'єктної моделі системи OpenSCADA у вигляді: "DAQ.JavaLikeCalc.lib_techApp.klapNotLin".


Для надання можливості написання користувацьких процедур управління різними компонентами OpenSCADA цим модулем надається реалізація API прекомпіляції користувацьких процедур окремих компонентів OpenSCADA на реалізації подібної до Java мови. Такими компонентами, наприклад, є: Шаблони параметрів підсистеми "Збір даних" та Середовище візуалізації та управління (СВУ).

1. Подібна до Java мова

1.1. Елементи мови

Ключові слова: if, else, while, for, break, continue, return, function, using, true, false.
Постійні:

Типи змінних:

Вбудовані константи: pi = 3.14159265, e = 2.71828182, EVAL_BOOL(2), EVAL_INT(-9223372036854775807), EVAL_REAL,EVAL(-1.79E308), EVAL_STR("<EVAL>")
Атрибути параметрів системи OpenSCADA (починаючи з підсистеми DAQ, у вигляді "{Тип модуля DAQ}.{Контролер}.{Параметр}.{Атрибут}").
Функції об'єктної моделі системи OpenSCADA.

1.2. Операції мови

Операції, підтримувані мовою, представлено у таблиці нижче. Пріоритет операцій зменшується зверху донизу. Операції з однаковим пріоритетом входять до однієї групи кольору.

СимволОпис
()Виклик функції.
{}Програмні блоки.
++Інкремент (пост та пре).
--Декремент (пост та пре).
-Унарний мінус.
!Логічне заперечення.
~Побітове заперечення.
*Множення.
/Ділення.
%Залишок від цілочисельного ділення.
+Складання
-Віднімання
<<Поразрядний зсув ліворуч
>>Поразрядний зсув праворуч
>Більше
>=Більше або дорівнює
<Менше
<=Менше або дорівнює
==Дорівнює
!=Не дорівнює
|Порозрядне "АБО"
&Порозрядне "ТАК"
^Порозрядне "Виключне АБО"
&&Логічне "ТАК"
||Логічне "АБО"
?:Умовна операція "i=(i<0)?0:i;"
=Привласнення.
+=Привласнення із складанням.
-=Привласнення із відніманням.
*=Привласнення із множенням.
/=Привласнення із діленням.

1.3. Вбудовані функції мови

Віртуальною машиною мови передбачено наступний набір вбудованих функцій загального призначення:


Для забезпечення високої швидкості роботи у математичних обчислення модуль надає вбудовані математичні функції, які викликаються на рівні команд віртуальної машини:

1.4. Оператори мови

Загальний перелік операторів мови:


Переклад

1.4.1. Условные операторы

Языком модуля поддерживаются два типа условий. Первый — это операции условия для использования внутри выражения, второй — глобальный, основанный на условных операторах.


Условие внутри выражения строится на операциях '?' и ':'. В качестве примера можно записать следующее практическое выражение "st_open=(pos>=100)?true:false;", что читается как "Если переменная pos больше или равна 100, то переменной st_open присваивается значение true, иначе — false".


Глобальное условие строится на основе условных операторов "if" и "else". В качестве примера можно привести тоже выражение, но записанное другим способом "if(pos>100) st_open=true; else st_open=false;". Как видно, выражение записано по другому, но читается также.

1.4.2. Циклы

Поддерживаются три типа циклов: while, for и for-in. Синтаксис циклов соответствует языкам программирования: C++, Java и JavaScript.


Цикл while, в общем, записывается следующим образом: while({условие}) {тело цикла};
Цикл for записывается следующим образом: for({пре-инициализ};{условие};{пост-вычисление}) {тело цикла};
Цикл for-in записывается следующим образом: for({переменная} in {объект}) {тело цикла};
Где:

{условие} — выражение, определяющее условие;
{тело цикла} — тело цикла множественного исполнения;
{пре-инициализ} — выражение предварительной инициализации переменных цикла;
{пост-вычисление} — выражение модификации параметров цикла после очередной итерации;
{переменная} — переменная, которая будет содержать имя свойства объекта при переборе;
{объект} — объект для которого осуществляется перебор свойств.

1.4.3. Внутренние функции

Данный язык поддерживает определение и вызов внутренних функций. Для определения внутренней функции используется ключевое слово "function" и в целом определение имеет синтаксис: function {имяФ} ({пер1}, {пер2}, ... {перN}) { {тело функции} }. Определение внутренней функции внутри другой недопустимо однако допустим вызов ранее определённой.


Вызов внутренней функции осуществляется в типовой способ, как процедура {имяФ}({var1}, {var2}, ... {varN}); или как функция {перРез} = {имяФ}({пер1}, {пер2}, ... {перN});. Вызов внутренних функций допустим только после их декларации выше!


Все переменные, определённые в основном теле, недоступны в середине внутренних функций и могут быть переданы только через двухсторонние аргументы вызываемой внутренней функции. Все переменные, определённые в середине внутренней функции имеют собственную область имён и недоступны из основного тела или любой другой внутренней функции и могут быть переданы только в основное тело через двухсторонние аргументы или результат вызываемой внутренней функции.


Оператор "return" в середине внутренней функции осуществляет контролируемое её завершение и помещение указанной переменной или результата выражения как результат вызываемой внутренней функции.


Пример типового определения и использования внутренней функции представлено ниже:

1.4.4. Специальные символы строковых переменных

Языком предусмотрена поддержка следующих специальных символов строковых переменных:

"\n" — перевод строки;
"\t" — символ табуляции;
"\b" — забой;
"\f" — перевод страницы;
"\r" — возврат каретки;
"\\" — сам символ '\';
"\041" — символ '!' записанный восьмеричным числом;
"\x21" — символ '!' записанный шестнадцатеричным числом.

1.5. Объект

Языком предоставляется поддержка типа данных объект "Object". Объект представляет собой ассоциативный контейнер свойств и функций. Свойства могут содержать как данные четырёх базовых типов, так и другие объекты. Доступ к свойствам объекта может осуществляться посредством записи имён свойств через точку к объекту obj.prop, а также посредством заключения имени свойства в квадратные скобки obj["prop"]. Очевидно, что первый механизм статичен, а второй позволяет указывать имя свойства через переменную. Удалить свойства объекта можно директивой "delete". Создание объекта осуществляется посредством ключевого слова 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];

Частичными свойствами объекта обладают и базовые типы. Свойства и функции базовых типов приведены ниже:


Свойства:

Функции:


Свойства:

Функции:


Для доступа к системным объектам(узлам) OpenSCADA предусмотрен соответствующий объект, который создаётся путём простого указания точки входа "SYS" корневого объекта OpenSCADA, а затем, через точку указываются вложенные объекты в соответствии с иерархией. Например, вызов функции запроса через исходящий транспорт осуществляется следующим образом: "SYS.Transport.Sockets.out_testModBus.messIO(Special.FLibSYS.strEnc2Bin("15 01 00 00 00 06 01 03 00 00 00 05"));".

1.6. Примеры программы на языке

Приведём несколько примеров программ на Java-подобном языке:


//Модель хода исполнительного механизма шарового крана
if(!(st_close && !com) && !(st_open && com))
{
  tmp_up = (pos>0&&pos<100) ? 0 : (tmp_up>0&&lst_com==com) ? tmp_up-1/frq : t_up;
  pos += (tmp_up>0) ? 0 : (100*(com?1:-1))/(t_full*frq);
  pos = (pos>100) ? 100 : (pos<0) ? 0 : pos;
  st_open = (pos>=100) ? true : false;
  st_close = (pos<=0) ? true : false;
  lst_com = com;
}


//Модель клапана
Qr = Q0 + Q0*Kpr*(Pi-1) + 0.01;
Sr = (S_kl1*l_kl1+S_kl2*l_kl2)/100;
Ftmp = (Pi>2*Po) ? Pi*pow(Q0*0.75/Ti,0.5) : (Po>2*Pi) ? Po*pow(Q0*0.75/To,0.5) : pow(abs(Q0*(pow(Pi,2)-pow(Po,2))/Ti),0.5);
Fi -= (Fi-7260*Sr*sign(Pi-Po)*Ftmp)/(0.01*lo*frq);
Po += 0.27*(Fi-Fo)/(So*lo*Q0*frq);
Po = (Po<0) ? 0 : (Po>100) ? 100 : Po;
To += (abs(Fi)*(Ti*pow(Po/Pi,0.02)-To)+(Fwind+1)*(Twind-To)/Riz)/(Ct*So*lo*Qr*frq);

2. Контроллер и его конфигурация

Контроллер этого модуля связывается с функциями из библиотек, построенных с его помощью, для обеспечения непосредственных вычислений. Для предоставления вычисленных данных в систему OpenSCADA в контроллере могут создаваться параметры. Пример вкладки конфигурации контроллера данного типа изображен на рис.2.


Вкладка конфігурації контролера. (118 Kb)
Рис.2. Вкладка конфигурации контроллера.

С помощью этой вкладки можно установить:


Вкладка "Вычисления" контроллера(Рис. 3) содержит параметры и текст программы, непосредственно выполняемой контроллером. Модулем предусмотрена обработка ряда специальных параметров, доступных в программе контроллера:


Вкладка "Обчислення" контролеру. (144 Kb)
Рис.3. Вкладка "Вычисления" контроллера.

3. Параметр контроллера и его конфигурация

Параметр контроллера данного модуля выполняет функцию предоставления доступа к результатам вычисления контроллера в систему OpenSCADA посредством атрибутов параметров. Из специфических полей вкладка конфигурации параметра контроллера содержит только поле перечисления параметров вычисляемой функции, которые необходимо отразить.

4. Библиотеки функций модуля

Модуль предоставляет механизм для создания библиотек пользовательских функций на Java-подобном языке. Пример вкладки конфигурации библиотеки изображен на Рис.4. Вкладка содержит базовые поля: доступность, адрес таблицы БД библиотеки, дата и время модификации, идентификатор, имя и описание.


Вкладка конфігурації бібліотеки. (82 Kb)
Рис.4. Вкладка конфигурации библиотеки.

5. Пользовательские функции модуля

Функция, также как и библиотека, содержит базовую вкладку конфигурации, вкладку формирования программы и параметров функции (Рис.1), а также вкладку исполнения созданной функции.

6. API пользовательского программирования

Некоторые объекты модуля предоставляют функции пользовательского программирования.


Объект "Библиотека функций" (SYS.DAQ.JavaLikeCalc["lib_Lfunc"])


Объект "Пользовательская функция" (SYS.DAQ.JavaLikeCalc["lib_Lfunc"]["func"])

7. Производительность

Исходный текст процедур на языке этого модуля компилируются в байт-код виртуальной машины, который впоследствии вычисляется виртуальной машиной. Байт-код это не машинный код и достичь производительности самой аппаратной архитектуры в виртуальной машине его исполняющего теоретически нереально, если конечно код этой виртуальной машины не исполняет сам процессор. Т.е. производительность выполнения байт-кода примерно на порядок ниже аппаратной производительности за счёт накладных расходов команд виртуальной машины, разделения многопоточного доступа к данным, прозрачного приведения типов и отсутствия жёсткой типизации, а так-же динамической природы языка и наличия сложных типов "Строка" и "Объект".
Action source page doesn't exist yet(/Works / Tests / Java Like?)

Ссылки

Referring pages: HomePageUk/Doc
HomePageUk/Doc/BCM2835
HomePageUk/Doc/DAQ
HomePageUk/Doc/OpenSCADA060
HomePageUk/Function
HomePageUk/Using/APIFunctionLibs/LibDoc
HomePageUk/Using/APIFunctionLibs/LibRegEl
HomePageUk/Using/APIFunctionLibs/TechApp
HomePageUk/Using/KramatorskBallMills
HomePageUk/Using/PLC
HomePageUk/Using/PLC/firmware
HomePageUk/Using/SmartHouse


 
There are no files on this page.[Display files/form]
There is no comment on this page. [Display comments/form]