Довідник з програмування операційної логіки
Після запуску Overvis MC252 починає виконання програми операційної логіки, якщо вона була раніше розміщена у внутрішній пам’яті.
Якщо у внутрішній пам’яті немає програми, а карта пам’яті присутня (відформатована як FAT або FAT32), MC252 може автоматично завантажити файли завдань.
Таке зчитування виконується один раз після запуску або після встановлення нової карти пам’яті, але тільки якщо внутрішня пам’ять не містить програми.
MC252 шукає та перевіряє файли завдань, розміщені в папці TASKS на карті пам’яті.
Файли можуть мати довільні імена та розширення (крім .MAP, .OBJ і .CNF) та розміщуватися в підпапках папки TASKS.
Знайдені коректні файли зчитуються у внутрішню пам’ять і формують програму операційної логіки.
Внутрішню пам’ять логіки можна очистити разом зі скиданням налаштувань до заводських. Щоб зберегти налаштування та очистити лише внутрішню пам’ять логіки, слід використати або команду через Modbus, або веб-інтерфейс.
- Через веб-інтерфейс
1.1 відкрийте пристрій у браузері (див. Веб-інтерфейс);
1.2 відкрийте вкладку Tasks;
1.3 натисніть кнопку Reload Tasks і підтвердьте очищення пам’яті.
- Через MODBUS
2.1 підключіться до пристрою через MODBUS і увійдіть у режим налаштування (див. Карту регістрів Modbus);
2.2 щоб очистити внутрішню пам’ять логіки, запишіть значення 40959 у регістр керуючої команди 120.
Вкладка Завдання показує результат читання папки TASKS, включаючи кількість знайдених файлів. Успішно зчитані файли відображаються нижче в таблиці логічних завдань. Якщо під час читання та перевірки програми були виявлені помилки, вказуються тип помилки, файл і номер рядка з помилкою. Якщо програма складалася з кількох файлів у папці TASKS, внутрішня пам’ять зчитає всі файли, крім тих, у яких виявлено помилки. Тому під час виправлення помилок слід повторно завантажити завдання, щоб знову очистити внутрішню пам’ять.
Регістри Modbus (див. Карту регістрів Modbus, регістри 2020-2023) вказують на результат читання папки TASKS, включаючи кількість прочитаних файлів та обсяг використаної пам’яті.
Якщо під час читання та перевірки програми були виявлені помилки, вказується тип помилки та номер рядка.
Якщо програма складалася з кількох файлів у папці “TASKS”, внутрішня пам’ять прочитає всі файли, крім тих, у яких виявлено помилки. Тому під час виправлення помилок слід перевірити кількість прочитаних файлів. Після внесення виправлень слід очистити внутрішню пам’ять, щоб програма була прочитана знову.
Файл завдання
Section titled “Файл завдання”Файл завдання описує набір дій, що повторюються через заданий часовий інтервал. Дії можуть включати збір даних, обробку та порівняння значень і спеціальні дії після виконання заданих умов (відповідно до результатів обробки).
Файл складається з рядків. Кожен рядок може бути одним з наступних:
- порожнім;
- опцією;
- визначенням;
- дією.
Рядки можуть включати коментарі, які передують символи ; або #. Текст після цих символів ігнорується.
Рядки можуть починатися з міток, за якими слідує :. Мітки використовуються для посилань на дії (наприклад, CALL function1 … function1: RETURN).
Частини рядка розділяються символами або TAB.
Опції файлу завдання
Section titled “Опції файлу завдання”Опції конфігурують компіляцію або виконання файлу завдання.
Опції починаються з @, за яким слідує тип опції. Далі йде значення опції.
Опції компіляції
Section titled “Опції компіляції”PROTOCOLVERSION
Section titled “PROTOCOLVERSION”Перевіряється під час компіляції. Якщо версія виходить за межі діапазону версій, підтримуваних компілятором, виникає помилка компіляції файлу завдання.
Приклади:
@PROTOCOLVERSION 11VARBITS
Section titled “VARBITS”Встановлює розмір типу змінної. Більші значення дозволяють більше доступних типів приведення параметрів і коректно обробляють більші значення, але займають більше пам’яті.
32- використовувати 32-бітні (4 байти) знакові цілі змінні.64- використовувати 64-бітні (8 байт) знакові цілі змінні.
Приклади:
@VARBITS 64Опції виконання
Section titled “Опції виконання”UPDATE
Section titled “UPDATE”Ця опція - це встановлений інтервал між двома послідовними запусками завдання. Фактичний інтервал залежить від навантаження контролера та загальної складності файлів завдань (деякі дії, такі як читання/запис параметрів або відправка SMS, можуть продовжити виконання). Якщо час наступного запуску настає до завершення іншого запуску, новий затримується і буде виконаний якомога швидше.
Значення опції - ціле число секунд в діапазоні 0..2000000.
0 - немає інтервалу, негайні повторні запуски.
За замовчуванням 60.
Приклади:
@UPDATE 10 ; повторний запуск завдання кожні 10 секундUPDATEDIVISOR
Section titled “UPDATEDIVISOR”Ця опція - це модифікатор для встановленого інтервалу між двома послідовними запусками завдання.
Якщо встановлено ненульове значення, встановлений інтервал керується з субсекундною точністю і дорівнює ‘UPDATE’ / ‘UPDATEDIVISOR’.
Значення опції - ціле число герц в діапазоні 0..500.
0 - точність обчислення інтервалів у секундах.
За замовчуванням 0.
Приклади:
@UPDATE 2 @UPDATEDIVISOR 3 ; інтервал між запусками буде 2/3 або близько 667 мсPARAMLOADRATIO
Section titled “PARAMLOADRATIO”Ця опція визначає примусові затримки очікування між операціями читання/запису параметрів пристрою (це не впливає на параметри пам’яті, див. Визначення параметра нижче). Це дає більше часу для обробки запитів інших клієнтів. Затримка пропорційна часу, витраченому на попередню операцію з параметром.
Значення опції - ціле число відсотків в діапазоні 0..100.
100- немає примусових затримок.50- час затримки дорівнює часу попередньої операції.25- час затримки в 3 рази більший за час операції.
За замовчуванням 25.
Приклади:
@PARAMLOADRATIO 50 ; операції з параметрами розділені затримками однакової довжиниPARAMTIMEOUT
Section titled “PARAMTIMEOUT”Ліміт очікування для операцій читання/запису параметрів пристрою (це не впливає на параметри пам’яті, див. Визначення параметра нижче). Після закінчення тайм-ауту операція завершується помилкою.
Значення опції - ціле число мілісекунд в діапазоні 0..5000.
За замовчуванням 5000.
Приклади:
@PARAMTIMEOUT 1000 ; чекати не більше 1 секунди на завершення операції з параметромRESETDATA
Section titled “RESETDATA”Визначає, чи скидаються елементи зберігання завдання (змінні та умови) перед кожним запуском.
0 - змінні та умови зберігають свої значення в RAM і скидаються при відключенні живлення або скиданні контролера.
1 - змінні та умови скидаються перед кожним запуском.
За замовчуванням 0.
Приклади:
@RESETDATA 1 ; значення елементів зберігання, що залишилися після запуску, не використовуються в наступних запускахВизначення файлу завдання
Section titled “Визначення файлу завдання”Визначення оголошують логічні зв’язки, рядки та відображення регістрів Modbus, або типи елементів зберігання.
Рядки визначення починаються з DEF, за яким слідує нове визначене ім’я.
Далі йде тип визначення, який може бути одним з наступних груп:
- рядок;
- пристрій Modbus;
- параметр;
- змінна(і);
- умова(и).
Визначення рядка
Section titled “Визначення рядка”Визначення рядка позначається парою ", з рядком всередині.
Рядок може включати спеціальні посилання, укладені в * (символ екранування * повинен бути подвоєний, щоб бути включеним у сам рядок).
Спеціальні посилання включають:
VAR(variable)- для числового значення зізмінної. Тут також може використовуватися зміннаlasterror;ERR(variable)- для літерального представлення імені коду помилки зізмінної. Тут також може використовуватися зміннаlasterror;PHONE(index)- для номера зі списку абонентів GSM в налаштуваннях пристрою. Індекс - це число в діапазоні від0до4.
Приклади:
DEF my_string1 "2 * 2 = *VAR(var_mul_result)*" ; цей шаблон рядка може створити рядок "2 * 2 = 4"DEF e_msg "Handled error #*VAR(lasterror)*: *ERR(lasterror)*" ; цей шаблон рядка може створити рядок "Handled error #1: FUNCTION_ILLEGAL"Визначення пристрою Modbus
Section titled “Визначення пристрою Modbus”Пристрій Modbus може використовуватися як джерело або сховище параметрів.
Пристрій Modbus визначається одним з наступних типів:
MBWRDENIED- можуть використовуватися тільки функції читання;MBWRSINGLE- можуть використовуватися функції запису одного регістра/котушки;MBWRMULTI- можуть використовуватися функції запису кількох регістрів/котушок;MBWRANY- можуть використовуватися як функції запису одного, так і кількох регістрів/котушок.
За типом слідують 2 або 3 аргументи:
- Адреса пристрою Modbus - один з наступних: фіксований ID в діапазоні
1..255, власний віртуальний ID контролера як*, або непрямий ID як змінна плюс цілочисельне значення (наприклад,some_variable+10); - ліміт читання регістрів/котушок на один запит Modbus, в діапазоні
1..125; - аргумент присутній тільки для типів
MBWRMULTI,MBWRANY- ліміт запису регістрів/котушок на один запит Modbus, в діапазоні1..125.
Приклади:
DEF mc_252 WRHANY * 125 125 ; власний віртуальний пристрій контролераВизначення параметра
Section titled “Визначення параметра”Параметри використовуються для доступу до зовнішніх даних: отримання даних до або із змінних.
Параметр визначається одним з типів даних.
Таблиця 1 - Типи параметрів, доступні для будь-якого розміру типу змінної
| № | Тип | Опис |
|---|---|---|
| 0 | UINT16 | беззнакове (невід’ємне) 16-бітне (2 байти) ціле, серіалізоване як Big Endian (старший байт першим, наприклад, 258 зберігається як 0x01, 0x02); |
| 1 | INT16 | знакове 16-бітне (2 байти) ціле, серіалізоване як Big Endian; |
| 2 | INT16BLE | знакове 16-бітне (2 байти) ціле, серіалізоване як Little Endian (молодший байт першим, наприклад, 258 зберігається як 0x02, 0x01); |
| 3 | INT32 | знакове 32-бітне (4 байти) ціле, серіалізоване як Big Endian (старший байт першим, наприклад, 66051 зберігається як 0x00, 0x01, 0x02, 0x03); |
| 4 | INT32BLE | знакове 32-бітне (4 байти) ціле, з байтами, серіалізованими як Little Endian (молодший байт першим, наприклад, 66051 зберігається як 0x03, 0x02, 0x01, 0x00); |
| 5 | INT32WLE | знакове 32-бітне (4 байти) ціле, зі словами, серіалізованими як Little Endian (молодше слово першим, наприклад, 66051 зберігається як 0x02, 0x03, 0x00, 0x01); |
| 6 | BIT | 1-бітне ціле (використовується, наприклад, для доступу до котушок Modbus і дискретних входів); |
| 7 | INT32BE | те саме, що INT32 |
| 8 | F32EP0R | IEEE 754 одинарної точності (4 байти) з плаваючою комою, серіалізоване як Big Endian; |
| 9 | F32BLEEP0R | IEEE 754 одинарної точності (4 байти) з плаваючою комою, з байтами, серіалізованими як Little Endian; |
| 10 | F32WLEEP0R | IEEE 754 одинарної точності (4 байти) з плаваючою комою, зі словами, серіалізованими як Little Endian; |
| 11 | F32EP1R | одинарної точності (4 байти) з плаваючою комою, серіалізоване як поділене на 10 Big Endian; |
| 12 | F32BLEEP1R | те саме, що F32BLEEP0R, але поділене на 10 перед серіалізацією; |
| 13 | F32WLEEP1R | те саме, що F32WLEEP0R, але поділене на 10 перед серіалізацією; |
| 14 | F32EP2R | одинарної точності (4 байти) з плаваючою комою, серіалізоване як поділене на 100 Big Endian; |
| 15 | F32BLEEP2R | те саме, що F32BLEEP0R, але поділене на 100 перед серіалізацією; |
| 16 | F32WLEEP2R | те саме, що F32WLEEP0R, але поділене на 100 перед серіалізацією; |
| 17 | F32EP3R | одинарної точності (4 байти) з плаваючою комою, серіалізоване як поділене на 1000 Big Endian; |
| 18 | F32BLEEP3R | те саме, що F32BLEEP0R, але поділене на 1000 перед серіалізацією; |
| 19 | F32WLEEP3R | те саме, що F32WLEEP0R, але поділене на 1000 перед серіалізацією; |
| 20 | UINT16BLE | беззнакове (невід’ємне) 16-бітне (2 байти) ціле, серіалізоване як Little Endian; |
| 21 | UINT8 | беззнакове (невід’ємне) 8-бітне (1 байт) ціле; |
| 22 | INT8 | знакове 8-бітне (1 байт) ціле; |
Таблиця 2 - Типи параметрів, доступні для 64-бітного типу змінної
| № | Тип | Опис |
|---|---|---|
| 23 | UINT32 | беззнакове (невід’ємне) 32-бітне (4 байти) ціле, серіалізоване як Big Endian (старший байт першим, наприклад, 66051 зберігається як 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03); |
| 24 | UINT32BLE | беззнакове (невід’ємне) 32-бітне (4 байти) ціле, з байтами, серіалізованими як Little Endian (молодший байт першим, наприклад, 66051 зберігається як 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00); |
| 25 | UINT32WLE | беззнакове (невід’ємне) 32-бітне (4 байти) ціле, зі словами, серіалізованими як Little Endian (молодше слово першим, наприклад, 66051 зберігається як 0x02, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00); |
| 26 | INT64 | знакове 64-бітне (8 байт) ціле, серіалізоване як Big Endian (старший байт першим, наприклад, 66051 зберігається як 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03); |
| 27 | INT64BLE | знакове 64-бітне (8 байт) ціле, з байтами, серіалізованими як Little Endian (молодший байт першим, наприклад, 66051 зберігається як 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00); |
| 28 | INT64WLE | знакове 64-бітне (8 байт) ціле, зі словами, серіалізованими як Little Endian (молодше слово першим, наприклад, 66051 зберігається як 0x02, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00); |
| 29 | F64EP0R | IEEE 754 подвійної точності (8 байт) з плаваючою комою, серіалізоване як Big Endian; |
| 30 | F64BLEEP0R | IEEE 754 подвійної точності (8 байт) з плаваючою комою, з байтами, серіалізованими як Little Endian; |
| 31 | F64WLEEP0R | IEEE 754 подвійної точності (8 байт) з плаваючою комою, зі словами, серіалізованими як Little Endian; |
| 32 | F64EP1R | подвійної точності (8 байт) з плаваючою комою, серіалізоване як поділене на 10 Big Endian; |
| 33 | F64BLEEP1R | те саме, що F64BLEEP0R, але поділене на 10 перед серіалізацією; |
| 34 | F64WLEEP1R | те саме, що F64WLEEP0R, але поділене на 10 перед серіалізацією; |
| 35 | F64EP2R | подвійної точності (8 байт) з плаваючою комою, серіалізоване як поділене на 100 Big Endian; |
| 36 | F64BLEEP2R | те саме, що F64BLEEP0R, але поділене на 100 перед серіалізацією; |
| 37 | F64WLEEP2R | те саме, що F64WLEEP0R, але поділене на 100 перед серіалізацією; |
| 38 | F64EP3R | подвійної точності (8 байт) з плаваючою комою, серіалізоване як поділене на 1000 Big Endian; |
| 39 | F64BLEEP3R | те саме, що F64BLEEP0R, але поділене на 1000 перед серіалізацією; |
| 40 | F64WLEEP3R | те саме, що F64WLEEP0R, але поділене на 1000 перед серіалізацією; |
| 41 | F64EP4R | подвійної точності (8 байт) з плаваючою комою, серіалізоване як поділене на 10000 Big Endian; |
| 42 | F64BLEEP4R | те саме, що F64BLEEP0R, але поділене на 10000 перед серіалізацією; |
| 43 | F64WLEEP4R | те саме, що F64WLEEP0R, але поділене на 10000 перед серіалізацією; |
| 44 | F64EP5R | подвійної точності (8 байт) з плаваючою комою, серіалізоване як поділене на 100000 Big Endian; |
| 45 | F64BLEEP5R | те саме, що F64BLEEP0R, але поділене на 100000 перед серіалізацією; |
| 46 | F64WLEEP5R | те саме, що F64WLEEP0R, але поділене на 100000 перед серіалізацією; |
| 47 | F64EP6R | подвійної точності (8 байт) з плаваючою комою, серіалізоване як поділене на 1000000 Big Endian; |
| 48 | F64BLEEP6R | те саме, що F64BLEEP0R, але поділене на 1000000 перед серіалізацією; |
| 49 | F64WLEEP6R | те саме, що F64WLEEP0R, але поділене на 1000000 перед серіалізацією; |
За типом слідують 1 або 3 аргументи:
- джерело - одне з наступних:
MEMTEMP,MEMBAT,MEMFILE,MEMFLASHабо пристрій Modbus, визначений раніше. - Для джерела пристрою Modbus це таблиця даних Modbus: одне з наступних
C,D,H,Iдля котушок, дискретних входів, регістрів зберігання або вхідних регістрів відповідно. Для джерел пам’яті це необов’язково - якщо вказано, це відображає параметр пам’яті на адреси власного віртуального пристрою контролера. - Для джерела пристрою Modbus це початкова адреса в діапазоні
0..65535(параметр може займати кілька адрес залежно від його типу та розміру). Для джерел пам’яті це необов’язково - якщо вказано, це відображає параметр пам’яті на адреси власного віртуального пристрою контролера.
Джерела пам’яті для параметрів дозволяють читати налаштування або зберігати установки та тимчасові значення для обробки при послідовних запусках.
MEMTEMP- простір RAM, дані втрачаються при відключенні живлення або скиданні контролера, невеликий розмір області, але відмінна швидкість запису;MEMBAT- область пам’яті, що живиться від батареї внутрішнього годинника, дуже обмежений розмір, але хороша швидкість запису;MEMFLASH- область налаштувань контролера, дані зберігаються при скиданні, невеликий розмір і зазвичай тільки для читання;MEMFILE- розширювана файлова область, вимагає наявності карти пам’яті з файлами завдань, середня швидкість, але відмінний розмір області.
Приклади:
DEF local_time UINT32 mc_252 H 170 ; власні регістри контролера 170..171DEF alg_mode UINT32 MEMTEMP H 5000 ; значення RAM, відображене на власний регістр зберігання 5000Визначення змінної
Section titled “Визначення змінної”Змінні використовуються для роботи з цілочисельними значеннями. Усі змінні мають однаковий тип, який встановлюється в опціях файлу завдання.
Змінні можуть бути в основному визначені автоматично при першій згадці.
Деякі операції однак (як ‘ISKNOWN’, копіювання або призначення елементів масиву) вимагають, щоб змінна була визначена раніше.
Змінні визначаються з типом VAR.
Масиви змінних визначаються з типом VARS, за яким слідує розмір масиву в діапазоні 1..65535 (масив з однієї змінної фактично те саме, що і проста змінна).
Існує одна попередньо визначена змінна: lasterror.
Виникнення помилок записує код помилки в неї.
Вона не може бути записана, як інші змінні, але команда RAISE фактично записує в неї.
Ця змінна може використовуватися в обробниках помилок для дій, специфічних для помилки.
Приклади:
DEF variable_1 VAR DEF array_with_5_items VARS 5Визначення умови
Section titled “Визначення умови”Умови використовуються для роботи з булевими значеннями.
Умови можуть бути в основному визначені автоматично при першій згадці.
Деякі операції однак (як ‘ISKNOWN’, копіювання або призначення елементів масиву) вимагають, щоб умова була визначена раніше.
Умови визначаються з типом COND.
Масиви умов визначаються з типом CONDS, за яким слідує розмір масиву в діапазоні 1..65535 (масив з однієї умови фактично те саме, що і проста умова).
Приклади:
DEF is_temperature_high CONDДії файлу завдання
Section titled “Дії файлу завдання”Дії формують ітеративний логічний алгоритм. Дії можуть бути одними з наступних:
- твердження;
- перевірка;
- команда.
Дії виконуються послідовно з наступними винятками:
- дії перевірки пропускають одну дію, якщо їх умова не
TRUE; - дії команд як
GO,CALL,RETURNпереходять до мітки або повертаються з виклику функції; - дія команди
RAISEабо будь-яке виникнення помилки або переходить до обробника помилок, або зупиняє цей запуск виконання через необроблену помилку; - дія команди
EXITзупиняє цей запуск виконання.
Існують 2 мітки, що використовуються як визначення основної функції файлу завдання:
run- кожного разу, коли виконується запуск файлу завдання, дія з міткоюrunвиконується першою (якщо такої мітки немає, перша дія у файлі завдання виконується першою);onerror- якщо виникає помилка без інших вказаних обробників, використовується обробник з міткоюonerror(якщо такої мітки немає, помилка буде необробленою, див. Обробка помилок нижче).
Дія може в деяких випадках посилатися на інші елементи, які не були визначені раніше у файлі завдання:
- масиви змінних і масиви умов повинні бути визначені перед тим, як на них посилаються;
- обчислення, які можуть приймати аргументи різних типів (як пряме копіювання), вимагають, щоб аргументи були визначені раніше;
- інші змінні та умови можуть бути використані без попереднього визначення;
- на мітки можуть посилатися
CALL,TRYCALLабоGOдо того, як вони визначені; - на рядки можуть посилатися
SENDSMS,SMSRCVD,NOSMSRCVD,SYSLOGабоPARAMLOGдо того, як вони визначені; - у всіх інших випадках елемент, на який посилаються, повинен бути визначений раніше у файлі завдання.
Дія твердження
Section titled “Дія твердження”Твердження - це дії, що виробляють деякі дані результату, які вони зберігають в одному з елементів зберігання (змінній або умові).
Твердження починаються з PUT, за яким слідує ім’я елемента цілі результату.
Далі йде функція з відповідним типом результату для цієї цілі (див. Обчислення змінної, Обчислення умови нижче).
Якщо функція не вказана, аргумент безпосередньо копіюється в ціль (це також може використовуватися для отримання елементів з масиву, проіндексованого змінною, або повернення їх назад).
Приклади:
DEF numbers VARS 3PUT numbers[0] 0PUT numbers[1] 1PUT numbers[2] 2 ; numbers містить [0, 1, 2]PUT index 2PUT x numbers[index] ; x містить 2PUT var_mul_result MUL x 2 ; var_mul_result містить 4Дії перевірки
Section titled “Дії перевірки”Перевірки - це дії, що використовуються для розгалуження.
Вони пропускають наступну дію, якщо їх функція (з результатом умови, тобто булевим) виробляє FALSE або невідоме значення.
Перевірки починаються з IF, за яким слідує функція з типом результату умови (див. Обчислення умови нижче).
Якщо функція не вказана, аргумент повинен бути іменем умови.
Приклади:
PUT lesser 5PUT greater 3IF LE lesser greater ; LE 5 3 виробляє FALSE, бо 5 <= 3 не вірноGO then_section ; ця команда не буде виконана; else секціяPUT tmp lesser ; обмін значеннями змінних lesser і greaterPUT lesser greaterPUT greater tmpGO endif_sectionthen_section:; дві змінні вже відсортовані, нічого не потрібно робитиendif_section:; дві змінні тепер відсортовані, lesser <= greaterДії команд
Section titled “Дії команд”Команди - це дії, що не виробляють дані результату або відкидають їх.
Команди є одними з наступних:
EXIT- зупиняє виконання файлу завдання. Має 1 аргумент: ім’я помилки,OK(якщо немає помилки) абоlasterror.RAISE- примусово викликає виникнення помилки. Має 1 аргумент: ім’я помилки, абоlasterror(для підняття тієї ж помилки вище).GO- наступна дія не буде виконана, виконання продовжиться з вказаної мітки. Має 1 аргумент: ім’я мітки.CALL- починає виконання деякої користувацької функції. Виконання наступної дії відкладається, виконання тепер продовжиться з вказаної мітки. Має 1 аргумент - ім’я мітки входу функції.TRYCALL- починає виконання деякої користувацької функції з власною обробкою помилок. Виконання наступної дії відкладається, виконання тепер продовжиться з вказаної мітки. Має 2 аргументи - ім’я мітки входу функції та ім’я мітки обробника помилок.RETURN- завершує виконання користувацької функції. Наступна дія не буде виконана, виконання продовжиться з раніше відкладеної дії (попереднім зустрінутим ‘CALL’).WRITE- виводить дані в параметр. Має 2 аргументи: ім’я параметра, потім ім’я змінної або цілочисельне значення.PARAMLOG- записує параметр у журнал даних з коментарем. Має 2 аргументи: ім’я параметра, потім ім’я рядка. Параметр повинен бути в регістрах Modbus або інакше відображений на Modbus, оскільки його адреса використовується в журналах.PARAMLOGNOCOMMENT- записує параметр у журнал даних без коментаря. Має 1 аргумент: ім’я параметра. Параметр повинен бути в регістрах Modbus або інакше відображений на Modbus, оскільки його адреса використовується в журналах.SYSLOG- записує рядок у системний журнал. Має 1 аргумент: ім’я рядка.SENDSMS- відправляє рядок як SMS. Має 2 аргументи: рядок адресата, потім ім’я рядка тексту SMS. Якщо рядок адресата не містить інших символів, крім0, SMS не буде відправлено.
Приклади:
WRITE param_hysteresis 5 EXIT OKОбчислення змінної
Section titled “Обчислення змінної”Функції обчислення змінної використовуються в дії твердження (PUT) для обчислення нового значення змінної.
Вони можуть виробляти числове значення або невідомий результат (див. Невідомі значення нижче).
Арифметичні обчислення
Section titled “Арифметичні обчислення”Більшість наступних функцій приймають 2 аргументи (наприклад, a і b) і виконують операцію.
-
ADD- додавання (a + b). Перший аргумент - змінна, другий може бути або змінною, або цілочисельним значенням. -
SUB- віднімання (a - b). Перший аргумент - змінна, другий може бути або змінною, або цілочисельним значенням. -
MUL- множення (a * b). Перший аргумент - змінна, другий може бути або змінною, або цілочисельним значенням. -
DIV- ділення (a / b, цілочисельний результат). Перший аргумент - змінна, другий може бути або змінною, або цілочисельним значенням. -
MOD- залишок від ділення (a - (a / b * b)). Перший аргумент - змінна, другий може бути або змінною, або цілочисельним значенням. -
SQRT- квадратний корінь (цілочисельний). Приймає один аргумент змінної або цілочисельного значення. -
VAL- пряме копіювання. Приймає один аргумент: змінну або цілочисельне значення. Як і з іншими обчисленнями прямого копіювання, ім’я функціїVALможе бути опущено.
Бітові обчислення
Section titled “Бітові обчислення”Більшість наступних функцій приймають 2 аргументи (наприклад, a і b) і виконують операцію.
-
BITSAND- логічнеANDкожного бітаaз відповідним бітомb. Перший аргумент - змінна, другий може бути або змінною, або цілочисельним значенням. -
BITSOR- логічнеORкожного бітаaз відповідним бітомb. Перший аргумент - змінна, другий може бути або змінною, або цілочисельним значенням. -
SHR- арифметичний зсув вправо бітівa,bразів вправо. Перший аргумент - змінна, другий може бути або змінною, або цілочисельним значенням. -
SHL- зсув вліво бітівa,bразів вліво. Перший аргумент - змінна, другий може бути або змінною, або цілочисельним значенням. -
BITSBIT- копіювання бітаbз бітівa. ЕквівалентноSHR a b, за яким слідуєBITSAND a 1. Перший аргумент - змінна, другий може бути або змінною, або цілочисельним значенням. -
BITSNOT- інверсія бітів. Приймає один аргумент змінної або цілочисельного значення.
Обчислення читання параметра
Section titled “Обчислення читання параметра”READ- приймає параметр як аргумент і зчитує, а потім приводить його значення до типу змінної за замовчуванням.
Обчислення елементів масиву
Section titled “Обчислення елементів масиву”MAX- максимальний елемент масиву. Приймає один аргумент: масив змінних.MAXIDX- індекс максимального елемента масиву в діапазоні від 0 до розміру масиву мінус 1. Приймає один аргумент: масив змінних.MIN- мінімальний елемент масиву. Приймає один аргумент: масив змінних.MINIDX- індекс мінімального елемента масиву в діапазоні від 0 до розміру масиву мінус 1. Приймає один аргумент: масив змінних.SUM- сума елементів масиву. Приймає один аргумент: масив змінних.SELECTBY- приймає 2 аргументи: масив змінних і масив умов того ж розміру, і вибирає змінну, що відповідає першій умові, яка єTRUE.
Обчислення конфігурації завдання
Section titled “Обчислення конфігурації завдання”GETUPDPERIODSEC- період оновлення завдання в секундах. Без аргументів.GETUPDPERIODMS- період оновлення завдання в мілісекундах. Без аргументів.GETUPDNAMEIDX- перше ціле число в імені файлу завдання. Це можна використовувати як базу або множник для відображення параметрів, щоб створювати кілька подібних завдань з однаковим вмістом. Без аргументів.
Обчислення годинника реального часу
Section titled “Обчислення годинника реального часу”GETRTC- значення годинника реального часу в секундах (від базового року, зазвичай 2000). Локальний час, з урахуванням літнього часу. Без аргументів.GETYEAR- рік за годинником. Без аргументів.GETMONTH- місяць за годинником, від 1 до 12. Без аргументів.GETDAY- день місяця за годинником, від 1 до 31. Без аргументів.GETHOURS- години за годинником. Без аргументів.GETMINUTES- хвилини за годинником, від 0 до 59. Без аргументів.GETSECONDS- секунди за годинником, від 0 до 59. Без аргументів.GETDOW- день тижня за годинником, від 0 до 6, де 0 — понеділок, 6 — неділя. Без аргументів.GETDAYTIME- секунди від початку доби, від 0 до 86399. Без аргументів.GETSUNRISE- секунда сходу сонця поточної доби, від -1 до 86400, де -1 означає полярний день, а 86400 — полярну ніч. Без аргументів.GETSUNSET- секунда заходу сонця поточної доби, від -1 до 86400, де -1 означає полярний день, а 86400 — полярну ніч. Без аргументів.
Обчислення фізичних параметрів
Section titled “Обчислення фізичних параметрів”GETVOLTAGE- напруга живлення в мілівольтах. Без аргументів.GETTEMPERATURE- температура в градусах. Без аргументів.
Приклади:
PUT square MUL x xОбчислення умови
Section titled “Обчислення умови”Функції обчислення умови використовуються або в твердженнях (дії PUT), або в перевірках (дії IF) для визначення значення умови.
Вони можуть виробляти TRUE, FALSE або невідомий результат (якщо посилаються на інші невідомі значення елементів, див. Невідомі значення нижче).
Усі функції мають пряму або інвертовану форму, які відрізняються тільки тим, чи результат інвертується перед використанням.
Функції перераховані в обох формах, наприклад, ‘EQ’ / ‘NE’ для перевірок рівності та нерівності (інвертований EQ).
Перевірки порівняння
Section titled “Перевірки порівняння”EQ/NE- рівно / не рівно (a = b/a != b). Перший аргумент - змінна, другий може бути або змінною, або цілочисельним значенням.GE/LS- більше-або-рівно / менше (a >= b/a < b). Перший аргумент - змінна, другий може бути або змінною, або цілочисельним значенням.GR/LE- більше / менше-або-рівно (a > b/a <= b). Перший аргумент - змінна, другий може бути або змінною, або цілочисельним значенням.
Логічні перевірки
Section titled “Логічні перевірки”AND/NAND- логічнеAND/ інвертоване логічнеAND(a && b/!(a && b)). Приймає 2 аргументи умови.OR/NOR- логічнеOR/ інвертоване логічнеOR(a || b/!(a || b)). Приймає 2 аргументи умови.VAL/NOT- пряме копіювання / інвертоване копіювання (a/!a). Приймає один аргумент: умову або булеве значення (TRUEабоFALSE). Як і з іншими обчисленнями прямого копіювання, ім’я функціїVALможе бути опущено.
Перевірки SMS
Section titled “Перевірки SMS”SMSRCVD/NOSMSRCVD- перевіряє, чи прийшла нова SMS, що починається з вказаного тексту, з номера, що починається з вказаних цифр. Перший аргумент - початок номера телефону, другий - початок тексту SMS. Якщо номер телефону - порожній рядок, перевіряються SMS від будь-яких абонентів.
Перевірки помилок
Section titled “Перевірки помилок”ISKNOWN/ISNOTKNOWN- перевіряє, чи відоме значення елемента зберігання. Приймає один аргумент: змінну або умову (значення єневідомими, якщо вони зчитані з неініціалізованих параметрів або обчислені з інших невідомих елементів, див. Невідомі значення нижче).
Приклади:
PUT c_equal EQ x 5 IF c_equal EXIT OK
; та сама функція може використовуватися безпосередньо в перевірці IF EQ x 5 EXIT OKДробові значення та обчислення з фіксованою комою
Section titled “Дробові значення та обчислення з фіксованою комою”Обробка даних виконується обчисленнями змінних, які зберігають значення цілочисельного типу.
Однак читання та запис параметрів можуть приводити типи даних до та з дробових значень одинарної та подвійної точності, як визначено в стандарті IEEE 754. Це приведення може бути виконано з множником (залежно від використовуваного типу параметра), щоб зберегти певну кількість десяткових цифр дробової частини значення. Деякі підключені пристрої також можуть мати цілочисельні параметри, що представляють дробове значення (попередньо помножене подібним чином, як вище).
Це дозволяє оперувати дробовими значеннями як цілими числами.
Слід бути обережним, використовуючи операції, такі як множення, ділення або квадратний корінь.
Наприклад, MUL 2 2 = 4, але якщо перший аргумент представляє значення 0.2, помножене на 10, а другий - значення 0.02, помножене на 100 (значення з фіксованою комою з точністю 1 і 2 цифри відповідно), результат представляє 0.004, помножене на 1000 (10*100, оскільки множники також були помножені).
Квадратний корінь попереднього значення (4, що означає значення 0.004, помножене на 1000), SQRT 4 виробляє 2, що є неправильним результатом через множник 1000. Бо SQRT 1000 не є цілим числом.
Щоб отримати правильний результат, множник цього значення повинен бути скоригований до найближчого множника з парною кількістю нулів, тобто 10000. Тож 4 слід попередньо помножити на 10 (отримавши 40 для 0.004, помноженого на 10000). Тоді SQRT 40 виробляє 6, що є правильним результатом (що означає 0.06, помножене на 100).
Масиви
Section titled “Масиви”Елементи зберігання можуть бути організовані в масиви фіксованого розміру.
Масиви повинні бути визначені перед посиланням на них в обчисленнях (наприклад, DEF some_array VARS 5 або DEF the_other_array CONDS 2).
Існує 3 способи використання масивів:
- елементи масиву з індексом цілочисельного значення можуть використовуватися в більшості функцій і тверджень замість імені одного елемента як аргумент (або результат твердження, наприклад,
PUT some_array[3] MUL some_array[2] some_array[1]). - елементи масиву зі змінним індексом можуть використовуватися: а) або в твердженнях як результат для прямого копіювання або функцій з одним аргументом (наприклад,
PUT some_array[ar_idx] SQRT distance), б) або як аргумент для прямого копіювання (включаючи функціюNOT, яка є просто інвертованим копіюванням умови, наприклад,IF NOT c_array[counter]). - певні функції обчислення масиву приймають масиви як аргументи, виконуючи пошук або перетравлення і виробляючи один змінний результат.
Обробка помилок
Section titled “Обробка помилок”Помилки можуть виникати під час виконання дій.
Деякі команди, такі як CALL або RETURN, призводять до помилки через неправильне використання, що вимагає виправлення програми.
Інші команди або функції призводять до помилки або через неправильні значення аргументів (квадратний корінь з негативної змінної), або через зовнішні причини (наприклад, параметр не міг бути прочитаний або записаний).
Виникнення помилки у функції призводить до переривання виконання та переходу до обробника помилок функції.
Це може статися один раз на виклик функції: якщо обробник не був наданий, або виникає інша помилка в самому обробнику помилок, виконання продовжується в обробнику функції викликаючої сторони.
Для основної функції файлу завдання мітка onerror використовується як обробник помилок файлу завдання за замовчуванням.
Попередньо визначена змінна lasterror може використовуватися для читання коду помилки та виконання дій, специфічних для помилки.
Якщо обробник викликаючої сторони недоступний, помилка вважається необробленою - виконується обробник за замовчуванням, подібний до цього:
SYSLOG default_err_msg EXIT lasterror ; DEF default_err_msg "Unhandled error #*VAR(lasterror)*: *ERR(lasterror)*"Невідомі значення
Section titled “Невідомі значення”Помилка під час твердження зазвичай призводить до того, що ціль результату має невідоме значення.
Невідомі значення також можуть з’являтися без фактичної помилки, наприклад, при читанні неініціалізованого параметра або використанні змінної, яка не була затверджена.
Невідомі значення мають тенденцію поширюватися, оскільки більшість функцій, що посилаються на невідоме значення змінної або умови, самі призведуть до невідомого значення.
Деякі функції все ще можуть визначити результат, незважаючи на невідомі елементи в їх аргументах.
Функція масиву SELECTBY може отримати результат рано (перед досягненням будь-яких невідомих елементів пізніше).
Логічна перевірка AND може призвести до FALSE, якщо будь-який з її аргументів є FALSE (тоді як інший може мати будь-яке значення), OR може аналогічно призвести до TRUE тощо.
Критичні команди можуть вимагати додаткових перевірок (ISKNOWN / ISNOTKNOWN) і прямих тверджень змінних, або ініціалізацій параметрів, щоб захиститися від невідомих станів.
Дія перевірки IF розглядає невідомий результат функції як FALSE і пропустить наступну команду.
Це дозволяє вибирати між прямою та інвертованою функцією перевірки для захисту гілки від виконання в невідомих станах.
Приклади файлів завдань
Section titled “Приклади файлів завдань”Нижче наведені приклади готових програм, кожна з яких складається з одного файлу завдання. Щоб запустити приклад на MC252, необхідно:
- Створити текстовий файл (наприклад, з розширенням
.txt) з текстом програми. - Розмістити файл у папці
TASKS. - Розмістити підготовлену папку на карті пам’яті microSD, відформатованій як FAT або FAT32.
- Вставити карту пам’яті в MC252.
Приклад 1
Section titled “Приклад 1”Цей приклад описує програму, яка у випадку несправності пристрою відправить SMS з попередженням.
У тексті файлу завдання:
3- це Modbus ID пристроюOM-310;240- це адреса регістра, яка відстежується на предмет несправності.
# Відправка SMS, коли біт 0 регістра 240 пристрою 3 встановлений
#10-та версія протоколу@PROTOCOLVERSION 11#інтервал повторного запуску завдання буде кожні 3 секунди@UPDATE 3#ліміт очікування відповіді на запит Modbus становить 1000 мс = 1 сек@PARAMTIMEOUT 1000#після кожного запиту додається затримка, рівна часу очікування відповіді,#щоб інші клієнти могли виконувати свої запити@PARAMLOADRATIO 50
#MC252 може читати і записувати не менше 120 регістрів на один запит#зверніть увагу на символ * - це Modbus ID власного віртуального пристрою Modbus MC252DEF mc252 MBWRANY * 120 120#ОМ-310 має Modbus ID рівний 3 і дозволяє читати 4 регістри на один запит,#але записувати тільки один регістр на один запитDEF om310 MBWRSINGLE 3 4
#під час кожного оновлення необхідно зчитувати#регістр зберігання з адресою 240 з OM-310#UINT16 – означає, що 16-бітне значення беззнакове (воно не може бути менше 0)DEF alarms UINT16 om310 H 240
#кожен запуск починається тутPUT alarm READ alarms
#копіювання нульового біта регістра 240PUT alarm BITSBIT alarm 0#тепер змінна містить значення параметра 240.0, 0 або 1
#змінна порівнюється з 1, умова виробляє `TRUE`, якщо alarm = 1PUT is_alarm EQ alarm 1#умова виконується, якщо попередня умова не виконана, і навпакиPUT no_alarm NOT is_alarm
#якщо умова is_alarm виконана (якщо 240.0 = 1), то відправити одну SMSIF is_alarmSENDSMS technician_number alarm_msg
#кінець програмиEXIT OK
#текст SMSDEF alarm_msg "OM-310 (3) – avaria"
#телефон для отримання SMS можна вказати нижчеDEF technician_number "01234567"Приклад 2
Section titled “Приклад 2”У цьому прикладі програма керує значенням гістерезису на другому каналі пристрою TR-101, залежно від температури датчика на першому каналі.
Програма використовує пам’ять з живленням від батареї годинника як сховище температурних меж і відповідних параметрів гістерезису. Ці параметри відображаються на власні регістри MC252 для спрощення конфігурації програми.
У тексті файлу завдання:
16- це Modbus ID пристроюTR-101;4- це адреса регістра температури каналу 1;47- це адреса регістра гістерезису каналу 2;5500- це адреса нижньої температурної межі;5501- це адреса верхньої температурної межі;5502- це адреса гістерезису при перетині нижньої температурної межі;5503- це адреса гістерезису при перетині верхньої температурної межі.
@PROTOCOLVERSION 11@UPDATE 20 #програма буде виконуватися кожні 20 секунд@PARAMLOADRATIO 50
DEF mc252 MBWRANY * 120 120#TR-101 має Modbus ID 16 і може читати не менше 100 регістрів на один запит,#але записувати один регістр на один запитDEF tr101 MBWRSINGLE 16 100
#INT16 – регістри зі знаковими цілими числами, оскільки температура може бути менше 0DEF t_lower INT16 MEMBAT H 5500DEF t_upper INT16 MEMBAT H 5501DEF t_chan1 INT16 tr101 H 4#UINT16 – оскільки гістерезис не менше 0DEF h_at_lower UINT16 MEMBAT H 5502DEF h_at_upper UINT16 MEMBAT H 5503DEF h_chan2 UINT16 tr101 H 47
DEF temperatures VARS 3DEF hysteresi VARS 3DEF checks CONDS 3
#початок програмиrun:
#нижня та верхня температурні межі, а також його поточне значенняPUT temperatures[0] READ t_lowerPUT temperatures[1] READ t_upperPUT temperatures[2] READ t_chan1
# гістерезис для температур, які нижче (або вище) межPUT hysteresi[0] READ h_at_lowerPUT hysteresi[1] READ h_at_upper# поточне значення гістерезисуPUT hysteresi[2] READ h_chan2
# чи була температура за межами меж?PUT checks[0] LE temperatures[2] temperatures[0]PUT checks[1] GE temperatures[2] temperatures[1]# в інших випадках - не змінювати гістерезис (поточне значення)PUT checks[2] TRUE
# бажаний гістерезис вибирається з масиву hysteresi# відповідно до умов масиву checksPUT hysteresis SELECTBY hysteresi checksPUT old_hysteresis hysteresi[2]
# чи гістерезис ще не встановлений на бажане значення?IF NE hysteresis old_hysteresis# записати новий гістерезис у TR-101WRITE h_chan2 hysteresis
EXIT OKПриклад 3
Section titled “Приклад 3”У цьому прикладі описується програма, яка відстежує температуру, виміряну OB-215. Коли температура перевищує -15 градусів більше ніж 10 хвилин, вона відправляє SMS і починає реєстрацію значень температури.
У тексті файлу завдання:
11- це Modbus ID пристрою OB-215;6- це адреса регістра, з якого зчитується температура.
@PROTOCOLVERSION 11# програма буде виконуватися кожні 15 секунд@UPDATE 15DEF controller MBWRANY * 120 120DEF ob215 MBWRSINGLE 11 4DEF temperature INT16 ob215 H 6# прапор тривоги - підвищення температури більше ніж на 10 хвилинDEF alarm_temp_high UINT16 MEMTEMP H 5000# лічильник для затримки 10 хвилин (600 секунд)DEF counter UINT16 MEMTEMP H 5001
run:PUT v_temp READ temperaturePUT v_alarm READ alarm_temp_high# v_alarm автоматично визначається вище як змінна# (конструкцією PUT v_alarm READ)IF ISNOTKNOWN v_alarm PUT v_alarm 0PUT v_counter READ counterIF ISNOTKNOWN v_counter PUT v_counter 0PUT temp_limit -150
IF GR v_temp temp_limit GO noticed_temp_highWRITE alarm_temp_high 0WRITE counter 0EXIT OK
noticed_temp_high:PUT counter_limit 10PUT counter_limit MUL counter_limit 10IF GE v_counter counter_limit GO temp_high_too_longPUT v_period GETUPDPERIODSECPUT v_counter ADD v_counter v_periodWRITE counter v_counterEXIT OK
temp_high_too_long:# SMS має бути відправлено тільки один раз -# (прапор v_alarm стане 1 при наступному запуску)IF EQ v_alarm 0 SENDSMS phone1 txtWRITE alarm_temp_high 1PARAMLOG temperature txtEXIT OK
DEF txt "OB-215 (11) – avaria, tmp *VAR(v_temp)* > *VAR(temp_limit)*"DEF phone1 "01234567" ; номер телефону для SMS можна вказати тутЧасті питання
Section titled “Часті питання”П: Де розмістити файли завдань на SD-карті?
В: Розмістіть файли завдань у папці TASKS в корені SD-карти. SD-карта повинна бути відформатована як FAT або FAT32. Файли можуть мати будь-яке ім’я та розширення, крім .OBJ, .MAP, .CNF (наприклад, task.txt), а також можуть бути організовані в підпапках.
П: Як дізнатися, чи є у моєму файлі завдань синтаксичні помилки?
В: Коли MC252 завантажує файли завдань, він перевіряє їх на помилки. Якщо виявлено помилки, файл не буде завантажено. Ви можете перевірити статус завантаження через регістри Modbus (див. Карту регістрів Modbus, регістри 2020-2023). Система вкаже тип помилки та номер рядка, де була знайдена помилка.
П: Чи збережеться моя програма після відключення живлення або оновлення прошивки?
В: Програма, що зберігається у внутрішній пам’яті, зберігається при відключеннях живлення або перезапусках. Вона може бути видалена під час оновлень прошивки через оновлення форматів даних движка виконання логіки. Однак, якщо ви залишите встановленою SD-карту з файлами завдань, програма буде автоматично перезавантажена після оновлення.
П: Як очистити програму з внутрішньої пам’яті без скидання всіх налаштувань?
В: Увійдіть у режим налаштування через Modbus і запишіть команду 40959 у регістр 120. Це очистить тільки внутрішню пам’ять логіки, зберігаючи конфігурацію пристрою. Якщо встановлена SD-карта з файлами завдань, програма буде автоматично перезавантажена.
П: Що станеться, якщо виконання завдання триватиме довше, ніж інтервал UPDATE?
В: Якщо наступний запуск заплановано до завершення поточного, він буде затриманий і виконаний якомога швидше. Якщо затримано кілька запусків, вони будуть пропущені, що може вплинути на обчислення (наприклад, лічильники). У цьому випадку розгляньте можливість оптимізації довгих операцій, поділу завдання на два або збільшення інтервалу UPDATE.
П: Чи можу я обмінюватися даними між кількома файлами завдань?
В: Так. Використовуйте параметри з джерелом пам’яті (наприклад, MEMTEMP або MEMBAT), відображені на одну й ту ж адресу Modbus у різних файлах завдань. Тільки один файл завдання повинен записувати в спільний параметр (“записувач”), тоді як інші можуть читати з нього.
П: Як обробляти десяткові/дробові значення, якщо змінні цілочисельні?
В: Використовуйте арифметику з фіксованою комою, множачи дробові значення на ступінь 10. Наприклад, для роботи з 2 десятковими знаками множте значення на 100. Типи параметрів, такі як F32EP2R, автоматично обробляють це перетворення при читанні/записі. Однак будьте обережні з операціями множення, ділення та кореня, оскільки вони впливають на позицію десяткової коми.
П: У чому різниця між MEMTEMP, MEMBAT, MEMFLASH та MEMFILE?
В:
MEMTEMP- простір RAM, дані втрачаються при відключенні живлення або скиданні контролера, невеликий розмір області, але відмінна швидкість запису;MEMBAT- область пам’яті, що живиться від батареї внутрішнього годинника, дуже обмежений розмір, але хороша швидкість запису;MEMFLASH- область налаштувань контролера, дані зберігаються при скиданні, невеликий розмір і зазвичай тільки для читання;MEMFILE- розширювана файлова область, вимагає наявності карти пам’яті з файлами завдань, середня швидкість, але відмінний розмір області.
П: Чому моя перевірка IF пропускає команду, навіть коли умова здається істинною?
В: Перевірка IF розглядає значення unknown як FALSE. Якщо ваша змінна не була ініціалізована або операція READ не вдалася, значення може бути unknown. Використовуйте ISKNOWN для перевірки стану змінної перед її перевіркою.
П: Як налагодити програму файлу завдань?
В: Використовуйте команди SYSLOG для запису діагностичних повідомлень у системний журнал. Ви також можете відобразити проміжні значення на регістри Modbus, використовуючи параметри пам’яті (наприклад, MEMTEMP H 5000) і читати їх через Modbus.
П: Чи можу я використовувати одну й ту ж адресу Modbus для різних типів параметрів?
В: Так, для параметрів однакового розміру з однією й тією ж адресою. Параметри, що зберігаються в пам’яті, в цьому випадку будуть спільно використовувати одну й ту ж область пам’яті. Це корисно для передачі даних між файлами завдань. Однак параметри MEMFILE (що зберігаються на SD-карті) не підтримують функцію спільного використання.
П: Що відбувається, коли виникає помилка під час виконання програми?
В: Виконання переходить до обробника помилок. Якщо використовувався TRYCALL, він переходить до вказаної мітки обробника. В іншому випадку він шукає найближчий обробник верхнього рівня і, нарешті, мітку onerror у файлі завдань. Якщо обробник недоступний, помилка реєструється, а запуск завершується з кодом помилки.
П: Як надіслати SMS тільки один раз при спрацюванні умови тривоги?
В: Використовуйте змінну-прапорець, що зберігається в постійній пам’яті (наприклад, MEMBAT), для відстеження того, чи було вже надіслано SMS. Перевірте прапорець перед надсиланням. Встановіть його після надсилання і очистіть прапорець після закінчення умови тривоги. Дивіться Приклад 3 для робочої реалізації.
П: Як перевірити часовий інтервал, протягом якого подія активна?
В: Або використовуйте лічильник (параметр, що зберігається в пам’яті, для збільшення при кожному періоді оновлення, поки подія продовжується, і скидання до 0 після зупинки події), або мітку часу (змінну для зберігання годинника з регістрів MC252 на початку події і очищення в кінці події).
П: Як перевірити, чи виконується завдання вперше після скидання або після відключення живлення?
В: Прапорець MEMTEMP, якщо перевірити (а потім встановити в 1, якщо він не був встановлений), може вказати, чи є запуск завдання першим після циклу живлення. Прапорець MEMBAT або MEMFILE може аналогічно вказати, чи це самий перший запуск.
П: Як просканувати масив? Як виконати частину коду певну кількість разів?
В: Використовуйте змінну як індекс циклу. Перевіряйте до або після коду циклу. Використовуйте 1 або більше операторів GO для продовження циклу або для його завершення/переривання. Не забудьте збільшити або зменшити індексну змінну всередині.
П: Чи можу я виконати частину коду повторно зі складною умовою завершення циклу?
В: Так, використовуючи IF і GO. Однак це не рекомендується без явних тайм-аутів. Цикл, який не обмежений константою, може стати нескінченним або іншим чином перевищити налаштований час оновлення завдання. Це може призвести до пропуску оновлень цього завдання або затримок інших завдань.
П: Чи можу я викликати функцію з функції? Скільки рівнів вкладеності?
В: Так, ви можете викликати CALL або TRYCALL функцію, яка, у свою чергу, викликає іншу функцію. Розмір стека вкладеності дорівнює кількості операторів RETURN у файлі завдань. Через обмежений розмір стека рекурсія не рекомендується.
Потрібна допомога?
Section titled “Потрібна допомога?”Для технічної підтримки та допомоги:
- Email: support@overvis.com
- Портал підтримки: www.overvis.com/support