Введение в usr.lua

Что можно увидеть в файле usr.lua?

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".

Как часто вызывается usr.tick() ?

Сервер общается с изделием раз в минуту. Поэтому, выбран такой же период вызова этой функции. Но это не обязательно. Если пользователь сочтет нужным, период можно уменьшить.

  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)

Добавляем управление с помощью реле. Собственно, это главная функция, потому, что она обеспечивает поддержание температуры.

Параметры

  • th_tab.tset_c -заданная температура;
  • main_ch - номер главного канала;
  • th_tab.tsens_arr_c[main_ch] - температура главного канала;
  • second_ch - номер резервного канала;
  • th_tab.tsens_arr_c[second_ch] - температура резервного канала;
  • hysteresis - величина гистерезиса;
  • флаг инверсии управления (true или false);
tick_counter = tick_counter + 1

Text

увеличиваем счетчик обращений к функии, он может пригодится

Допустим, мы хотим послать событие. 

Это может быть событие только для отладки, а может и авария, которая должна отображаться сервером. Тогда используем такой код. Пусть, информационное событие посылается каждые 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)
  • tset_c -заданная температура, градусы Цельсия;
  • tsens_main_c - температура главного канала, градусы Цельсия;
  • tsens_second_c - температура резервного канала, градусы Цельсия;
  • thyst_c - величина гистерезиса, градусы Цельсия;
  • relay_index - номер реле (от 1 до 6)
  • inversion -флаг инверсии управления (true - есть инверсия и false - нет инверсии). Под инверсией понимается, какое состояние соответствует включенному котлу. Нет инверсии - значит котел греет при включенном реле;

Основные 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

Введение в usr.lua

By Sergey

Введение в usr.lua

  • 1,236