PDA

Просмотр полной версии : ПЛК 160 циклическое включение выходов



DKFLBVBH
29.12.2014, 07:27
Уважаемые форумчане,
Прошу помощи с реализацией следующей задачи на ПЛК 160:
есть 3 дискретных выхода, каждый из них нужно запускать поочередно на 30 секунд в течении всего времени включения ПЛК в режиме "Работа".


Возможно кто-то из Вас уже решал подобную задачу, поделитесь пожалуйста идеями!!!
Всем отписавшимся заранее благодарен и поздравляю с наступающим Новым Годом!

Yegor
29.12.2014, 11:29
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
Очень прошу, можете расшифровку кода дать?

Yegor
29.12.2014, 12:29
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;

Сессия шоль?

Валенок
01.01.2015, 02:43
Две последние строки не расшифрованы. И неясно когда DO1 = FALSE

kolyan
04.01.2015, 15:07
Две последние строки не расшифрованы. И неясно когда DO1 = FALSE

А смысл расшифровывать?!
DO2 присваивается TRUE когда outN = 1,
DO3 присваивается TRUE когда outN = 2.

DO1=FALSE, когда DO2 или DO3=TRUE.

Проверено, работает!
___________________________________________
Yegor, порадовали красивым решением, спасибо!

Валенок
04.01.2015, 16:43
Ну теперя DKFLBVBH точно разобрался ...

kolyan
04.01.2015, 18:59
Будем на это надеяться:D

Yegor
04.01.2015, 21:19
Yegor, порадовали красивым решением, спасибо!Спасибо и вам, но это решение на скорую руку. От лишней переменной можно избавиться размазав её по периоду таймера, например:
timer(PT := T#90s, IN := NOT timer.Q);
DO1 := timer.ET < T#30s;
DO3 := timer.ET > T#60s;
DO2 := DO1 XOR NOT DO3;

Валенок
04.01.2015, 21:59
А в SFC - вообще без переменных ))
15995

kolyan
05.01.2015, 12:40
Спасибо и вам, но это решение на скорую руку. От лишней переменной можно избавиться размазав её по периоду таймера, например:
timer(PT := T#90s, IN := NOT timer.Q);
DO1 := timer.ET < T#30s;
DO3 := timer.ET > T#60s;
DO2 := DO1 XOR NOT DO3;

Да, как, оказывается много красивых решений у одной задачи!

Валенок +1000!

Yegor
06.01.2015, 18:10
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Так чисто поржать.

kolyan
06.01.2015, 19:24
Самое первое и последнее решение будет оптимально, если надо уставку таймера изменить.
Во втором - много параметров нужно изменять)

Валенок
07.01.2015, 16:07
Много параметров ? тогда вот ))

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;

БЛАГОДАРЮ, коротко и изящно! Где тут в карму плюсануть можно? :)

Валенок
15.01.2015, 00:12
Карма начинается с "р/с ...."