А если запихнуть и уставки таймера и состояние выходов в массив?
Код: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
Последний раз редактировалось EFrol; 22.04.2026 в 07:43.
Добрый день! Всем большое спасибо за помощь!
Так же хотел извиниться если моё обращения показалось наглым, ей Богу не была умысла реализовать проект чужими руками, просто не мог понять с чего начать, как уже писал ранее есть только опыт написания простых проектов на основе логических функций, только только начинаю постигать азы программирования.
Вот пока за основу взял Ваш Dimensy пример https://owen.ru/forum/showthread.php...l=1#post482777 расшарил макрос до 40 шагов, задал режимы и длительности импульсов, на симуляторе вроде отрабатывает, но я так понимаю это наверное тоже не совсем правильно будет, пока смог разобраться только с этим.
По использовать языка ST пока не разобрался, буду изучать мат часть.
По рекомендации In_Da_Cher_A привёл циклограмму в более менее божеский вид![]()
Думаю логично было бы продолжать с прерванного шага
Тогда в программе отсюда https://owen.ru/forum/showthread.php...l=1#post482777 нужно у счетчика CTN1 установить параметр "Сохранять состояние" в "ДА". В этом случае программа продолжиться с прерванного шага (с начала шага). Если еще надо и время запоминать (т.е. начинать не с начала шага, а с какого-то времени), тогда нужно свой таймер писать
Я смотрю, у вас там есть кнопка "Пауза" - тоже нужно определиться: пауза - это остановить и потом начать с начала прерванного шага (это просто делается) или после паузы продолжить именно с того времени когда была остановка (тогда свой таймер с паузой писать)
Последний раз редактировалось Dimensy; 22.04.2026 в 11:07.
Добрый день! Поделитесь макросом чтобы INT раскидать в BOOL. У меня был один но он чтото не раскрываеться на ,,холлсте,, ПР205. Спасибо
А, все, нашелся.