1. Элементы языка
1.1. Числовые литералы
Числовой литерал — это десятичное, шестнадцатеричное, восьмеричное или двоичное число, которое представляет собой целое значение (опционально может предшествовать знак минус). По умолчанию число является десятичным (основание 10). Систему счисления можно задавать с помощью префикса.
Префикс | Система счисления |
---|---|
|
Шестнадцатеричная (основание 16) |
|
Восьмеричная (основание 8) |
|
Двоичная (основание 2) |
12345
-1
0xabcd
-0xEF
0o123
-0o777
0b0101
-0b1010
Для читабельности можно использовать нижнее подчеркивание _
для разделения групп в составе числа.
1_048_576
0x1234_ABCD
0b1111_1010_0101_0000
1.2. Идентификаторы
Идентификаторы — это имена, присваиваемые константам, переменным и подпрограммам. Идентификатор должен начинаться с символа из множества [A-Z a-z _]
. Последующие символы должны быть из множества [A-Z a-z _ ' 0-9]
. Идентификаторы являются регистрозависимыми. Ниже приведены примеры правильных идентификаторов.
foo
_foo
Foo
foo_bar123'
1.3. Ключевые слова
Зарезервированные слова, которые не могут использоваться в качестве идентификаторов.
const var fun proc if else while break continue return
1.4. Комментарии
Комментарии однострочные. Комментарий отмечается специальным символом #
в начале и продолжается до конца строки.
# функция сложения
fun add(x, y)
{
return x + y; # вернуть результат
}
2. Типы данных
В языке существует единственный тип данных: 32-битное знаковое целое. Диапазон значений от −2147483648 (-231) до 2147483647 (231 - 1).
Логические (булевы) значения задаются целым:
false (ложь) |
ноль |
true (истина) |
отличное от нуля значение |
2.1. Представление вещественных чисел в формате с фиксированной точкой
Для представления вещественного числа в виде целого используется число с фиксированной точкой. Целое число является 32-битным знаковым. Для дробной части выделяется \$f\$ младших бит. Оставшиеся \$(32 - f)\$ бит отводятся на целую часть и знак.
Для температуры может быть достаточно использовать 8 бит для дробной части. В этом случае цена младшего разряда равна \$2^-8 = 0.00390625\$.
При необходимости размер дробной части можно увеличить, например, до 16 бит. В этом случае цена младшего разряда равна \$2^-16 = 1.52587890625 * 10^-5\$.
Пусть \$f = 8\$.
Для преобразования целого числа в число с фиксированной точкой необходимо умножить целое число на число \$2^f\$ (или сдвинуть целое число на \$f\$ бит влево).
Для преобразования вещественного числа в число с фиксированной точкой необходимо округлить до целого произведение вещественного числа на число \$2^f\$. \$[]\$ — операция округления до целого.
\$y = 2.7 -> [2.7 * 2^8] = 691\$
Для преобразования числа с фиксированной точкой в вещественное число необходимо поделить число с фиксированной точкой на число \$2^f\$.
\$y = 691 / 2^8 ~~ 2.7\$
Операции сложения и вычитания чисел с фиксированной точкой являются обычными операциями сложения и вычитания.
\$x - y = 804 - 691 = 113 -> 3.14 - 2.7 = 0.44 ~~ 113 / 2^8\$
Аналогично выполняется умножение и деление числа с фиксированной точкой на целочисленную константу.
Умножение чисел с фиксированной точкой выполняется следующим образом.
Деление чисел с фиксированной точкой выполняется следующим образом.
3. Объявления
3.1. Константы
Константы объявляются на верхнем уровне (уровне глобальных переменных, вне подпрограмм) с помощью ключевого слова const
и обязательно инициализируются константным выражением, которое должно вычисляться на этапе компиляции. Одновременно можно объявить несколько констант, разделяя их запятой. Объявление должно завершаться точкой с запятой.
const kilo = 1000, mega = kilo * 1000;
fun S(r)
{
return PI * r * r / 10000;
}
const PI = 31415;
3.2. Переменные
Переменные объявляются с помощью ключевого слова var
. Неинициализированные переменные по умолчанию инициализируются нулем. Одновременно можно объявить несколько переменных, разделяя их запятой. Объявление должно завершаться точкой с запятой.
var x;
var y, z = 5;
3.2.1. Глобальные переменные
Глобальные переменные объявляются вне всех подпрограмм (порядок объявлений не имеет значения) и могут инициализироваться константным выражением, которое должно вычисляться на этапе компиляции. Областью видимости глобальных переменных является вся программа.
var a = 1;
fun d(c)
{
return b * b - 4 * a * c;
}
var b = (2 + 3) * 4;
3.2.2. Локальные переменные
Локальные переменные объявляются внутри блока подпрограммы (fun
и proc
), условного оператора (if else
), цикла с предусловием (while
) и могут инициализироваться выражением. Локальные переменные имеют лексическую область видимости (видимость ограничена текстом определения подпрограммы, условного оператора, цикла с предусловием) и могут объявляться в произвольном порядке, но до места их использования.
fun roots(a, b, c)
{
var d = b * b - 4 * a * c;
if d > 0 {
return 2;
} else if d == 0 {
return 1;
} else {
return 0;
}
}
3.2.3. Параметры подпрограмм
Параметры (аргументы) подпрограммы задаются в круглых скобках через запятую в момент определения подпрограммы и имеют лексическую область видимости, аналогично локальным переменным. При определении подрограммы без параметров используются пустые круглые скобки ()
.
3.3. Подпрограммы
Подпрограмма — это именованная часть программы, содержащая описание определенного набора действий. В языке используется два типа подпрограмм: функции и процедуры.
3.3.1. Функции
Функция — это подпрограмма, которая обязательно возвращает результат. Если функция не возвращает результат явно с помощью return
, то по умолчанию возвращается ноль. Функция определяется с помощью ключевого слова fun
.
const c = 299_792_458;
fun E(m)
{
return m * c * c;
}
3.3.2. Процедуры
Процедура — это подпрограмма, которая не возвращает результат. Процедура определяется с помощью ключевого слова proc
.
proc hyper_jump(where)
{
set_destination(where);
turn_warp_drive_on();
}
4. Операторы
Блок — это последовательность операторов, заключенная в фигурные скобки {}
. Операторы должны завершаться точкой с запятой, кроме условного оператора и цикла с предусловием (они завершаются фигурными скобками).
4.1. Присваивание
Присваивание позволяет изменить значение ранее определенной переменной. Новое значение является результатом вычисления выражения правой части оператора присваивания.
x = x + 1;
4.2. Вызов процедуры
Вызов процедуры является оператором. Так как процедура не возвращает значение, то ее вызов может использоваться только в составе блока (последовательности операторов).
p(x, y);
4.3. Возврат из подпрограммы
4.3.1. Возврат из процедуры
Возврат из процедуры используется для ее явного завершения (например, по определенному условию).
proc p(x)
{
if x > 10 {
return;
}
do_something();
}
Если процедура не имеет return
, то она завершается после выполнения последнего оператора.
proc p()
{
do_first();
do_next();
do_last();
}
4.3.2. Возврат из функции
Результатом работы функции является результат вычисления выражения, заданного в операторе return
.
fun f(x)
{
return x + 1;
}
Если функция не возвращает результат явно с помощью return
, то по умолчанию возвращается ноль.
fun should_return_zero(x)
{
}
4.4. Управляющие конструкции
4.4.1. Условный оператор
Оператор if else
является стандартным условным оператором. Фигурные скобки {}
обязательны, даже если ветвь содержит один оператор.
fun cmp(a, b)
{
if a > b {
return 1;
} else if a < b {
return -1;
} else {
return 0;
}
}
4.4.2. Цикл с предусловием
Оператор while
является стандартным циклом с предусловием. Фигурные скобки {}
обязательны, даже если цикл содержит один оператор.
fun gcd(a, b)
{
var t;
while b != 0 {
t = a;
a = b;
b = t % b;
}
return a;
}
Оператор break
является оператором завершения цикла. Оператор continue
является оператором пропуска итерации цикла.
while i < n {
if i == m {
break;
}
if i == k {
continue;
}
i = i + 1;
}
5. Выражения
5.1. Операции
Унарные операции — это операции, содержащие единственный операнд, перед которым расположен знак операции.
Бинарные операции — это операции, содержащие два операнда, между которыми расположен знак операции.
В следующей таблице отражены приоритет и ассоциативность операций. Операции перечислены сверху вниз в порядке убывания приоритета.
Знак операции | Описание | Ассоциативность |
---|---|---|
Унарные операции |
||
|
Унарный минус |
Нет |
|
Побитовое НЕ |
|
|
Логическое НЕ |
|
Бинарные операции |
||
|
Умножение |
Слева-направо |
|
Деление |
|
|
Остаток |
|
|
Сложение |
|
|
Вычитание |
|
|
Побитовый сдвиг влево |
|
|
Побитовый сдвиг вправо |
|
|
Меньше |
|
|
Меньше или равно |
|
|
Больше |
|
|
Больше или равно |
|
|
Равно |
|
|
Не равно |
|
|
Побитовое И |
|
|
Побитовое исключающее ИЛИ |
|
|
Побитовое ИЛИ |
|
|
Логическое И |
|
|
Логическое ИЛИ |
Для задания приоритета используются круглые скобки.
var x = (y + z) / 2;
5.2. Вызов функции
Вызов функции является выражением. Он должен использоваться в других выражениях или в качестве правой части присваивания.
z = f(g(x) + y);
6. Встроенные константы и подпрограммы
Идентификаторы встроенных констант и подпрограмм начинаются с символа $
. Данные идентификаторы встроены в язык и не могут быть определены или переопределены пользователем.
6.1. Функция $get_event_id
Получение идентификатора текущего события.
var e = $get_event_id();
Возможные идентификаторы событий перечислены в Таблица 3, Таблица 4, Таблица 5, Таблица 6, Таблица 7, Таблица 8, Таблица 9.
Имя | Описание |
---|---|
|
Отключение внешнего питания |
|
Восстановление внешнего питания |
|
Разряд батареи до 1 уровня |
|
Разряд батареи до 2 уровня |
|
Температура платы упала до нижней границы |
|
Температура платы вернулась в допустимый диапазон |
|
Температура платы поднялась до верхней границы |
|
Вскрытие корпуса контроллера |
|
Баланс снизился до минимального значения |
|
Контроллер включен |
|
Контроллер перезапущен |
|
Прошивка обновлена |
|
Контроллер не смог подключиться к серверу-ретранслятору |
|
Контроллер не смог подключиться к сервису GPRS |
Имя | Описание |
---|---|
|
Вход 1 активен |
|
Вход 2 активен |
|
Вход 3 активен |
|
Вход 4 активен |
|
Вход 5 активен |
|
Вход 6 активен |
|
Вход 7 активен |
|
Вход 8 активен |
|
Вход 9 активен |
|
Вход 10 активен |
|
Вход 11 активен |
|
Вход 12 активен |
|
Вход 13 активен |
|
Вход 14 активен |
|
Вход 15 активен |
|
Вход 16 активен |
|
Вход 1 пассивен |
|
Вход 2 пассивен |
|
Вход 3 пассивен |
|
Вход 4 пассивен |
|
Вход 5 пассивен |
|
Вход 6 пассивен |
|
Вход 7 пассивен |
|
Вход 8 пассивен |
|
Вход 9 пассивен |
|
Вход 10 пассивен |
|
Вход 11 пассивен |
|
Вход 12 пассивен |
|
Вход 13 пассивен |
|
Вход 14 пассивен |
|
Вход 15 пассивен |
|
Вход 16 пассивен |
Имя | Описание |
---|---|
|
Охрана |
|
Наблюдение |
|
Защита |
|
Раздел 1: Охрана |
|
Раздел 1: Наблюдение |
|
Раздел 2: Охрана |
|
Раздел 2: Наблюдение |
|
Раздел 3: Охрана |
|
Раздел 3: Наблюдение |
|
Раздел 4: Охрана |
|
Раздел 4: Наблюдение |
Имя | Описание |
---|---|
|
Тестовое сообщение |
|
Информационное сообщение |
Имя | Описание |
---|---|
|
Применен профиль 1 |
|
Применен профиль 2 |
|
Применен профиль 3 |
|
Применен профиль 4 |
|
Применен профиль 5 |
|
Применен профиль 6 |
|
Применен профиль 7 |
|
Применен профиль 8 |
Имя | Описание |
---|---|
|
Входящий звонок с номера из списка управления шлагбаумом |
|
Входящий звонок с номера из Соединения 1 |
|
Входящий звонок с номера из Соединения 2 |
|
Входящий звонок с номера из Соединения 3 |
|
Входящий звонок с номера из Соединения 4 |
|
Входящий звонок с номера из Соединения 5 |
|
Входящий звонок с номера из Соединения 6 |
|
Входящий звонок с номера из Соединения 7 |
|
Входящий звонок с номера из Соединения 8 |
Имя | Описание |
---|---|
|
Инициализация |
|
Таймер 1 |
|
Таймер 2 |
|
Таймер 3 |
|
Таймер 4 |
|
Будильник 1 |
|
Будильник 2 |
|
Будильник 3 |
|
Будильник 4 |
6.2. Функция $get_input_state
Получение состояния входа n
(1 — активен; 0 — пассивен). Значение параметра n
должно быть от 1 до 8 или от 1 до 16 (в зависимости от модификации контроллера).
var s = $get_input_state(n);
6.3. Функция $get_input_value
Получение значения входа n
(от 0 до 4095, диапазон измерения 10 вольт). Значение параметра n
должно быть от 1 до 8 или от 1 до 16 (в зависимости от модификации контроллера).
var v = $get_input_value(n);
6.4. Функция $get_input_low_limit
Получение значения нижней границы входа n
(от 0 до 4095, диапазон измерения 10 вольт). Значение параметра n
должно быть от 1 до 8 или от 1 до 16 (в зависимости от модификации контроллера).
var v = $get_input_low_limit(n);
6.5. Функция $get_input_high_limit
Получение значения верхней границы входа n
(от 0 до 4095, диапазон измерения 10 вольт). Значение параметра n
должно быть от 1 до 8 или от 1 до 16 (в зависимости от модификации контроллера).
var v = $get_input_high_limit(n);
6.6. Функция $get_sensor_value
Получение значения датчика, подключенного ко входу n
. Значение параметра n
должно быть от 1 до 8 или от 1 до 16 (в зависимости от модификации контроллера). Результатом является 32-битное знаковое число с фиксированной точкой (fixed-point). Параметр p
задает размер дробной части в битах, и его значение должно быть от 0 до 31.
var v = $get_sensor_value(n, p);
6.7. Функция $get_sensor_low_limit
Получение значения нижней границы датчика, подключенного ко входу n
. Значение параметра n
должно быть от 1 до 8 или от 1 до 16 (в зависимости от модификации контроллера). Результатом является 32-битное знаковое число с фиксированной точкой (fixed-point). Параметр p
задает размер дробной части в битах, и его значение должно быть от 0 до 31.
var v = $get_sensor_low_limit(n, p);
6.8. Функция $get_sensor_high_limit
Получение значения верхней границы датчика, подключенного ко входу n
. Значение параметра n
должно быть от 1 до 8 или от 1 до 16 (в зависимости от модификации контроллера). Результатом является 32-битное знаковое число с фиксированной точкой (fixed-point). Параметр p
задает размер дробной части в битах, и его значение должно быть от 0 до 31.
var v = $get_sensor_high_limit(n, p);
6.9. Функция $get_output_state
Получение состояния выхода n
(Таблица 13). Значение параметра n
должно быть от 1 до 7 (1, 2 — реле; 3, 4, 5, 6, 7 — выходы).
6.10. Функция $get_arm_mode
Получение текущего режима охраны для модификации контроллера с одним разделом.
var m = $get_arm_mode();
Имя | Описание |
---|---|
|
Охрана |
|
Наблюдение |
|
Защита |
6.11. Функция $get_part_arm_mode
Получение текущего режима охраны раздела n
для модификации контроллера с несколькими разделами. Значение параметра n
должно быть от 1 до 4.
var m = $get_part_arm_mode(n);
Имя | Описание |
---|---|
|
Охрана |
|
Наблюдение |
6.12. Функция $is_power_on
Получение состояния внешнего питания (1 — в норме; 0 — отсутствует).
6.13. Функция $get_power_voltage
Получение напряжения внешнего питания (≥ 0 — напряжение в вольтах, умноженное на 10; -1 — внешнее питание отсутствует).
if $is_power_on() {
var v = $get_power_voltage();
}
6.14. Функция $get_battery_state
Получение состояния батареи.
var s = $get_battery_state();
Имя | Описание |
---|---|
|
Не использовалась |
|
Отключена |
|
Разряжена до 1 уровня |
|
Разряжена до 2 уровня |
|
В норме |
6.15. Функция $get_battery_charge
Получение уровня заряда батареи (≥ 0 — заряд в процентах; -1 — батарея не использовалась или отключена).
var s = $get_battery_state();
if s != $BATTERY_NOT_USED && s != $BATTERY_DISCONNECTED {
var c = $get_battery_charge();
}
6.16. Функция $is_temp_valid
Проверка достоверности значения температуры системной платы (1 — достоверно; 0 — недостоверно).
6.17. Функция $get_temp
Получение температуры системной платы (в градусах Цельсия).
if $is_temp_valid() {
var t = $get_temp();
}
6.18. Функция $is_case_opened
Проверка состояния корпуса контроллера (1 — открыт; 0 — закрыт).
var s = $is_case_opened();
6.19. Функция $is_balance_valid
Проверка достоверности значения баланса (1 — достоверно; 0 — недостоверно).
6.20. Функция $get_balance
Получение баланса (значение, умноженное на 100).
if $is_balance_valid() {
var b = $get_balance();
}
6.21. Функция $get_time
Получение текущего времени контроллера в секундах с 1 января 2000 года 00:00:00 (в установленном часовом поясе). Если значение меньше нуля, то время не определено по причине остановки часов реального времени (RTC). Максимальное значение времени соответствует 2147483647 (231 - 1) секундам или 19 января 2068 03:14:07 (в установленном часовом поясе).
6.22. Функция $get_year
Получение года (YYYY) из текущего времени контроллера.
6.23. Функция $get_month
Получение месяца (1–12) из текущего времени контроллера.
6.24. Функция $get_day
Получение дня месяца (1–31) из текущего времени контроллера.
6.25. Функция $get_day_of_week
Получение дня недели (1–7) из текущего времени контроллера.
6.26. Функция $get_hour
Получение часов (0–23) из текущего времени контроллера.
6.27. Функция $get_minute
Получение минут (0–59) из текущего времени контроллера.
6.28. Функция $get_second
Получение секунд (0–59) из текущего времени контроллера.
var t = $get_time();
if t >= 0 {
var y = $get_year(t);
var m = $get_month(t);
var d = $get_day(t);
var dow = $get_day_of_week(t);
var hh = $get_hour(t);
var mm = $get_minute(t);
var ss = $get_second(t);
}
6.29. Процедура $set_output_state
Изменение состояния выхода n
. Значение параметра n
должно быть от 1 до 7 (1, 2 — реле; 3, 4, 5, 6, 7 — выходы).
Имя | Описание |
---|---|
|
Выключен |
|
Включен |
|
Сценарий 1 |
|
Сценарий 2 |
|
Сценарий 3 |
|
Сценарий 4 |
|
Сценарий 5 |
|
Сценарий 6 |
|
Сценарий 7 |
|
Сценарий 8 |
|
Сценарий 9 |
|
Сценарий 10 |
|
Сценарий 11 |
|
Сценарий 12 |
|
Сценарий 13 |
|
Сценарий 14 |
6.30. Процедура $set_output_pulse
Формирование импульса: установка выхода n
в состояние s
($ON
или $OFF
) на время t
(в одной единице времени 100 миллисекунд; диапазон значений от 1 до 42949672). Значение параметра n
должно быть от 1 до 7 (1, 2 — реле; 3, 4, 5, 6, 7 — выходы).
$set_output_pulse(n, s, t);
6.31. Процедура $set_arm_mode
Изменение текущего режима охраны для модификации контроллера с одним разделом. Возможные значения параметра m перечислены в Таблица 10.
$set_arm_mode(m);
6.32. Процедура $set_part_arm_mode
Изменение текущего режима охраны раздела n
для модификации контроллера с несколькими разделами. Значение параметра n
должно быть от 1 до 4. Возможные значения параметра m
перечислены в Таблица 11.
$set_part_arm_mode(n, m);
6.33. Процедура $apply_profile
Применение профиля n
. Значение параметра n
должно быть от 1 до 8.
$apply_profile(n);
6.34. Процедура $set_event_mask
Установка маски событий. Маски событий могут объединяться с помощью операции побитовое ИЛИ |
.
var m = $EM_INPUT | $EM_SYSTEM;
$set_event_mask(m);
Имя | Описание |
---|---|
|
События при изменении состояния входов |
|
События при изменении режима охраны |
|
Системные события |
|
Тестовые и информационные события |
|
События при применении профилей |
|
События при входящих звонках |
|
Все типы событий |
6.36. Процедура $set_timer
Установка периодического таймера n
с интервалом t
(в одной единице времени 100 миллисекунд; диапазон значений от 1 до 42949672). По истечении времени t
будет вызвано соответствующее событие таймера (Таблица 9). Значение параметра n
должно быть от 1 до 4.
$set_timer(n, t);
6.37. Процедура $reset_timer
Сброс (остановка) таймера n
. Значение параметра n
должно быть от 1 до 4.
$reset_timer(n);
6.38. Процедура $set_alarm
Установка периодического будильника n
на время hh:mm
. После сработки будет вызвано соответствующее событие будильника (Таблица 9). Значение параметра n
должно быть от 1 до 4. Значение параметра hh
задает часы в диапазоне от 0 до 23. Значение параметра mm
задает минуты в диапазоне от 0 до 59.
$set_alarm(n, hh, mm);
6.39. Процедура $reset_alarm
Сброс (остановка) будильника n
. Значение параметра n
должно быть от 1 до 4.
$reset_alarm(n);
6.40. Процедура $raise_event
Вызов события с идентификатором e
. Возможные идентификаторы событий перечислены в Таблица 4 и Таблица 6. Данное событие вызовет заданное в конфигураторе контроллера оповещение.
$raise_event(e);
6.41. Процедура $cancel_event
Отмена текущего события. Данное событие не будет вызывать заданное в конфигураторе контроллера оповещение. Идентификаторы событий, которые могут быть отменены, перечислены в Таблица 3, Таблица 4, Таблица 5, Таблица 6, Таблица 7.
$cancel_event();
6.42. Процедура $set_input_low_limit
Установка значения нижней границы v
входа n
. Значение параметра n
должно быть от 1 до 8 или от 1 до 16 (в зависимости от модификации контроллера). Значение параметра v
должно быть в диапазоне от 0 до 4095 (диапазон измерения 10 вольт).
При значении параметра s
равном 0 значение параметра v
не сохраняется в конфигурации контроллера.
При значении параметра s
не равном 0 значение параметра v
сохраняется в конфигурации контроллера.
Частое сохранение значения параметра v в конфигурации контроллера (например, по таймеру) может со временем привести к выходу из строя флеш-памяти.
|
$set_input_low_limit(n, v, s);
6.43. Процедура $set_input_high_limit
Установка значения верхней границы v
входа n
. Значение параметра n
должно быть от 1 до 8 или от 1 до 16 (в зависимости от модификации контроллера). Значение параметра v
должно быть в диапазоне от 0 до 4095 (диапазон измерения 10 вольт).
При значении параметра s
равном 0 значение параметра v
не сохраняется в конфигурации контроллера.
При значении параметра s
не равном 0 значение параметра v
сохраняется в конфигурации контроллера.
Частое сохранение значения параметра v в конфигурации контроллера (например, по таймеру) может со временем привести к выходу из строя флеш-памяти.
|
$set_input_high_limit(n, v, s);
6.44. Процедура $set_sensor_low_limit
Установка значения нижней границы v
датчика, подключенного ко входу n
. Значение параметра n
должно быть от 1 до 8 или от 1 до 16 (в зависимости от модификации контроллера). Значением параметра v
является 32-битное знаковое число с фиксированной точкой (fixed-point). Параметр p
задает размер дробной части в битах, и его значение должно быть от 0 до 31.
При значении параметра s
равном 0 значение параметра v
не сохраняется в конфигурации контроллера.
При значении параметра s
не равном 0 значение параметра v
сохраняется в конфигурации контроллера.
Частое сохранение значения параметра v в конфигурации контроллера (например, по таймеру) может со временем привести к выходу из строя флеш-памяти.
|
$set_sensor_low_limit(n, v, p, s);
6.45. Процедура $set_sensor_high_limit
Установка значения верхней границы v
датчика, подключенного ко входу n
. Значение параметра n
должно быть от 1 до 8 или от 1 до 16 (в зависимости от модификации контроллера). Значением параметра v
является 32-битное знаковое число с фиксированной точкой (fixed-point). Параметр p
задает размер дробной части в битах, и его значение должно быть от 0 до 31.
При значении параметра s
равном 0 значение параметра v
не сохраняется в конфигурации контроллера.
При значении параметра s
не равном 0 значение параметра v
сохраняется в конфигурации контроллера.
Частое сохранение значения параметра v в конфигурации контроллера (например, по таймеру) может со временем привести к выходу из строя флеш-памяти.
|
$set_sensor_high_limit(n, v, p, s);
7. Событийно-ориентированная среда выполнения
7.1. Основные понятия
Точкой входа в программу является процедура main
без параметров. Выполнение программы определяется событиями: при возникновении события среда выполнения передает управление в процедуру main
. Идентификатор текущего события должен быть получен с помощью функции $get_event_id
.
proc main()
{
var e = $get_event_id();
handle_event(e);
}
Среда выполнения однократно вызывает событие $EVT_INIT
в следующих случаях:
-
После загрузки программы в контроллер с помощью CCU Shell (обновление программы).
-
После включения или перезагрузки контроллера.
При обработке данного события должна быть задана необходимая маска событий с помощью процедуры $set_event_mask
. После этого среда выполнения будет передавать управление в процедуру main
при возникновении разрешенных типов событий. События среды выполнения разрешены всегда и не могут быть запрещены с помощью процедуры $reset_event_mask
.
proc main()
{
var e = $get_event_id();
if e == $EVT_INIT {
$set_event_mask($EM_INPUT | $EM_SYSTEM);
} else if e == $EVT_INPUT1_ACTIVE {
handle_input1_active();
} else if e == $EVT_POWER_FAULT {
handle_power_fault();
} else {
handle_event(e);
}
}
7.2. Ошибки выполнения программы
В следующей таблице перечислены ошибочные ситуации времени выполнения, которые приводят к остановке программы. В этом случае код ошибки будет отображен в CCU Shell на странице Программируемая логика, а также отправлен пользователям, у которых в конфигураторе контроллера разрешены системные события.
Код ошибки | Описание |
---|---|
1 |
Неверный код инструкции |
2 |
Неверный код встроенной подпрограммы |
3 |
Деление на ноль |
4 |
Переполнение стека сверху |
5 |
Переполнение стека снизу |
6 |
Переполнение кода сверху |
7 |
Переполнение кода снизу |
8 |
Переполнение данных сверху |
9 |
Переполнение данных снизу |
10 |
Ошибка чтения флеш-памяти |
11 |
Превышено максимально допустимое время обработки события |
1025 |
Неверный параметр встроенной подпрограммы $get_input_state |
1026 |
Неверный параметр встроенной подпрограммы $get_input_value |
1027 |
Неверный параметр встроенной подпрограммы $get_sensor_value |
1028 |
Неверный параметр встроенной подпрограммы $get_output_state |
1029 |
Недопустимый вызов встроенной подпрограммы $get_arm_mode для данной модификации контроллера |
1030 |
Неверный параметр встроенной подпрограммы $get_part_arm_mode или недопустимый вызов для данной модификации контроллера |
1041 |
Неверный параметр встроенной подпрограммы $get_year |
1042 |
Неверный параметр встроенной подпрограммы $get_month |
1043 |
Неверный параметр встроенной подпрограммы $get_day |
1044 |
Неверный параметр встроенной подпрограммы $get_day_of_week |
1045 |
Неверный параметр встроенной подпрограммы $get_hour |
1046 |
Неверный параметр встроенной подпрограммы $get_minute |
1047 |
Неверный параметр встроенной подпрограммы $get_second |
1048 |
Неверный параметр встроенной подпрограммы $set_output_state |
1049 |
Неверный параметр встроенной подпрограммы $set_output_pulse |
1050 |
Неверный параметр встроенной подпрограммы $set_arm_mode или недопустимый вызов для данной модификации контроллера |
1051 |
Неверный параметр встроенной подпрограммы $set_part_arm_mode или недопустимый вызов для данной модификации контроллера |
1052 |
Неверный параметр встроенной подпрограммы $apply_profile |
1053 |
Неверный параметр встроенной подпрограммы $set_event_mask |
1054 |
Неверный параметр встроенной подпрограммы $reset_event_mask |
1055 |
Неверный параметр встроенной подпрограммы $set_timer |
1056 |
Неверный параметр встроенной подпрограммы $reset_timer |
1057 |
Неверный параметр встроенной подпрограммы $set_alarm |
1058 |
Неверный параметр встроенной подпрограммы $reset_alarm |
1059 |
Неверный параметр встроенной подпрограммы $raise_event |
1060 |
Неверный параметр встроенной подпрограммы $get_input_low_limit |
1061 |
Неверный параметр встроенной подпрограммы $get_input_high_limit |
1062 |
Неверный параметр встроенной подпрограммы $get_sensor_low_limit |
1063 |
Неверный параметр встроенной подпрограммы $get_sensor_high_limit |
1065 |
Неверный параметр встроенной подпрограммы $set_input_low_limit |
1066 |
Неверный параметр встроенной подпрограммы $set_input_high_limit |
1067 |
Неверный параметр встроенной подпрограммы $set_sensor_low_limit |
1068 |
Неверный параметр встроенной подпрограммы $set_sensor_high_limit |
8. Интегрированная среда разработки
Интегрированная среда разработки состоит из компилятора и редактора программного кода, которые встроены в CCU Shell на странице Программируемая логика.
Клавиши | Описание |
---|---|
|
Управление курсором |
Home |
Перейти в начало строки |
End |
Перейти в конец строки |
Ctrl+Home (PC), Command+Home (Mac) |
Перейти в начало текста |
Ctrl+End (PC), Command+Down (Mac) |
Перейти в конец текста |
PgUp |
Перейти на страницу вверх |
PgDn |
Перейти на страницу вниз |
Enter |
Вставить новую строку |
Backspace |
Удалить символ слева от курсора |
Delete |
Удалить символ справа от курсора |
Ctrl+D (PC), Command+D (Mac) |
Удалить строку |
Ctrl+A (PC), Command+A (Mac) |
Выделить все |
Ctrl+U (PC), Command+U (Mac) |
Отменить выделение |
Ctrl+F (PC), Command+F (Mac) |
Найти |
Ctrl+G (PC), Command+G (Mac) |
Найти следующий |
Shift+Ctrl+G (PC), Shift+Command+G (Mac) |
Найти предыдущий |
Shift+Ctrl+F (PC), Command+Alt+F (Mac) |
Заменить |
Shift+Ctrl+R (PC), Shift+Command+Alt+F (Mac) |
Заменить все |
Ctrl+Z (PC), Command+Z (Mac) |
Отмена последнего действяи |
Ctrl+Y (PC), Command+Y (Mac) |
Повтор последнего отмененного действия |
Ctrl+Enter |
Полноэкранный режим вкл./выкл. |
Команда | Описание |
---|---|
Компилировать |
Компилировать исходный код программы в редакторе |
Загрузить и запустить |
Загрузить в контроллер и запустить скомпилированную программу |
Обновить из контроллера |
Загрузить в редактор исходный код программы из контроллера |
Скачать |
Скачать из контроллера исходный код программы в файл prog.ext |
Открыть файл |
Загрузить в редактор исходный код программы из файла с расширением ext |
Пустая программа |
Загрузить в редактор исходный код пустой программы |