Просмотр полной версии : ПЛК 160 циклическое включение выходов
DKFLBVBH
29.12.2014, 07:27
Уважаемые форумчане,
Прошу помощи с реализацией следующей задачи на ПЛК 160:
есть 3 дискретных выхода, каждый из них нужно запускать поочередно на 30 секунд в течении всего времени включения ПЛК в режиме "Работа".
Возможно кто-то из Вас уже решал подобную задачу, поделитесь пожалуйста идеями!!!
Всем отписавшимся заранее благодарен и поздравляю с наступающим Новым Годом!
timer_ton(PT := T#30s, IN := NOT timer.Q);
outN := (outN + BOOL_TO_INT(timer.Q)) MOD 3;
DO1 := outN = 0;
DO2 := outN = 1;
DO3 := outN = 2;
DKFLBVBH
29.12.2014, 11:58
Очень прошу, можете расшифровку кода дать?
VAR
timer_ton: TON;
outN: INT;
END_VAR
timer_ton(PT := T#30s, IN := NOT timer_ton.Q); (* Таймер на самосбросе, Q таймера равно TRUE раз в тридцать секунд *)
outN := (outN + BOOL_TO_INT(timer_ton.Q)) MOD 3; (* Инкремент outN по Q таймера, то есть +1 один раз в тридцать секунд. Рост ограничивается до 2 взятием остатка от деления на 3 *)
DO1 := outN = 0; (* DO1 = TRUE когда outN = 0 *)
DO2 := outN = 1;
DO3 := outN = 2;
Сессия шоль?
Две последние строки не расшифрованы. И неясно когда DO1 = FALSE
Две последние строки не расшифрованы. И неясно когда DO1 = FALSE
А смысл расшифровывать?!
DO2 присваивается TRUE когда outN = 1,
DO3 присваивается TRUE когда outN = 2.
DO1=FALSE, когда DO2 или DO3=TRUE.
Проверено, работает!
___________________________________________
Yegor, порадовали красивым решением, спасибо!
Ну теперя DKFLBVBH точно разобрался ...
Yegor, порадовали красивым решением, спасибо!Спасибо и вам, но это решение на скорую руку. От лишней переменной можно избавиться размазав её по периоду таймера, например:
timer(PT := T#90s, IN := NOT timer.Q);
DO1 := timer.ET < T#30s;
DO3 := timer.ET > T#60s;
DO2 := DO1 XOR NOT DO3;
А в SFC - вообще без переменных ))
15995
Спасибо и вам, но это решение на скорую руку. От лишней переменной можно избавиться размазав её по периоду таймера, например:
timer(PT := T#90s, IN := NOT timer.Q);
DO1 := timer.ET < T#30s;
DO3 := timer.ET > T#60s;
DO2 := DO1 XOR NOT DO3;
Да, как, оказывается много красивых решений у одной задачи!
Валенок +1000!
DO1 := DO2 := DO3 := FALSE;
CASE TIME_TO_DWORD(TIME()) MOD 3000 OF
0000..1000: DO1 := TRUE;
1001..2000: DO2 := TRUE;
2001..2999: DO3 := TRUE;
END_CASEТак чисто поржать.
Самое первое и последнее решение будет оптимально, если надо уставку таймера изменить.
Во втором - много параметров нужно изменять)
Много параметров ? тогда вот ))
DKFLBVBH
14.01.2015, 15:36
timer_ton(PT := T#30s, IN := NOT timer.Q);
outN := (outN + BOOL_TO_INT(timer.Q)) MOD 3;
DO1 := outN = 0;
DO2 := outN = 1;
DO3 := outN = 2;
БЛАГОДАРЮ, коротко и изящно! Где тут в карму плюсануть можно? :)
Карма начинается с "р/с ...."
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot