Вопрос до неприличия прост - как сбросить (или загрузить какое либо значение) в счетчик энкодера?:confused:
Вид для печати
Вопрос до неприличия прост - как сбросить (или загрузить какое либо значение) в счетчик энкодера?:confused:
Примерно так:
pt:= ADR(Enkoder); (*Получаем адрес энкодера*)
pt^:=SEL(D_Form_TRIG.Q, pt^,0); (*обнуляем энкодер*)
Получилось проще, правда на эмуляторе:
pt:= ADR(Enkoder); (*Получаем адрес энкодера*)
pt^:= 0; (*обнуляем энкодер или любое другое значение*)
Спасибо за подсказку, в понедельник попробую на железке.
Я Вам уже с условием сброса по фронту с тригером навалял.
Понял, только чего-то не пошло, да этого и не нужно.
На железке, увы, не работает. Посе того, как прекращаю обнулять, возвращается старое значение. Ну и на хрена нужен такой счетчик, который сбросить нельзя? Вопрос к разработчикам.:confused:
А обнулять надо каждый раз какое-нибудь новое значение или некое фиксированное. Если фиксированное, попробуйте в параметрах энкодера выставить нужный вам диапазон.
Мне нужно отмерять некоторую (разную) длину, потом отрезать и счетчик, ессно сбросить! Зачем вообще нужен счетчик, который считает погоду? Энкодер по умолчанию инкрементальный, поэтому его все равно надо когда-то и куда-то привязать, даже если потом не предполагается ничего с сигналом делать, только читать, скажем, положение некоего механизма!
ЗЫ: попробовал записывать в регистр, на котором, предположительно сидит этот счетчик, но как определить его адрес??? Разработчики! Аууууу!!!
Я, так понял, счетчик у Вас выдает кодовую последовательность 0-1-3-2-0-1-........, код Грея. Организуйте опрос входов в многозадачности, присвойте программе опроса высший приоритет. При включении устройства, программа считывает ту комбинацию, которая на входе. например, это число 3. Если, следующая комбинация будет 1, то датчик вращается против часовой стрелки, если 2 , то по часовой. Если на входах появилась двойка, то Вы добавляете шаг одного деления. например полный оборот датчика - это 10 мм. 10 делите на количество шагов, например 1024, получаете шаг на импульс, в нашем случае, это 0.009765625 мм. Значит в какой то переменной будет 0.009765625, потом еще плюс шаг, если в обратную сторону, то минус шаг. Сбрасывать энкодер совсем не надо, а надо работать с счетчиком шагов. Кстати в этом случае не нужно работать с точкой, а работать с целыми числами, так быстрее.
Успехов!
Вы не представляете, о чём идёт речь. Нет никаких кодов Грея. Есть обычный реверсивный счётчик импульсов. Направление счёта зависит от фазы этих импульсов. Когда энкодер вращается в одну сторону, счёт идёт в плюс. Когда в другую - в минут. Всё происходит на аппаратном уровне. Проблема в том, что невозможно обнулить счётчик, и начать отсчёт сначала. Или сделать предустановку нужным числом и считать до нуля.
В нормальных промышленных контроллерах (Siemens, Vipa например) нет никаких проблем со встроенным счётным модулем. Во-первых, он не 16-ти разрядный, а 32-х. Два байта в памяти контроллера пожалели? 65000 - это очень мало. У меня энкодер даёт больше 65000 за один оборот. Во-вторых, функциональный блок для управления этим модулем имеет тьму входных параметров, с помощью которых можно заставить работать счётчик во множестве всевозможных режимов. Его можно сбрасывать и предустанавливать, запрещать и разрешать счёт как угодно, задавать направление счёта, заставить генерировать прерывание..
Здесь даже обнулиться нельзя. Какова практическая польза от такого энкодера? Какие прикладные задачи можно решать с его помощью?
Я, могу Вам только посочувствовать! По всей видимости необходимо принимать другое, или более кардинальное решение задачи. А какая марка энкодера?
Другое решение принимать поздно. Контроллер уже приобретён, оборудование изготовлено и должно быть сдано заказчику через несколько дней.
Проблему я, конечно, решу программным путём. Но я рассчитывал получить полноценный счётный модуль в составе ПЛК, наподобие как, например, в контроллере 314-2BG03 от Випы
а получил дулю, и теперь, вместо того,что бы спокойно и быстро выполнить свою работу, придётся выёживаться, как мухе на стекле.
Мешает здравый разум. Как Вы это себе представляете?
Я об этом догадываюсь.
Я такого не говорил. Просто удивляюсь - у кого хватило ума разработать счётчик без сброса в ноль, не говоря уже о предустановке.
За такой совет - большое спасибо, обязательно посмотрю, что за библиотека.
Энкодер я взял DFS-60. DRS вроде как снимаются с производства. По крайней мере, мне так манагер из Сик сказал. А какая разница - какой энкодер? Вроде бы у всех есть сигналы А, В и Z, и все работают одинаково.
PS. Посмотрел, что за ФБ INC_DEC в библиотеке OSCAT. Это программная обработка двух сигналов с дискретных входов. Я такую программулину уже написал за две минуты. Я рассчитывал получить АППАРАТНЫЙ скоростной счётчик, работающий в фоновом режиме, независимо от моей программы. А программа должна была только считывать количество импульсов из регистра.
В принципе, я такой счётчик и получил. Только в ноль сбросить его не могу. А без этого - на кой он мне нужен? Кто догадался сделать такого уродца?
Леонидыч, че-то ты злой сегодня в тяпницу-то вечером! Добрее, к людям помягше:)))
А по поводу уродца ты прав, конечно.
Как Вы себе представляете работу встроенной в ПЛК процедуры счета импульсов с энкодера? Сам энкодер это ничто иное, как колесо с дырками и фотодатчиком, который считывает эти дырки, чего туда можно записать??? Это ж железяка! А вот в регистр контроллера записать можно все! Не надо ля-ля. И если разработчики сделали недоизделие, то надо это признать. Очевидно, так и есть, поскольку ничего не отвечают по этому поводу. А еще у меня есть большое подозрение, что они вообще содрали этот контроллер у китайцев, потому и энкодерный счетчик такой, что с ним ничего сделать нельзя!:D
Мне не нужно 250кГц. Меня вполне устроили бы 2.5кГц. Частота импульсов на выходе энкодера пропорциональна частоте его вращения. А ПЛК110 привлёк не только ценой, но и тем, что в технических характеристиках заявлено наличие аппаратного счётного модуля на быстрых дискретных входах. Модуль этот работает, и достаточно шустро. Только разработчики не захотели сделать сброс внутреннего регистра этого модуля, и ничего не написали об этом в технической документации.
Вход ПЛК - это два дискретных входа, которые обнулять не нужно. К этим входам подключены сигналы А и В инкрементального энкодера. Обнулить энкодер - всё равно что обнулить индуктивный датчик. Обнулять нужно аппаратный реверсивный счётчик внутри контроллера, управлять которым, вероятно, как-то можно через внутренние регистры контроллера. Но эта возможность почему-то недокументирована.
Да я уже сделал. "Но осадок остался". Выходит, экономлю на собственных нервах, а они дороже денег заказчика. Может, и правда лучше покупать проверенные изделия от известных брэндов, а не кота в мешке.
Нет, сам счётчик пусть остаётся в области %I. Надо просто добавить управляющий регистр в области %Q. В этом регистре задействовать всего несколько бит:
0- сброс
1- запрет/разрешение счёта
2- направление счёта
С таким минимумом уже можно как-то работать.
Можно, конечно, и так. Но для разработчиков проще перетащить в область, в которую можно писать, и универсально - пиши любое значение, то есть не всегда достаточно только сброса.
Можно и так, но гиморно, надо переход через ноль анализировать, сразу сделать нельзя было нормально?
Просто обидно. Когда начинал в 80-х программировать контроллеры МикроДАТ там таких проблем с энкодерным модулем не возникало. А здесь - тьфу!:(
Алексей Дмитриев
Сочувствую.
Я тоже очень удивился когда начал копать эти контроллеры после предложения постоянного заказчика перейти на что-то подешевле, например Овен.
Жесть... для тех кто понимает какой это бред со счётчиком.Цитата:
Во первых кто мешает переконвертировать ФБ из степа в КДС
И не важно что там пишут в рекламе и инструкциях, нет в ПЛК ОВЕН традиционных High-speed counters
В Step7 это SFB47. Блок защищён, и его без пиратской отмычки не вскроешь. Ему просто указываешь номер канала, к которому подключен счётчик, и крутишь счётчиком как хочешь. Для управления счётчиком в этом ФБ 8 входных переменных, 11 выходных и 12 внутренних маркеров. Кроме того, конфигурация счётчика задаётся в HW Config.
Пример такого контроллера - CPU314C-2DP
Разработчики сделали все что требовалось. Это ПЛК, устройство, которое сам потребитель может запрограммировать. И интеллектуальную обрабтку значения с энкодера реализовать просто.
А сбрасывать само значение в энкодере нельзя из кода программы на КоДеСисе, т.к. пока Вы в коде сбрасываете значение оно может 5 раз поменяться и импульсы будут потеряны! Задача энкодера - 100% слежение за импульсами. А не их потеря в момент сброса.
При частоте 2,5 кГц импульсы будут потеряны с вероятностью 100%.
Задачи разные бывают
иногда например счётчик сбрасывают в тот момент когда энкодер не крутится, в основном так и происходит, отмерили нужное кол-во импульсов, остановились для выполнения какой-либо операции (отрезать, штампануть, просверлить и.т.д), и спокойненько сбрасываем счётчик не теряя никаких импульсов.
а когда нужен сброс "на ходу" (достаточно редко) пользователь сам определяет возможные потери и возможность применения того или иного контроллера.
во многих контроллерах, в счётчике можно задать значения при достижении которых отработает прерывание, в этом прерывании можно немедленно обнулить счётчик и не потерять ни копейки импульсов.
В нормальном счётчике должен быть такой минимум:
не теряет ни одного импульса на заявленной частоте.
Сброс несколькими способами, в том числе по Z фазе.
Кроме сброса нужна возможность записи в счётчик любого значения.
Счётчик должен вызывать прерывание по заданному значению, и желательно по нескольким заданным значениям.
размер счётчика в одно слово... ну это прошлый век, нужно в два
Кстати ломал недавно один контроллер с кучей счётчиков на борту, нет в нём никаких ПЛИС, память, порты и мозги от фуджицу.
Так напишите тогда ФБ, и добавьте его в библиотеку, поставляемую с контроллером.
Лично мне уже не надо, я свой написал. 32-бит счётчик, с обнулением, детектором направления вращения, с изменением направления счёта.
Но чтоб люди не парились - доведите изделие до ума.
По моему много шума из ничего. То не так, се не так. Имея такой мощный и бесплатный инструмент как CoDeSys, можно сделать все что угодно. Обленились совсем, даже мозгами шевелить не хотят.
Маленький офтопик: Вы, наверное, не скажете, что разработчики операционных систем некомпетентны? К чему я веду?
Есть в ОС такая штука как системный таймер. Сердце системы. Обработчик его прерывания обычно стараются написать на ассемблере или в крайнем случае на С. Приоритет на скорость обработки.
Так вот. Оказывается, любой самый идеальный код недостаточно быстр для точного срабатывания по таймеру.
Поэтому разработчики процессоров делают специальный, аппаратный таймер для такой задачи, который не просто вызывает прерывание при переполнении, но и сообщает ОС, на сколько она, ОС опоздала при его обработке.
Речь идет о микро и наносекундах.
А тут предлагают из в 50 раз более медленного основного цикла ПЛК управлять счетчиком. И оставить все проблемы от такого на пользователя.
Вы не пробовали управлять автомобилем, открывая глаза раз в 5 секунд?
Вероятно, Вы слабо представляете, для чего нужен инкрементальный энкодер. Его основное предназначение - измерение относительных перемещений. В 99.99% случаев алгоритм такой:
механизм стоит (импульсов нет)- обнулились - поехали, считаем - содержимое счётчика совпало с уставкой - встали (импульсов опять нет) - перед началом нового движения можно опять обнулиться. На ходу никто счётчиком не управляет - нет такой надобности. Только в паузах между перемещениями.
Если скорость движения автомобиля равна нулю, я могу им управлять вообще не открывая глаз (дворники повключать, фарами помигать, побибикать, ещё чо-нить).
Неуправляемый счётчик - нафига он нужен? Он показывает какое-то число, которое само по себе ничего не значит, и не имеет никакого смысла. Показывает какое-то число импульсов. Отсчитанное между какими событиями? У Вас в автомобильном спидометре, кроме счётчика общего пробега второй счётчик, обнуляемый, имеется? Вы которым чаще пользуетесь? Обнуляете ли счётчик прямо на ходу, или только в начале пути между пунктами А и В?
Ничего не понял из офтопика, я не проектирую, а использую контроллеры и уже привык, что если есть скоростной счётчик, значит есть и сброс и запись и прерывания (не у всех). Как другие производители это реализуют? понятия не имею, но уже убедился что не на ПЛИС.
Ухххх, мнение знатока.
Прерывание по счётчику можно сделать? чтобы мгновенно отреагировать выходом контроллера, и не зависеть от цикла контроллера? часто это важно.
Много ещё чего нельзя на кодесисе, если контроллер этого не может.
А шум из-за того, что прочитав в описании контроллера о наличии скоростного счётчика и его скорости, человек, работавший ранее с другими контроллерами, просто офигивает от реализации того, что в ПЛК ОВЕН названо скоростным счётчиком. Поэтому я и сочувствую автору топика, мне просто объяснили до покупки, что там за счётчик.
capzap ну Вы ведь не в теме с чем инкрементальные энкодеры едят... этот энкодер НИЧЕГО НЕ СЧИТАЕТ просто сыпет импульсы по двум-трём фазам на контроллер. и нет у него входа для обнуления, вам уже это пытались объяснить. Изучите вопрос прежде чем пытаться спорить, ну смешно ваши реплики сейчас выглядят, репутацию свою вполне хорошую, сейчас угробить можете.
Конечно не всегда, но в основном.
Просто Ваша задача намного реже встречается, и на сколько я помню у вас скорость небольшая.
в моей задачке было до 90 м/мин без прерываний по счётчику не обойтись, по расчётам большая погрешность получалась только из-за времени цикла контроллера
При подключении одиночного выхода энкодера (используется как датчик импульсов) к быстрым входам не могу добиться правильного счёта. Для проверки подключил генератор на 140 Гц, получил результат 31-32 импульса в секунду. В чём проблема? Возможно, ПЛК? Испробовал все варианты параметров быстрых входов. При подключении модуля энкодера ПЛК виснет, даже при увеличении цикла до неприличия.
Вы записываете данные по указателю pt в каждом цикле программы. Как только перестанете туда что-то записывать, это что-то сразу пропадёт, и по этому адресу восстановятся старые данные.
У меня происходило вот что. Предположим, по адресу %IW0 есть число 1234. Вызываю функцию, которая записывает туда 0. Пока идёт вызов функции, по адресу %IW0 - 0. Как только вызов функции прекращается, там снова появляется 1234. Этого и следовало ожидать. Ведь указанный адрес находится в памяти контроллера, в области отображения процесса. Данные туда записываются из портов ввода-вывода в промежутки времени между вызовами программы. Если записать в ячейку памяти число, и сразу прочитать - вы это же число и прочитаете. Но оно потом всё равно перезапишется значением из порта.
Вот такой ФБ я наваял. Кому надо - пользуйтесь. Вчера проверял на железе - нормально работает.
Фильтрация была отключена. При увеличении входной частоты выше 150 Гц начинается проглатывание импульсов. То же происходит со счётчиками быстрых входов даже на более низкой частоте, а параметры счётчиков не регулируются. А мне надо подсчитать импульсы до 5 кГц.
Коллеги! У кого на ПЛК 100 получилось реально считать импульсы с двух энкодеров без ошибок.Отзовитесь! Подключал энкодеры 360 имп/оборот, делает один оборот в секунду, считает что попало, если крутишь очень медленно, то что-то правдивое, чуть быстрее-полная чушь. Какой энкодер тогда нужен, и с какой частотой его можно крутить, чтобы правильно считались импульсы в модуле Encoder. Разработчики контроллера! Что можете порекомендовать, как контроллер с таким косяком можно использовать для синхронизации линии,вместо Siemens.