Библиотечные функции RKT Lua.

Общие сведения.

Большинству функций необходимо сохранять промежуточные данные между вызовами. Для этого надо объявить таблицу, вне функций. Пример:

-- Переключение зима/лето
local t_zl = {} -- таблица для сохранения данных, для вызовов delay()
function cycle() 
    ..
    local termostat_delay60 = delay(not v['ТЕРМОСТАТ'], 0, 60, t_zl)
    ..
end

Однако, вместо таблицы можно указать уникальную строку, и тогда таблицу объявлять не надо. Пример:

function cycle() 
    ..
    local termostat_delay60 = delay(not v['ТЕРМОСТАТ'], 0, 60, 'термостат 60 секунд')
    ..
end

curve().

function curve( x,  x1,  y1,  x2,  y2,  extrapolation)

Функция позволяет строить график, состоящий из линейного отрезка, заданного точками x1, y1, x2, y2, т.е. значение функции y = ƒ(x) для заданных значений х на входе. При extrapolation = false, значение на выходе будет равно у1 , если значение на входе меньше х1 или у2 , если значение на входе больше х2 . При extrapolation = true, значение на выходе вычисляется с линейной экстраполяцией каждый раз, когда входящий сигнал выходит за область, заданную координатами (х1 , х2).

curve2().

function curve2( x,  curve_data,  extrapolation) 

Пример:

    local curve_data={
        {x=-10,y=60},
        {x=0,y=55},
        {x=10,y=43},
        {x=15,y=25.7},
    }
    local x = 5
    local y = curve2(x, curve_data, true)

Функция позволяет строить график, состоящий из линейных отрезков, заданных в таблице curve_data, состоящей из массива таблиц с полями x и y.
При extrapolation = false, значение на выходе будет равно curve_data[1].у, если значение на входе меньше curve_data[1].x или curve_data[N].у , если значение на входе больше curve_data[N].x . При extrapolation = true, значение на выходе вычисляется с линейной экстраполяцией каждый раз, когда x выходит за область.

delay().

function delay(signal,delay_on,delay_off,table_or_key)

Пример:

    -- Контроль работы вентилятора
    local run_fan_delay = delay(v['ВЕНТИЛЯТОР'], 10, 0, 'Задержка для контроля перепада')
    if run_fan_delay and (not v['ПЕРЕПАД_НА_ВЕНТИЛЯТ']) then
        v['АВАРИЯ_ВЕНТИЛЯТОРА'] = true
        v['КРИТИЧЕСКАЯ_АВАРИЯ'] = true
    end

Входящий signal должен иметь значение true на протяжении времени, превышающего по длительности delay_on, для того, чтобы генерировать true на выходе .

Для переключения выхода на значение false, входящий signal должен иметь значение false на протяжении времени, превышающего delay_off.

table_or_key - вспомогательная таблица, хранящая промежуточные данные или уникальная строка.

filt().

function filt(signal,table_or_key)

Пример:

-- Фильтрование 
    v.var1 = filt(v.var,'Фильтрование') 

Фильтр первого порядка с постоянной времени, заданной time_const. Начальное значение берется при первом вычислении из не фильтрованного значения signal.

table_or_key - вспомогательная таблица, хранящая промежуточные данные или уникальная строка.

hyst().

function hyst(signal,deactivate,activate,table_or_key)

Пример:

    -- Переключение зима/лето
    v['ЗИМА'] = v['Зима_принудительно'] or 
        not hyst(v['Т_нар_воздуха'], 8, 12, 'Гистерезис Зима-Лето')

В том случае, когда значение параметра Активный больше, чем значение параметра Пассивный, данный блок будет выполнять следующую функцию: если значение на выходе блока ЛОЖЬ (0), а значение входящего сигнала превышает границу области активации, то значение на выходе изменяется на ИСТИНА (1). Если значение на выходе блока ИСТИНА (1), а значение входящего сигнала меньше значения на границе области дезактивации, значение на выходе становится ЛОЖЬ (0). В том случае, если входящий сигнал по своему значению находится между границами областей активации и дезактивации, выход блока сохраняет свое первоначальное состояние.

В том случае, когда значение параметра Активный меньше, чем значение параметра Пассивный, данный блок будет выполнять следующую функцию: если значение на выходе блока ИСТИНА(1), а значение входящего сигнала превышает величину допустимого крайнего значения области дезактивации, то значение на выходе изменяется на ЛОЖЬ (0). Если значение на выходе блока ЛОЖЬ (0), а значение входящего сигнала меньше значения на границе области дезактивации, значение на выходе становится ИСТИНА (1). В том случае, если входящий сигнал по своему значению находится между границами областей активации и дезактивации, выход блока сохраняет свое первоначальное состояние.

table_or_key - вспомогательная таблица, хранящая промежуточные данные или уникальная строка.

osc().

function osc(pulse_time,cycle_time,table_or_key)

Пример:

-- Отслеживание недельного расписания 
local t_sch = {}
function cycle() 
    -- p = 1 каждую минуту
    local p = osc(1,60,t_sch)
end

Функция генерирует импульсы длиной, равной значению параметра pulse_time, с периодичностью, заданной параметром cycle_time. Последовательность импульсов кратна 1 секунде.

table_or_key - вспомогательная таблица, хранящая промежуточные данные или уникальная строка.

pida() - PID регулятор с аналоговым выходом.

function pida(t, mv, sp, tsg, mode, G, Ti, Td),

здесь:

  • mv - измеряемое значение
  • sp - уставка
  • tsg - значение регулятора на предыдущем шаге
  • mode - рабочий режим регулятора: 0 - регулятор остановлен (возвращает tsg), 1 - нормальный режим управления, 2 - значение на выходе равно umax, 3 - значение на выходе регулятора равно umin.
  • G - пропорциональное усиление
  • Ti - постоянная интегрирования (сек)
  • Td - постоянная дифференцирования (сек)

Параметры G, Ti, Td можно не задавать в вызове функции, а один раз определить в таблице t. Приоритет при передаче в функцию.

t - таблица с изначально установленными полями:

  • dz - мертвая зона.
  • control_int - Интервал управления (сек).
  • umin - Минимальный управляющий сигнал.
  • umax - Максимальный управляющий сигнал.
  • stroke_time - Время полного хода штока привода (сек)

Пример:

-- ПИД по воздуху
local  pid_air = {
        Td = 0,                 -- Время дифференцирования (сек).
        dz = 0.01,              -- Мертвая зона.
        control_int = 1,        -- Интервал управления (сек).
        umin = 0,               -- Минимальный управляющий сигнал.
        umax = 100,             -- Максимальный управляющий сигнал.
        stroke_time = 40,       -- Время полного хода штока привода (сек)
}
local pid_air_G, pid_Ti = 2, 100
function cycle()
    local pred_valve = v.Klapan_voda
    -- Расчитываем PID по воздуху
    v.Klapan_voda = pida(pid_air, v.T_prit, v.SP_prit, pred_valve, 1, pid_air_G,pid_Ti)
end

pidi() - PID-регулятор увеличить/ уменьшить.

function pidi(t, mv, sp, mode, G, Ti, Td),

здесь:

  • mv - измеряемое значение
  • sp - уставка
  • mode - рабочий режим регулятора: 0 - регулятор остановлен (возвращает tsg), 1 - нормальный режим управления, 2 - значение на выходе равно umax, 3 - значение на выходе регулятора равно umin.
  • G - пропорциональное усиление
  • Ti - постоянная интегрирования (сек)
  • Td - постоянная дифференцирования (сек)

Параметры G, Ti, Td можно не задавать в вызове функции, а один раз определить в таблице t. Приоритет при передаче в функцию.

t - таблица с изначально установленными полями:

  • dz - мертвая зона.
  • control_int - Интервал через который производится расчет PID (сек).
  • umin - Минимальный управляющий сигнал.
  • umax - Максимальный управляющий сигнал.
  • stroke_time - Время полного хода штока привода (сек)

Возвращаемое значение: -1 -закрываем, 0 - не изменяем, 1 - открываем, до следующего 1 сек. цикла.

Пример:

-- ПИД для охлаждающего клапана
local  pid_holod = {
        mode = 1,               -- Рабочий режим регулятора.
        G = -10,                -- Пропорциональное усиление.
        Ti = 300,               -- Время интегрирования (сек).
        Td = 300,               -- Время дифференцирования (сек).
        dz = 0.5,               -- Мертвая зона.
        control_int = 300,      -- Интервал управления (сек).
        stroke_time = 120,      -- Время полного хода штока привода (сек)
}
local t_an = {}

function holod_3point_valve_control()
    -- время хода привода хол. воды: 120 секунд
    local dt = pidi(pid_holod, v.T_prit, v.SP_prit, 1, v.pid_holod_G, v.pid_holod_Ti, v.pid_holod_Td)

    -- Оцениваем примерное положение клапана
    local analog,dt_new, open_time = pidi_to_analog(dt,120,t_an)

    -- Выводим на мнемосхему
    v.klapan_hol = analog

    -- Управляем реле
    if (dt == 1) then 
        v.DO_valve_holod_close = false
        v.DO_valve_holod_open = true
    elseif dt == 0 then
        v.DO_valve_holod_open = false
        v.DO_valve_holod_close = false
    elseif (dt == -1) then 
        v.DO_valve_holod_open = false
        v.DO_valve_holod_close = true
    end
end

pidi_to_analog() - преобразование выхода pidi в аналоговое значение.

function pidi_to_analog(dt,stroke_time,t)

Используется для примерной оценки положения клапана увеличить-уменьшить, основываясь на полном времени хода, и выполненных управляющих командах. Для вывода на мнемосхему.

Здесь:

  • dt - результат вызова функции pidi.
  • stroke_time - Время полного хода штока привода (сек)
  • t - вспомогательная таблица

Возвращаемые значения analog,dt_new,open_time:

  • analog - Ориентировочное значение в % от 0 до 100 открытия клапана.
  • dt_new = (-1,0,1) происходит оценка, если клапан полностью закрыт или открыт, то что бы сохранить ресурс реле, включения не выполняются.
  • open_time - Ориентировочное время открытия в секундах.

Пример см. функцию pidi.

tsch().

Функция возвращает true, если активно хотя бы одно расписание.

Если все расписания не активны то false.

Расписания определяются в меню эксплуатации -> Расписания.