local usr = {}
utility = require("lua/utility")
get = require("lua/get")
api = require("lua/api")
--[[
Этот файл содержит код пользователя. Только этот файл пользователь может менять по своему усмотрению.
Желательно, чтобы пользователь использовал только вызовы, описанные в файле api.lua.
]]--Так выглядят комментарии в программе
Заголовок файла, здесь описано, какие модули подключаются и как называется модуль из этого файла.
tick_counter = 0 Здесь описана глобальная переменная. Глобальная, потому, что перед ней не стоит слово "local".
function usr.tick()
-- тело функции, здесь весь ее код
endСобственно, главная функция, usr.tick(). Она вызывается по "тику", т.е. периодически. Вот здесь находится весь алгоритм работы устройства.
Заканчивается любая функця словом "end".
Сервер общается с изделием раз в минуту. Поэтому, выбран такой же период вызова этой функции. Но это не обязательно. Если пользователь сочтет нужным, период можно уменьшить.
local hysteresis = utility.param.s3_setup.Hist/10
local main_ch =th_tab.main_channel_ind
local second_ch = th_tab.second_channel_indОбъявляем локальные переменные. Они "видимы" только в этой функции. Для этого перед именем стоит слово "local". Не забывайте делать так же, иначе имя может совпасть с другой переменной!
if g_log_level >= 3 then -- maximum level
print("<><> usr.tick(), arguments: ",th_tab.tset_c, main_ch, second_ch, th_tab.tsens_arr_c[main_ch], hysteresis)
endМы хотим напечатать значение переменных. Но печатать только, если глобальная переменная g_log_level больше или равна 3.
В начале строки печатается текст "<><> usr.tick(), arguments: ", заключенный в кавычки. Далее в одну строку печатается значение переменных th_tab.tset_c и так далее.
relay_comparator(th_tab.tset_c, th_tab.tsens_arr_c[main_ch],
th_tab.tsens_arr_c[second_ch], hysteresis, 1, false)Добавляем управление с помощью реле. Собственно, это главная функция, потому, что она обеспечивает поддержание температуры.
Параметры
tick_counter = tick_counter + 1Text
увеличиваем счетчик обращений к функии, он может пригодится
Допустим, мы хотим послать событие.
Это может быть событие только для отладки, а может и авария, которая должна отображаться сервером. Тогда используем такой код. Пусть, информационное событие посылается каждые 55 вызовов, а аварийное - каждые 75 вызовов.
if (tick_counter % 55) == 0 then
send_event(0, 0, "Информационное событие по-русски ")
end
if (tick_counter % 75) == 0 then
send_event(1, 0, "Fault Event ")
endФормат функции send_event(a, b, text):
a - если 0, то это информационное событие, оно отображается сервером, как и другие события;
b - тип события, пожалуйста, ставьте сюда ноль;
text - произвольный текст в кавычках, длиной до 200 символов, если латиницей и до 100 символов, если кириллицей;
Из кода видно, что символом процента "%" обозначается деление по модулю. Это, когда берется целая часть от деления, а дробная часть отбрасывается.
Основные API (Application Programming Interface) функции
- они обеспечивают доступ к вводу-выводу, готовые утилиты для управления оборудованием и т. п.
get_digit_input(index)Получить состояние входа с номером "index" (от 1 до 3)
Возвращает "0", если высокий уровень и "1", если низкий уровень
get_counter(index)Получить число импульсов за секунду
get_analog_input(index)Получить значение аналогового входа (масштаб уточняется)
get_relay(index)Получить состояние реле с номером "index" (от 1 до 6)
set_relay(index, status)Установить состояние реле с номером "index".
Если "status" равен 1, то реле включено
get_analog_output(index)Получить состояние аналогового выхода с номером "index" (от 1 до 6)
Состояние в милливольтах, т.е. величина 10000 соответствует 10В
relay_comparator(tset_c, tsens_main_c, tsens_second_c, thyst_c, relay_index, inversion)Основные API (продолжение)
send_event(level, type, message)Создание произвольного события и отправка его на сервер.
level = 0 - информационное событие
level = 1 - аварийное событие, его серверо отображает как аварийное
type - если младший бит равен 1, то кодировка текста CP1251, иначе - UTF8. На самом деле, можно ставить type = 0 и использовать любой язык в тексте
message - произвольный текст длиной до 200 символов для латиницы и 100 символов для кириллицы. Более длинный текст образается
send_fault_event(id, sensor_num, msg_string)
Создание события, совместимого с ZONT H.
id - идентификатор, смотри ниже;
sensor_num - номер отказавшего датчика температуры;
msg_string - текст для данного отказа, ограничение ХХХХ знаков (уточняется);
EVENT_ID_MAIN_POWER_FAULT 10 - пропадание питания (sensor_num и msg_string не требуются)
EVENT_ID_MAIN_POWER_OK 11 - появление питания (sensor_num и msg_string не требуются)
EVENT_ID_SENSOR_ALARM_HIGH 71 - порог максимальной температуры датчика sensor_num
EVENT_ID_SENSOR_ALARM_LOW 72 - порог минимальной температуры датчика sensor_num
EVENT_ID_SENSOR_ALARM_FAULT 73 - датчик sensor_num неисправен
EVENT_ID_FAULT_START 74 (sensor_num и msg_string не требуются)
EVENT_ID_FAULT_END 75 (sensor_num и msg_string не требуются)
pi_control(tset_c, tsens_main_c, tsens_second_c, mode, prop_k, integr_k)
Пропорционально-интегральное управление
function pi_control(tset_c, tsens_main_c, tsens_second_c, mode, prop_k, integr_k)
tset_c - заданная температура, градусы Цельсия;
tsens_main_c - главный термодатчик, градусы Цельсия;
tsens_second_c - резервный термодатчик, градусы Цельсия;
mode - режим, пока не опредлен;
prop_k - коэффициент усиления пропорционального канала;
integr_k - коэффициент усиления интегрального канала;
Основные API (продолжение)
timer_ton(name, vin, timeout)Таймер задержки включения
name - имя таймера, произвольное название латиницей в кавычках
vin - переменная программы. Переменная должна иметь одно из двух значений, 0 или 1. Когда происходит переход переменной из 0 в 1 отслеживается и запускает таймер.
timeout - величина таймаута в секундах
Выходное значение таймера 0 или 1, в зависимости от состояния. Когда таймер взведен, то на выходе 0. Когда таймер не взведен, то на выходе то же, что в переменнй vin.
Text
Text
Text
Таблица с параметрами, которая синхронизирована с сервером
API включает не только функции, но и таблицу параметров. Эта глобальная таблица называется th_tab. Приведем ее поля и пояснения к ним:
| Поле таблицы | Значение | Комментарий |
|---|---|---|
| relay_status[n] | 1 - реле включено; 0 - выключено; | n - номер реле от 1 до 6 |
| digit_input[n] | 0 - высокий уровень, 1 - низкий уровень | n - номер входа от 1 до 3 |
| analog_input[n] | аналоговый вход | n - номер входа от 1 до 3 |
| analog_output[n] | аналоговый выход 0/10V | n - номер входа от 1 до 6 |
| mode | режим пользователя: 0/1/2/3 - выключен/комфорт/эконом/расписание | |
| main_channel_ind | номер главного канала регулирования | нумерация с единицы |
| second_channel_ind | номер резервного канала регулирования | нумерация с единицы |
| hyster_c[n] | гистерезис | нумерация с единицы |
| tset_c[n] | заданная температура, градусы Цельсия | нумерация с единицы |
| sens_status[n] | параметры датчика, | нумерация с единицы |
| tset_arr_c[n] | нумерация с единицы | |
| tsens_arr_c[n] | нумерация с единицы | |
|
power_state |
||
|
boiler_fault_state |