Можно только так: 1) Запустились с таймером 15сек(SETTMR 0 15000) 2) проверяем какое-то условие 3) Проверяем таймер (CHECKTMR 0) 4) Когда таймер сработал - уходим на метку (JMPC <метка>)
У нас алгоритм большой, в нем несколько различных таимеров и такие переходы нас не устраивают.
Хотели попробовать через TM.CLK (TM.CLK+15сек), но при попытке Q1 = TM.CLK, на выходе был 0:(
Подскажите, как нам реализовать таймер в пределах одной подпрограммы и почему не работает TM.CLK?
Сообщения / Posts 60 | Из / From: Россия
| IP / IP: IP адрес / IP address |
отправлено / posted
Не совсем понятно - в чем разница между первым и вторым алгоритмом? Так же производится анализ на превышение таймером уставки и осуществляется какое-либо действие. В IL это действие - переход на определенный участок кода по значению системного флага CMP (по другому состояние флага CMP в IL никак контролировать нельзя).
Чем именно Вас не устраивают переходы по JMPC, тем, что алгоритм будет большой - объяснение странное?
Функция TM.CLK никак не относится к таймеру - она возвращяет сколько миллисекунд прошло с момента вызова программы и обнуляется каждый раз при новом вызове программы IL.
Сообщения / Posts 17322 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Droshnev
Forum Member / Участник форума
Участник № / Member № 132
отправлено / posted
Во втором алгоритме(в Teхно IL) срабатывание таймера "обрабатывается" в другой подпрограмме. А в первом - в теле самой программы.
У меня в алгоритме 5 почти подряд идущих таймеров, подскажите, как мне реализовать возврат из кода метки "подпрограммы" в "вызывающую программу".
Меня не неустраивает, мне не понятно, как вернуться из метки?
отправлено / posted
1) Возврат только по метке! IL - не процедурный язык, это некий праобраз Асемблера - одноадресный язык! Кроме JMP или GOTO других возможностей для переходов нет (таков стандарт).
2) Странно, что возвращает ноль... Может у Вас код программы настолько небольшой, что он выполняется меньше 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
отправлено / posted
У Вас алгоритм неверный! При каждом вызове такого блока он будет постоянно инициализировать таймер, и никогда не дожидаться его завершения, потому что на следующем же вызове он опять будет инициализирован. Ваш код должен быть примерно следующим:
code:
F0=I0
IF E0==0 THEN SETTMR 1 F0 E0=1 Q0=0 ELSE CHECKTMR 1 JMPC M1 END_IF EXIT