Наша совместная команда Banwar.org

Связаться с нами

  • (097) ?601-88-87
    (067) ?493-44-27
    (096) ?830-00-01

Статьи

OpenSCADAWiki: Doc / Java Like Calc

  1. Вступ
  2. 1. Java-подібна мова
  3. 1.2. операції мови
  4. 1.3. Вбудовані функції мови
  5. 1.4. Оператори мови
  6. 1.4.1. умовні оператори
  7. 1.4.2. цикли
  8. 1.4.3. внутрішні функції
  9. 1.4.4. Спеціальні символи строкових змінних
  10. 1.5. об'єкт
  11. 1.6. Приклади програми на мові
  12. 2. Контролер і його конфігурація
  13. 3. Параметр контролера і його конфігурація
  14. 4. Бібліотеки функцій модуля
  15. 5. Функції для модуля
  16. 6. API програмування
  17. 7. Продуктивність

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

Вступ

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


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


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


Параметри функції можуть вільно створюватися, віддалятися або модифікуватися. Поточна версія модуля підтримує до 65535 параметрів функції в сумі з внутрішніми змінними. Вид редактора функцій показаний на рис.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 ++;

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

  • починається не з точки:
    • ключові слова (if, else, while, ...);
    • параметри-атрибути даної функції;
    • іменовані-вбудовані постійні (EVAL, pi, e, ...) і постійні-об'єкти (SYS, arguments)
    • вбудовані функції (sin, cos, ...);
    • внутрішні, зовнішні функції, функції об'єкта і системних вузлів OpenSCADA (DOM);
    • зареєстровані раніше автоматичні змінні;
    • глобальні атрибути параметрів DAQ та властивості змінних;
    • ключові слова (in, var);
    • нова автоматична змінна.
  • починається з точки:
    • елементи шляху до властивості і функції об'єкта.

Виклик зовнішньої функції, як і атрибута системного параметра, записується як адреса об'єкта динамічного дерева об'єктної моделі системи 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.
постійні:

  • десяткові: цифри 0-9 (12, 111, 678);
  • восьмеричні: цифри 0-7 (012, 011, 076);
  • шістнадцятиричні: цифри 0-9, літери af або AF (0x12, 0XAB);
  • речові: 345.23, 2.1e5, 3.4E-5, 3e6;
  • логічні: true, false;
  • рядкові: "hello", без переходу на інший рядок проте з підтримкою прямий конкатенації строкових констант.

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

  • ціле: -263 ... 263, EVAL_INT (-9223372036854775807);
  • речовий: 3.4 * 10308, EVAL_REAL (-1.79E308);
  • логічне: false, true, EVAL_BOOL (2);
  • рядок: послідовність символів-байтів (0 ... 255) будь-якої довжини, обмеженої об'ємом пам'яті і сховищем в БД; EVAL_STR ( "<EVAL>").

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

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

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

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

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

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

  • double max (double x, double x1) - максимальне значення з x і x1;
  • double min (double x, double x1) - мінімальне значення з x і x1;
  • string typeof (ElTp vl) - тип значення vl;
  • string tr (string base) - переклад базового base повідомлення.

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

  • double sin (double x) - синус x;
  • double cos (double x) - косинус x;
  • double tan (double x) - тангенс x;
  • double sinh (double x) - синус гіперболічний від x;
  • double cosh (double x) - косинус гіперболічний від x;
  • double tanh (double x) - тангенс гіперболічний від x;
  • double asin (double x) - арксинус від x;
  • double acos (double x) - арккосинус від x;
  • double atan (double x) - арктангенс від x;
  • double rand (double x) - випадкове число від 0 до x;
  • double lg (double x) - десятковий логарифм від x;
  • double ln (double x) - натуральний логарифм від x;
  • double exp (double x) - експонента від x;
  • double pow (double x, double x1) - зведення x в ступінь x1;
  • double sqrt (double x) - корінь квадратний від x;
  • double abs (double x) - абсолютне значення від x;
  • double sign (double x) - знак числа x;
  • double ceil (double x) - округлення числа x до більшого цілого;
  • double floor (double x) - округлення числа x до меншого цілого.

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

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

  • var - оператор ініціалізації змінної; вказівка ​​змінної без надання значення резервує її зі значенням EVAL, що дозволяє здійснювати одноразову ініціалізацію складних типів даних на зразок об'єкта, через перевірку на "isEVal ()";
  • if - оператор умови "Якщо";
  • else - оператор умови "Інакше";
  • while - опис циклу "Поки";
  • for - опис циклу "Для";
  • in - роздільник циклу "Для" для перебору властивостей об'єкта;
  • break - переривання виконання циклу;
  • continue - продовжити виконання циклу з початку;
  • function - визначення внутрішньої функції;
  • using - дозволяє встановити область видимості функцій часто респонденти користуються послугами бібліотеки (using Special.FLibSYS;) для подальшого звернення тільки по імені функції, не має ефекту для об'єктного доступу;
  • return - переривання функції і повернення результату, який копіюється в атрибут з прапором повернення (return 123;); в середині внутрішньої функції здійснюється її завершення із зазначеним результатом;
  • new - створення об'єкта, реалізовані: об'єкт "Object", масив "Array" і регулярні вирази "RegExp";
  • delete - видалення / звільнення об'єкта або його властивостей, при цьому: внутрішні змінні встановлюються в EVAL_REAL, зовнішні замінюються порожнім об'єктом, а властивості об'єкта очищаються.

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

Частковими властивостями об'єкта мають і базові типи. Властивості і функції базових типів наведені нижче:

  • Нульовий тип, функції:
    • 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.

Для доступу до системних об'єктів (вузлів) 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 && pos0: (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: (pos0: pos; st_open = (pos> = 100)? true: false; st_close = (pos0)? 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 = (Po0: (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.



За допомогою цієї вкладки можна встановити:

  • Стан контролера, а саме: Статус, "Включений", "Запущено" та ім'я БД, що містить конфігурацію.
  • Ідентифікатор, ім'я та опис контролера.
  • Стан, в яке переводити контролер при завантаженні: "Включений" і "Запущено".
  • Ім'я таблиці для зберігання параметрів.
  • Адреса обчислювальної функції.
  • Політика планування обчислення, пріоритет і число ітерацій в одному циклі завдання обчислення.

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

  • f_frq - Частота обчислення програми контролера, тільки читання.
  • f_start - Прапор першого виконання програми контролера, запуск, тільки читання.
  • f_stop - Прапор останнього виконання програми контролера, останов, тільки читання.
  • this - Об'єкт даного контролера.


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

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

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

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



5. Функції для модуля

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

6. API програмування

Деякі додаткові компоненти надають функції користувальницького програмування.


Об'єкт "Бібліотека функцій" (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_" перед ідентифікатором бібліотеки обов'язковий!

7. Продуктивність

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


28.01.2006:
Підстава: Первинна оцінка продуктивності віртуальної машини системи OpenSCADA на основі виразу "y = x1 + x2", де всі змінні глобальні дійсного типу. Стадія Дія K7_1G-0, мкс 1 Ініціалізація списку регістрів 2.3 2 Вхід в функцію exec () 3. 3 Обхід команд 4.4 4 Читання 9 5 Рівень освiти Повна час 10.2

17.07.2013:
Підстава: Обгрунтування поточної продуктивності, оцінка та оптимізація. Виміри проводилися вибіркою мінімального часу з п'яти викликів по 1000 виконань формули "a - = b * (ac)" і її скорочень в кожному виклику. Всі змінні глобальні дійсного типу.

Formula Time on AMDGeode-500 (the operation time), мкс Notes a - = b * (ac) 4.52 (0.74) a - = b * c 3.78 (0.72) a - = b 3.06 (0.56)

=> Full call: 3.06 (0.49): getValR () = 0.49 / 2 = 0.245
=> Only write const = 2.57 (0.17)
=> Pass.code = 2.4

a = b 2.5 (1.21)

!> Use unified TVariant function setVal () and getVal () = 7.6 (2.7 write only) => fix to 5.0 by prevent default set to string EVAL.
=> Full call: 2.5 (0.33)
=> Only write const: 2.17 (0.47)
=> Only check for type: 1.7 (0.3)
=> Pass code: 1.4 (0.11)

Write to function IO is longer then read from local register by other context call and additional checking for NAN and real modification. Empty 1.29 Infrastructure and measurement method utilization time.

24.04.2016:
Reason: Estimate performance of access to low level IO lines on Raspberry Pi GPIO in different ways of JavaLikeCalc language of OpenSCADA .
Conditions: Raspberry Pi 3 , GPIO40, DAQ.BCM2835 (Based on library bcm2835 )

Operation Result, us Sleep. Lag on sleep in 1ms measured, which mostly limited by the realtime reaction about 100us . SYS.sleep (); +110 Special.FLibSYS.fnc_tmSleep (); +70 Sleep. Lag on sleep in 100us measured, which performs in the measuring cycle. SYS.sleep (); +17 Special.FLibSYS.fnc_tmSleep (); +2 Get GPIO pin's level From an attribute res = BCM2835.pi2.pi2.gpio17; 5.4 By the static accessing function res = DAQ.BCM2835.pi2.pi2.fnc_get (17); 1.6 By the static accessing function with prepare the link function get = "DAQ.BCM2835.pi2.pi2.fnc_get"; for (i = 0; i <10000; i ++) res = get (17); 1.7 By the dynamic accessing function res = SYS.DAQ.BCM2835.pi2.pi2.fnc_get.call (17); 80 By the dynamic accessing function with prepare the end object tO = SYS.DAQ.BCM2835.pi2.pi2.fnc_get; for (i = 0; i <1000; i ++) res = tO.call (17); 14.3 Put GPIO pin's level To an attribute BCM2835.pi2.pi2.gpio18 = true; 2.1 By the static accessing function DAQ.BCM2835.pi2.pi2.fnc_put (18, true); 1.4 By the static accessing function with prepare the link function put = "DAQ.BCM2835.pi2.pi2.fnc_put"; for (i = 0; i <10000; i ++) put (17, false); 1.5 By the dynamic accessing function SYS.DAQ.BCM2835.pi2.pi2.fnc_put.call (18, true); 79 By the dynamic accessing function with prepare the end object tO = SYS.DAQ.BCM2835.pi2.pi2.fnc_put; for (i = 0; i <1000; i ++) tO.call (18, true); 14.3

ПОСИЛАННЯ


Не дорівнює | Порозрядне "АБО" & Порозрядне "І" ^ Порозрядне "Що виключає АБО" && Логічний "І" || Логічний "АБО"?
Умовна операція "i = (i <0)?
Умова всередині виразу будується на операціях '?
St_open && com)) {tmp_up = (pos> 0 && pos0: (tmp_up> 0 && lst_com == com)?
Tmp_up- 1 / frq: t_up; pos + = (tmp_up> 0)?
Com?
T_full * frq); pos = (pos> 100)?
Pos0: pos; st_open = (pos> = 100)?
True: false; st_close = (pos0)?
Sr = (S_kl1 * l_kl1 + S_kl2 * l_kl2) / 100; Ftmp = (Pi> 2 * Po)?

Новости

Banwar.org
Наша совместная команда Banwar.org. Сайт казино "Пари Матч" теперь доступен для всех желающих, жаждущих волнения и азартных приключений.