PDA

Просмотр полной версии : Сброс CLOCK блока BLINK



werg
20.04.2016, 20:24
Здравствуйте!
В программе периодически нужно менять TIMEHIGH блока BLINK.
Допустим значение 5 минут нужно заменить на 5 секунд.
Блок начинает работать с новым значением только после
того, как закончится отсчет времени старого значения.
Разрешима ли задача по сбросу часов блока BLINK ?

Newcomer
20.04.2016, 20:34
А вход Enable пробовали передергивать ?

amn
20.04.2016, 23:21
Разрешима ли задача по сбросу часов блока BLINK ?
Да. Можно написать свой BLINK с любыми хотелками.

lara197a
21.04.2016, 00:43
через SEL записываем в уставки нули

werg
21.04.2016, 03:27
А вход Enable пробовали передергивать ?

Передергивал - не помогает.

werg
21.04.2016, 03:29
через SEL записываем в уставки нули

Нули записывал, но по отдельности либо в hi, либо в lo.
Есть смысл писать в оба входа?

rovki
21.04.2016, 07:27
Только в оба

amn
22.04.2016, 15:37
Для тех, кто не пробовал:
1. Если при включенном входе ENABLE обнулить оба оставшихся входа, то будет глюк, характерный для таймера TP (выход будет постоянно моргать).
2. Сменить уставку мгновенно на ходу также не получится, пока не отработает предыдущее время.
3. При отключении входа ENABLE выход замораживается в текущем состоянии (может остаться как включенным, так и выключенным).

werg
27.04.2016, 20:42
Для тех, кто не пробовал:
1. Если при включенном входе ENABLE обнулить оба оставшихся входа, то будет глюк, характерный для таймера TP (выход будет постоянно моргать).
2. Сменить уставку мгновенно на ходу также не получится, пока не отработает предыдущее время.
3. При отключении входа ENABLE выход замораживается в текущем состоянии (может остаться как включенным, так и выключенным).

Добавить можно, что PT блока BLINK не обнуляется и не меняется пока не закончит предыдущий отсчет.
Перепробовал все варианты.
Какой же выход из положения? Есть ли альтернатива BLINK ?
Использую BLINK в ФБ для наращивания значения за заданное время - заданной величины.
Если бы не глюки, то все бы устроило.

amn
27.04.2016, 21:02
Я же Вам в 3 посте выложил альтернативный блок.

werg
27.04.2016, 21:34
Я же Вам в 3 посте выложил альтернативный блок.

Благодарю! Только что попробовал. Моя проблема с стандартным BLINK решена.
Нужно потестить в моей среде, проверить на подводные камни.

Сергей-Ростов
05.09.2016, 21:59
Я сталкивался с такой проблемой BLINK-а, выходил из положения просто: блинк ставил как генератор а в CTU делал выход, тем самым увеличил размер временной переменной и стало по барабану как где блин этот застрял.

Макс13
21.02.2026, 20:33
Только он даже не импортируется.

kondor3000
22.02.2026, 09:40
Только он даже не импортируется.

Это файл BLNK.EXP для Импорта в среде CoDeSys V2.3, всё импортируется, ниже код


FUNCTION_BLOCK blnk
VAR_INPUT
start: BOOL; (*разрешение работы блока*)
hi: TIME:=t#3s; (*продолжительность включенного выхода*)
lo: TIME:=t#1s; (*продолжительность отключенного выхода*)
END_VAR
VAR_OUTPUT
q: BOOL; (*выход*)
END_VAR
VAR
step: BYTE; (*шаг выполнения блока*)
TOF1: TOF; (*используем один таймер для включенного и отключенного сигнала*)
pt: TIME; (*сюда пишем текущую ставку для таймера*)
F_TRIG_start: F_TRIG; (*отлавливаем отключение блока*)
END_VAR
(* ================================================== = *)

TOF1(IN:=FALSE, PT:= pt); (*вызываем таймер с нужным временем*)
F_TRIG_start(CLK:= start, Q=> ); (*отлавливаем отключение блока*)
IF F_TRIG_start.Q THEN (*если блок отключили*)
pt:=t#0s; (*обнуляем время для таймера*)
q:=FALSE; (*отключаем выход*)
step:=0; (*переходим к шагу ожидания включения блока*)
END_IF

CASE step OF
0:
IF start THEN (*если блок включен*)
pt:=hi; (*выставляем время включенного сигнала для таймера*)
TOF1(IN:=TRUE, PT:= pt); (*включаем таймер*)
q:=TRUE; (*включаем выход*)
step:=1; (*переходим к ожиданию срабатывания таймера*)
END_IF
1:
pt:=hi; (*выставляем время включенного сигнала для таймера*)
IF NOT TOF1.Q THEN (*если таймер отработал*)
pt:=lo; (*выставляем время отключенного сигнала для таймера*)
TOF1(IN:=TRUE, PT:= pt); (*включаем таймер*)
q:=FALSE; (*отключаем выход*)
step:=2; (*переходим к ожиданию срабатывания таймера*)
END_IF
2:
pt:=lo; (*выставляем время отключенного сигнала для таймера*)
IF NOT TOF1.Q THEN (*если таймер отработал*)
step:=0;
END_IF
END_CASE

Валенок
22.02.2026, 20:15
можно и проще

FUNCTION_BLOCK blnk
VAR_INPUT
start: BOOL; (*разрешение работы блока*)
hi: TIME:=t#3s; (*продолжительность включенного выхода*)
lo: TIME:=t#1s; (*продолжительность отключенного выхода*)
END_VAR
VAR_OUTPUT
q: BOOL; (*выход*)
END_VAR
VAR
b0,b: BLINK;
END_VAR
------
b := SEL(start, b0, b);
b(ENABLE := start, TIMELOW := lo, TIMEHIGH := hi, OUT => q);

МихаилГл
22.02.2026, 20:31
можно и проще

FUNCTION_BLOCK blnk
VAR_INPUT
start: BOOL; (*разрешение работы блока*)
hi: TIME:=t#3s; (*продолжительность включенного выхода*)
lo: TIME:=t#1s; (*продолжительность отключенного выхода*)
END_VAR
VAR_OUTPUT
q: BOOL; (*выход*)
END_VAR
VAR
b0,b: BLINK;
END_VAR
------
b := SEL(start, b0, b);
b(ENABLE := start, TIMELOW := lo, TIMEHIGH := hi, OUT => q);

Вроде там в первом посте было про проблему со стандартным блинком при изменении времени его работы...

PS Хотя судя по комментариям и таймеры оба обнулили и бит включения сбросили...

1exan
22.02.2026, 20:34
OSCAT-овский генератор, можно скорректировать под себя:


FUNCTION_BLOCK GEN_PULSE
VAR_INPUT
ENQ : BOOL := TRUE;
PTH : TIME;
PTL : TIME;
END_VAR
VAR_OUTPUT
Q : BOOL;
END_VAR
VAR
tx: TIME;
tn: TIME;
init: BOOL;
END_VAR


(*
version 1.5 8. apr. 2011
programmer hugo
tested by oscat


GEN_PULSE uses the internal sps timer to generate a continuous output waveform with programmable high and low time.
the accuracy of gen_pulse is depending on the system timer.
when time is 0 the high and low times are exactly one cycle.
ENQ = TRUE will start and ENQ = FALSE will stop the generator.


*)


IF enq THEN
tx := TIME();
IF NOT init THEN init := TRUE; tn := tx; Q := TRUE; END_IF; // можно изменить на нужное состояние Q при запуске
IF PTL <= t#0s THEN Q := TRUE;
ELSE
IF tx - tn >= SEL(Q, PTL, PTH) THEN
tn := tn + SEL(Q, PTL, PTH);
Q := NOT Q;
END_IF;
END_IF;
ELSE
Q := FALSE;
init := FALSE;
END_IF;




(* revision history
hm 29. jun. 2008 rev 1.0
original version


hm 23. nov. 2008 rev 1.1
set default for enq to be true


hm 18. jul. 2009 rev 1.2
improved performance


hm 13. nov. 2009 rev 1.3
corrected error


hm 16. feb. 2011 rev 1.4
corrected an error when timer overflows


hm 8. apr. 2011 rev 1.5
ptl and pth was exchanged


1exan 05042024
for 0 PTL, Q is on


*)

In_Da_Cher_A
23.02.2026, 05:59
Для тех, кто не пробовал:
3. При отключении входа ENABLE выход замораживается в текущем состоянии (может остаться как включенным, так и выключенным).это не баг, это фича
лечится в 2.3 элементарно - на выходе ставится AND и по второму каналу вход БЛИНКА

FPavel
23.02.2026, 09:51
это не баг, это фича
лечится в 2.3 элементарно - на выходе ставится AND и по второму каналу вход БЛИНКА
Но ведь это не исцеление - после прихода разрешения Enable=true включение произойдёт с произвольного первого состояния на произвольную длительность.

Валенок
23.02.2026, 19:45
Но ведь это не исцеление - после прихода разрешения Enable=true включение произойдёт с произвольного первого состояния на произвольную длительность.
Поэтому в этой некротеме самое надежное лечение - ампутация всего:

VAR
b0,b: BLINK;
------
b := SEL(start, b0, b);
...

FPavel
23.02.2026, 19:54
Не смог понять смысл строки.
И b и b0 - ФБ типа BLINK, т.е. структуры данных с указателем на процедуру обработки.

При start=false что присваивается в b?

Валенок
23.02.2026, 20:07
b0 же
...........

МихаилГл
23.02.2026, 20:20
Не смог понять смысл строки.
И b и b0 - ФБ типа BLINK, т.е. структуры данных с указателем на процедуру обработки.

При start=false что присваивается в b?


b0 же
...........

Ну я как понял, если тайминги явно не прописаны, то в b0 они тупо нулю равны...

Я бы ещё так извратился:

b(ENABLE := start, TIMELOW := sel(start, lo, t#0s), TIMEHIGH := hi, OUT => q);
Ну и для hi. И вообще 1 блинк) но длинная строка. Думаю так можно.

Валенок
23.02.2026, 20:23
Вообще всё равно нулю[/false]
Новый start - новый блинк. Ни разу не надёванный.

МихаилГл
23.02.2026, 20:29
Вообще всё равно нулю[/false]
Новый start - новый блинк. Ни разу не надёванный.

Даже муха не...?)

Валенок
23.02.2026, 20:31
Даже муха не...?)
Муха не замечена.
Полная санитария. Одноразовый блинк. Как шприц

Валенок
23.02.2026, 20:40
b(ENABLE := start, TIMELOW := sel(start, lo, t#0s), TIMEHIGH := hi, OUT => q);.
имхо
:= sel(start, t#0s, lo),
но

Ну и для hi.... Думаю так можно
все равно зря. Нужно еще кипятить для дезинфекции

FPavel
23.02.2026, 21:12
Ясно. Внутренние переменные b приводятся в самое наиисходнейшее состояние при присвоении b:=b0.
Не додумался бы до присвоений не элементарных переменных. Возьму на заметку.

In_Da_Cher_A
24.02.2026, 08:44
Но ведь это не исцеление - после прихода разрешения Enable=true включение произойдёт с произвольного первого состояния на произвольную длительность.ну да, но не помню уже, это либо не работало, либо не причиняло неудобств, так как не образал внимание на это, сколько раз так в начале делал на временах сутки или минуты - проблем с работой не было
потом наткнулся здесь же и ставил вот это BLNK с ресетом