This is topic Вопрос по таймеру in forum Языки программирования (IL/FBD) / Algorithm Programming Languages at Форум TRACE MODE: техническая поддержка.


To visit this topic, use this URL:
http://forum.adastra.ru/ultimatebb.php/ubb/get_topic/f/11/t/000036.html

Posted by Droshnev (Участник № / Member № 132) on :
 
Уважаемые разработчики. Помогите пожалуйста.

На сколько я понял в рамках Техно IL нет возможности реализовать таймер по типу:

1) Запустились с таймером 15сек
2) проверяем какое-то условие
3) Сработал таймер(прошло 15 сек).

Можно только так:
1) Запустились с таймером 15сек(SETTMR 0 15000)
2) проверяем какое-то условие
3) Проверяем таймер (CHECKTMR 0)
4) Когда таймер сработал - уходим на метку (JMPC <метка>)

У нас алгоритм большой, в нем несколько различных таимеров и такие переходы нас не устраивают.

Хотели попробовать через TM.CLK (TM.CLK+15сек),
но при попытке Q1 = TM.CLK, на выходе был 0:(

Подскажите, как нам реализовать таймер в пределах одной подпрограммы и почему не работает TM.CLK?
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Не совсем понятно - в чем разница между первым и вторым алгоритмом? Так же производится анализ на превышение таймером уставки и осуществляется какое-либо действие. В IL это действие - переход на определенный участок кода по значению системного флага CMP (по другому состояние флага CMP в IL никак контролировать нельзя).

Чем именно Вас не устраивают переходы по JMPC, тем, что алгоритм будет большой - объяснение странное? [Недоумение / Confused]

Функция TM.CLK никак не относится к таймеру - она возвращяет сколько миллисекунд прошло с момента вызова программы и обнуляется каждый раз при новом вызове программы IL.
 
Posted by Droshnev (Участник № / Member № 132) on :
 
Во втором алгоритме(в Teхно IL) срабатывание таймера "обрабатывается" в другой подпрограмме. А в первом - в теле самой программы.

У меня в алгоритме 5 почти подряд идущих таймеров, подскажите, как мне реализовать возврат из кода метки "подпрограммы" в "вызывающую программу".

Меня не неустраивает, мне не понятно, как вернуться из метки?

Почему-то TM.CLK у нас ничего не возвращает [Неодобрение / Frown]
Q1 = TM.CLK, а в ответ - 0.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
1) Возврат только по метке! IL - не процедурный язык, это некий праобраз Асемблера - одноадресный язык! Кроме JMP или GOTO других возможностей для переходов нет (таков стандарт). [clever / умный]

2) Странно, что возвращает ноль... [Недоумение / Confused]
Может у Вас код программы настолько небольшой, что он выполняется меньше 1 мс - т.е., за микросекунды? Дело в том, что эта функция измеряет только в целых числах миллисекунд!
Вот, например, код - он точно работает:

code:
  
PROGRAM
VAR_IN_OUT
I0 new-xx01-0001 In
Q1 new-xx01-0002 In
Q2 new-xx01-0003 In
Q3 new-xx01-0005 In
END_VAR

Q1 = TM.SEC
F0 = I0

WHILE F0
F0 - 1
END_WHILE

Q2 = TM.CLK


 
Posted by Droshnev (Участник № / Member № 132) on :
 
ПОМОГИТЕ РЕАЛИЗОВАТЬ БЛОК "ТАЙМЕР"
На вход I0 подается время в милисекундах, по истечении которого на выходе Q0 появляется "1"

Конструкции типа:
F0 = I0

SETTMR 1 F0
CHECKTMR 1

JMPC M1
EXIT

M1:
Q0=1

Не работают.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
У Вас алгоритм неверный! При каждом вызове такого блока он будет постоянно инициализировать таймер, и никогда не дожидаться его завершения, потому что на следующем же вызове он опять будет инициализирован. Ваш код должен быть примерно следующим:
code:
F0=I0

IF E0==0
THEN
SETTMR 1 F0
E0=1
Q0=0
ELSE
CHECKTMR 1
JMPC M1
END_IF
EXIT

M1:
Q0=1
E0=0


 


Новости АСУ ТП / News | SCADA / HMI | Обучение / Trainings | Свяжитесь с нами / Contact Us



Powered by Infopop Corporation
UBB.classic™ 6.7.2