PDA

Просмотр полной версии : Реверсивный счет



Владислав Г.
04.08.2017, 14:35
Здравствуйте!

Задача заключается в создании реверсивного счетчика на ПЛК 110-30 [М02] от энкодера с двумя входами А и В. В конфигураторе ПЛК в CoDeSys поменял первый вход на fast counters с двумя входами в формате WORD. На этом и "завис", а что делать дальше? Счетчики накапливают значения по двум входам в режиме прямого счета, но как осуществить реверсивный счет? Потом еще этот WORD не сильно вдохновляет с его 65535...

IVM
04.08.2017, 15:30
Здравствуйте!

Задача заключается в создании реверсивного счетчика на ПЛК 110-30 [М02] от энкодера с двумя входами А и В. В конфигураторе ПЛК в CoDeSys поменял первый вход на fast counters с двумя входами в формате WORD.

Почему Fast Counters, а не Fast Encoder ?

Владислав Г.
04.08.2017, 15:56
Почему Fast Counters, а не Fast Encoder ?
Согласен, выбрал Fast Encoder - счет реверсивный, только как быть с WORD? Если энкодер переходит ниже нуля - получаю 65535?

IVM
04.08.2017, 16:06
Согласен, выбрал Fast Encoder - счет реверсивный, только как быть с WORD? Если энкодер переходит ниже нуля - получаю 65535?

Разберись с примером и все поймешь.

Владислав Г.
07.08.2017, 14:18
Разберись с примером и все поймешь.
Значение DINT, в приведенном примере, меняет значение с минуса до нуля и в плюс в зависимости от величины DWORD. В моем случае приходиться работать с WORD, емкость которого свободно вмещается в DINT, поэтому здесь уже не получается воспользоваться вышеприведенной программой. Если я не прав - поправьте.
Переполнение может быть при старте в случае обратного хода (должен выводиться знак минус), при достижении 65535 при прямом ходе и в случае дрейфа - когда счетчик остановился в районе 65535.

IVM
07.08.2017, 14:32
Замени в программе где надо DWORD на WORD DINT на INT и все будет работать. Если надо работать с отрицательными значениями, то это то же не сложно сделать. Только ты давай уже начинай шевелить своими мозгами, а то стоишь в какой-то непонятной позе и ждешь манны небнсной. :D

Владислав Г.
19.10.2017, 13:08
c := c + WORD_TO_DWORD(count_new - count_old);


При такой расстановке счетчик считает в положительную сторону, но как сделать обратный счет?

Попытался сделать следующее:

IF btn_top = TRUE THEN
IF encoder = 0 AND count = 65535 THEN
n:= n + 1;
END_IF
count:= encoder;
END_IF

IF btn_down = TRUE THEN
IF encoder = 65535 AND count = 0 THEN
n:= n - 1;
END_IF
count:= encoder;
END_IF

Если энкодер вращать очень медленно, то при переполнении n работает корректно, стоит увеличить скорость - n остается без изменения.

Sulfur
19.10.2017, 13:35
Владислав Г.
Hardella IDE (http://www.owen.ru/forum/showthread.php?t=23013) вам в помощь. Сам пользуюсь активно для написания высокоскоростных модулей со своими хотелками для входов FDI1..FDI4.
--------------------
По вашей программе.
...IF encoder = 0 AND count = 65535 THEN...
Из за медленности цикла ПЛЦ_ПРГ и короткого импульса encoder = 0 происходит пропуск этого импульса. Т. е. ПЛЦ_ПРГ его просто "не видит". Поэтому n и не меняется.
--------------------------
...IF btn_top = TRUE THEN...
= TRUE писать не обязательно, без этого Кодесис проверяет переменную на true.
Т. е. достаточно будет ...IF btn_top THEN...
или ...IF NOT btn_top THEN... , если нужно проверить на FALSE.

Владимир Ситников
19.10.2017, 13:41
Владислав Г.
Hardella IDE (http://www.owen.ru/forum/showthread.php?t=23013) вам в помощь. Сам пользуюсь активно для написания высокоскоростных модулей со своими хотелками для входов FDI1..FDI4.

Про Hardella, конечно, всё так.


Но неужели встроенный encoder в простых случаях не работает? (чесслово не знаю)
Пример, как может работать тут: http://www.owen.ru/forum/showthread.php?t=23600&page=11&p=222994&viewfull=1#post222994
Иными словами, для "реверсивного" счёта (ну, чтобы считалось в обе стороны) нужно использовать WORD_TO_INT, а все IF'ы выкинуть.

Sulfur
19.10.2017, 13:54
Но неужели встроенный encoder в простых случаях не работает? (чесслово не знаю)

Пытался пользовать фирменные блоки энкодеров, не понравилось. На старой версии ПЛК писал обработку сам, и затолкал её в прерывание 20 мкс. Благо энкодер на 360 линий и крутится со скоростью максимум 15 об\мин. Однако, когда на столе руками издевался, то довольно легко получал пропуск счета. В данный момент на новых ПЛК и с Харделлой - нет проблем.

Владислав Г.
19.10.2017, 14:16
Sulfur

Учту в будущем об необязательности написания TRUE в IF. С Hardella IDE не сталкивался, если подопрет придется влазить. Спасибо.

Владимир Ситников

Поменял на WORD_TO_INT - в симуляторе считает реверсивно. Попробую на оборудовании... Спасибо.
IF - играли роль подпорок, от безысходности :)