Код:
function_block Washing
var_input
OnOff : bool; // Запуск/остановка программы
end_var
var_output
K1, K2, K3, K4, K5, K6, K7, K8 : bool; // Выхода
t1, t2 : udint; // Прошедшие минуты и секунды с момента старта
end_var
var
tb, i : udint; // Время старта и номер режима
rb : SYS.RTRIG; // Фиксатор старта
Mode : udint; // Текущий режим
// Упаковка биты 15-8 - состояние выходов Kx, 7-2 - секунда, 1-0 - минута
Modes : array [1..40] of udint :=
[256, 34600, 316, 34600, 356, 1400, 396, 160, 39080, 40136,
4316, 38913, 39977, 4157, 38993, 40037, 5241, 4237, 161, 34729,
477, 34562, 1322, 318, 82, 57434, 58490, 16546, 57526, 58590,
16407, 57387, 58451, 17511, 16507, 143, 33687, 34743, 1483, 479];
end_var
rb(I:=OnOff); // Фиксируем момента старта
if rb.Q then
tb := time_to_udint(get_time()) / 1000; // Старт программы
end_if
if OnOff then // Программа в работе
t2 := time_to_udint(get_time()) / 1000 - tb;// Прошло времени после старта
t1 := t2 / 60; t2 := t2 - (t1 * 60); // в минутах и секундах
if t1 < 4 then
for i := 1 to 40 do // Для каждой строчки
Mode := Modes[i]; // Извлекаем данные
if shr(shl(Mode, 30), 30) = t1 then // Сравним минуты
if shr(shl(Mode, 24), 26) = t2 then // Сравним секунды
// Выставим выхода в случае совпадения
K1 := Mode.8; K2 := Mode.9; K3 := Mode.10; K4 := Mode.11;
K5 := Mode.12; K6 := Mode.13; K7 := Mode.14; K8 := Mode.15;
exit;
end_if
end_if
end_for
end_if
else // Программа остановлена
K1 := false; K2 := false; K3 := false; K4 := false; K5 := false; K6 := false; K7 := false; K8 := false;
end_if
end_function_block