Большинству функций необходимо сохранять промежуточные данные между вызовами. Для этого надо объявить таблицу, вне функций. Пример:
-- Переключение зима/лето
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
function curve( x, x1, y1, x2, y2, extrapolation)
Функция позволяет строить график, состоящий из линейного отрезка, заданного точками x1, y1, x2, y2, т.е. значение функции y = ƒ(x) для заданных значений х на входе. При extrapolation = false, значение на выходе будет равно у1 , если значение на входе меньше х1 или у2 , если значение на входе больше х2 . При extrapolation = true, значение на выходе вычисляется с линейной экстраполяцией каждый раз, когда входящий сигнал выходит за область, заданную координатами (х1 , х2).
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 выходит за область.
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 - вспомогательная таблица, хранящая промежуточные данные или уникальная строка.
function filt(signal,table_or_key)
Пример:
-- Фильтрование
v.var1 = filt(v.var,'Фильтрование')
Фильтр первого порядка с постоянной времени, заданной time_const. Начальное значение берется при первом вычислении из не фильтрованного значения signal.
table_or_key - вспомогательная таблица, хранящая промежуточные данные или уникальная строка.
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 - вспомогательная таблица, хранящая промежуточные данные или уникальная строка.
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 - вспомогательная таблица, хранящая промежуточные данные или уникальная строка.
function pida(t, mv, sp, tsg, mode, G, Ti, Td),
здесь:
Параметры G, Ti, Td можно не задавать в вызове функции, а один раз определить в таблице t. Приоритет при передаче в функцию.
t - таблица с изначально установленными полями:
Пример:
-- ПИД по воздуху
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
function pidi(t, mv, sp, mode, G, Ti, Td),
здесь:
Параметры G, Ti, Td можно не задавать в вызове функции, а один раз определить в таблице t. Приоритет при передаче в функцию.
t - таблица с изначально установленными полями:
Возвращаемое значение: -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
function pidi_to_analog(dt,stroke_time,t)
Используется для примерной оценки положения клапана увеличить-уменьшить, основываясь на полном времени хода, и выполненных управляющих командах. Для вывода на мнемосхему.
Здесь:
Возвращаемые значения analog,dt_new,open_time:
Пример см. функцию pidi.
Функция возвращает true, если активно хотя бы одно расписание.
Если все расписания не активны то false.
Расписания определяются в меню эксплуатации -> Расписания.
Copyright © 2023 | Москва | ООО «АОВ инженеры» | rktcontr.ru | тел. +7(985)681-58-00 | info@enaov.ru