Язык Lua.

Создание программ для контроллеров RKT на языке Lua.

Язык Lua.

Lua - скриптовый язык программирования.

Используется версия 5.3.5.

Поддерживаются стандартные библиотеки Lua: math, bit32, table, string.

Используется 32-битный тип данных для чисел, вместо 64-битного типа по умолчанию.

Книга: Роберту Иерузалимски. Программирование на языке Lua.

Определение переменной в программе.

Функция определяет новую переменную:

VAR(строка_тип_переменной,строка_имя_переменной,таблица_опций)

строка_тип_переменной - тип переменной, может иметь значения:

  • 'DS' - дискретная переменная (true/false).
  • 'AN' - аналоговая переменная
  • 'IN' - integer переменная
  • 'AL' - переменная аварии

строка_имя_переменной - строка с названием переменной, например, 'Diff_press_filter'.

таблица_опции - необязательный параметр, в котором можно задать не обязательные опции:

  • backup=true, -- Сохранение изменений переменной в энергонезависимой памяти. Для переменных аварии по умолчанию.
  • start_value="число", -- Задание начального значения переменной. По умолчанию: 0. Задается в строковом виде, в кавычках. Для дискретных, нормально закрытых переменных задается "1".
  • time_const="число", - значение постоянной времени для фильтра AN (сек). Чтобы ПИД регулятор нормально работал, необходимы фильтры на аналоговых входах. Если time_const > 0, то после преобразования, значение пропускается через фильтр первого порядка.

Также time_const для фильтра можно задать отдельной функцией:

FilterAI(var_name, time_const)
-- Например, чтобы выключить фильтр для отладки программы:
FilterAI('Т_нар_воздуха', 0)

Примеры определения переменных:

VAR('DS','Diff_press_fan')
VAR('DS','Thermostat',{start_value="1"})
VAR('AN','Т_нар_воздуха')
VAR('AN','SP_prit',{backup=true,start_value="22"})
VAR('AL','АВАРИЯ_ТЕРМОСТАТА')

Точка входа в программу. Функция cycle().

В программе Lua необходимо определить функцию вызова на каждом цикле:

function cycle()

end

Функция cycle() вызывается системой один раз в секунду.

Доступ к переменным в программе. Таблица v.

Специальная таблица v обеспечивает чтение и запись переменных.

--Если определена переменная:
VAR('DS','Переменная')

--тогда чтение переменной:
local s = v['Переменная']

--или запись переменной:
v['Переменная'] = true

Для дискретных 'DS' переменных и аварий 'AL' используется тип Lua boolean, а именно значения true или false. Например:

v['ЗИМА'] = true
v['АВАРИЯ_ЗАСЛОНКИ'] = false

Для аналоговых переменных 'AN' используется тип Lua number, т.е число например:

v['КЛАПАН_ВОДЫ'] = 30.5

Модули Lua. Функция require.

require - стандартная Lua функция для загрузки модулей. Список загруженных модулей появляется в редакторе-отладчике Lua. Модуль можно отлаживать также, как основную программу.

Обычно в модуле определяются (см. пример Lua программы в загрузках):

  • переменные VAR()
  • код алгоритма

В программе определяются:

  • загрузка модулей с помощью require
  • привязка переменных к входам выходам
  • преобразование входных сигналов 4-20мА и 0-10В
  • параметры настройки PID и др. при наладке
  • опрелеление файла мнемсхемы
  • определение function cycle() и вызов функций модулей

Несколько программ могут использовать одни и те же модули.

Привязка входов-выходов.

С помощью функций Bind* можно выполнить привязку переменной к терминалу модулей ввода вывода или переменной другой FBD или Lua программы, в том числе, и из другого контроллера.

Таблицу переменных модулей ввода вывода можно посмотреть в FBD меню: «Таблица переменных modbus.»

Для функций BindIn и BindInNV автоматически выполняется подписка на привязываемую удаленную переменную и при ее изменении, приходит новое значение.

Для функций BindOut, BindOutNV при изменении самой переменной в Lua программе автоматически происходит отправка в привязанную удаленную переменную.

Сетевая переменная.

При привязке указывается имя системы и имя переменной.

BindInNV(var_name,remote_system,remote_var_name)
BindOutNV(var_name,remote_system,remote_var_name) 
--Примеры:
BindInNV('Т_нар_воздуха','П2', 'Т_нар')
BindOutNV('ВЫТ_ВЕНТ','В1','УДАЛЕННЫЙ_ПУСК') 

Терминал модуля.

BindIn(var_name, module_type, module_num, terminal) 
BindOut(var_name, module_type, module_num, terminal)
--Примеры:
BindIn('Т_нар_воздуха','RKT-302', 1, 'AI3')
BindOut('ВЕНТИЛЯТОР','RKT-302', 1, 'DO1')
BindIn('Т_нар_воздуха','RKT-242', 1, 'AI1')
BindOut('ВЕНТИЛЯТОР','RKT-222', 2, 'DO1')

В результате формируется привязка к сетевым переменным:

Для модулей ввода-вывода:

  • remote_system = "mb1"
  • remote_var_name = terminal.module_num.module_type; Пример: DI1.1.RKT-222

Для RKT-302:

  • аналоговые переменные: система = "mb_RKT302_AIO", переопределяется module_num = 1
  • дискретные переменные: система = "io", переопределяется module_num = 0

Преобразование входных сигналов 4-20мА и 0-10В.

TransformAI(var_name, x1, x2, y1, y2) 

Для модуля RKT-252:

  • Если вход 0-10 В, то 0 вольт соответствует 0, а 10 вольт соответствует 10000.
  • Если вход 4-20 мА, то 4 мА соответствует 2000, а 20 мА соответствует 10000.

Например:

--Для датчика температуры 0-160 градусов, 0-10 В:
TransformAI('Т_отопления', 0, 10000, 0, 160)
--Для датчика давления 0-6 атм, 4-20 мА:
TransformAI('Т_отопления', 2000, 10000, 0, 6)

Опрелеление файла мнемосхемы для системы

set_mnemo(имя_файла)
-- Пример:
set_mnemo('pritok_3D.svg')