Просмотр полной версии : Сброс CLOCK блока BLINK
Здравствуйте!
В программе периодически нужно менять TIMEHIGH блока BLINK.
Допустим значение 5 минут нужно заменить на 5 секунд.
Блок начинает работать с новым значением только после
того, как закончится отсчет времени старого значения.
Разрешима ли задача по сбросу часов блока BLINK ?
Newcomer
20.04.2016, 20:34
А вход Enable пробовали передергивать ?
Разрешима ли задача по сбросу часов блока BLINK ?
Да. Можно написать свой BLINK с любыми хотелками.
lara197a
21.04.2016, 00:43
через SEL записываем в уставки нули
А вход Enable пробовали передергивать ?
Передергивал - не помогает.
через SEL записываем в уставки нули
Нули записывал, но по отдельности либо в hi, либо в lo.
Есть смысл писать в оба входа?
Для тех, кто не пробовал:
1. Если при включенном входе ENABLE обнулить оба оставшихся входа, то будет глюк, характерный для таймера TP (выход будет постоянно моргать).
2. Сменить уставку мгновенно на ходу также не получится, пока не отработает предыдущее время.
3. При отключении входа ENABLE выход замораживается в текущем состоянии (может остаться как включенным, так и выключенным).
Для тех, кто не пробовал:
1. Если при включенном входе ENABLE обнулить оба оставшихся входа, то будет глюк, характерный для таймера TP (выход будет постоянно моргать).
2. Сменить уставку мгновенно на ходу также не получится, пока не отработает предыдущее время.
3. При отключении входа ENABLE выход замораживается в текущем состоянии (может остаться как включенным, так и выключенным).
Добавить можно, что PT блока BLINK не обнуляется и не меняется пока не закончит предыдущий отсчет.
Перепробовал все варианты.
Какой же выход из положения? Есть ли альтернатива BLINK ?
Использую BLINK в ФБ для наращивания значения за заданное время - заданной величины.
Если бы не глюки, то все бы устроило.
Я же Вам в 3 посте выложил альтернативный блок.
Я же Вам в 3 посте выложил альтернативный блок.
Благодарю! Только что попробовал. Моя проблема с стандартным BLINK решена.
Нужно потестить в моей среде, проверить на подводные камни.
Сергей-Ростов
05.09.2016, 21:59
Я сталкивался с такой проблемой BLINK-а, выходил из положения просто: блинк ставил как генератор а в CTU делал выход, тем самым увеличил размер временной переменной и стало по барабану как где блин этот застрял.
Только он даже не импортируется.
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
можно и проще
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 Хотя судя по комментариям и таймеры оба обнулили и бит включения сбросили...
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 и по второму каналу вход БЛИНКА
это не баг, это фича
лечится в 2.3 элементарно - на выходе ставится AND и по второму каналу вход БЛИНКА
Но ведь это не исцеление - после прихода разрешения Enable=true включение произойдёт с произвольного первого состояния на произвольную длительность.
Но ведь это не исцеление - после прихода разрешения Enable=true включение произойдёт с произвольного первого состояния на произвольную длительность.
Поэтому в этой некротеме самое надежное лечение - ампутация всего:
VAR
b0,b: BLINK;
------
b := SEL(start, b0, b);
...
Не смог понять смысл строки.
И b и b0 - ФБ типа BLINK, т.е. структуры данных с указателем на процедуру обработки.
При start=false что присваивается в b?
МихаилГл
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 блинк) но длинная строка. Думаю так можно.
Вообще всё равно нулю[/false]
Новый start - новый блинк. Ни разу не надёванный.
МихаилГл
23.02.2026, 20:29
Вообще всё равно нулю[/false]
Новый start - новый блинк. Ни разу не надёванный.
Даже муха не...?)
Даже муха не...?)
Муха не замечена.
Полная санитария. Одноразовый блинк. Как шприц
b(ENABLE := start, TIMELOW := sel(start, lo, t#0s), TIMEHIGH := hi, OUT => q);.
имхо
:= sel(start, t#0s, lo),
но
Ну и для hi.... Думаю так можно
все равно зря. Нужно еще кипятить для дезинфекции
Ясно. Внутренние переменные b приводятся в самое наиисходнейшее состояние при присвоении b:=b0.
Не додумался бы до присвоений не элементарных переменных. Возьму на заметку.
In_Da_Cher_A
24.02.2026, 08:44
Но ведь это не исцеление - после прихода разрешения Enable=true включение произойдёт с произвольного первого состояния на произвольную длительность.ну да, но не помню уже, это либо не работало, либо не причиняло неудобств, так как не образал внимание на это, сколько раз так в начале делал на временах сутки или минуты - проблем с работой не было
потом наткнулся здесь же и ставил вот это BLNK с ресетом
Powered by vBulletin® Version 4.2.3 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot