Вообще то да, и на любой вкус, штука очень распространённая.
http://www.chipdip.ru/catalog/ic-darlington/?gq=uln2
http://www.electronshik.ru/find?q=UL...all&field=grid
и вишенка на торт
http://www.electronshik.ru/item/step...rduino-1266697
Последний раз редактировалось BETEP; 22.12.2016 в 10:46.
Проработали и этот вопрос, фотки нет, но форма сигнала не идеальная, сказывается время затухания сигнала на высоких частотах
Эта микросхема хороша, но для данного случая потребуется снова городуха для инвертирования сигналов, т.к. на выходе общий +, а у меня общий минус и на входных и на выходных каналах.
Остановились на этом варианте и долго бились с повышением до 24В амплитуды выходного сигнала, т.к. в схемотехнике ПЛК на входных каналах уже стоят делители в паре с оптроном, которые в итоге общей цепи гасят амплитуду. Пришлось на переходную плату подать 27В, использовать КТ815 и сопротивления на делителях мощностью 1Вт, и они даже греются малость.
ИТОГО: вот что имею на сегодняшний день.
В первый раз данные давал по максимальной рабочей частоте - 30 кГц, ошибся, даже их нет блин, ну максимум до 10 кГц нет пропусков оказывается! Да и немного с частотниками поработав уменьшил немного свой аппетит, и теперь нужно 52 кГц максимум. Прикладываю фото с последними результатами по согласованию сигналов энкодера, есть амплитуда около 24 В, хотя ловит контроллер уже при 16 В, может и ниже. Получается и искаженный сигнал от ПДИ5-4 подходит что-ли контроллеру, просто в режиме Fast Encoders он вместо 100 кГц работает на 10% от заявленной частоты... Не порядок.
IMAG6511.jpg IMAG6513.jpg
IMAG6476.jpgЭто уже панель оператора с моей первой работой, для общего вида прикладываю
Последний раз редактировалось ilys; 29.12.2016 в 14:07.
Вообще говоря, должно хватать такого (и разнообразные программные сбросы по 50000 я бы выключал. Зачем они?):
Т.е. все эти "abs", ">40000" и т.п. это всё не нужно.Код:prevEncoderValue : WORD; (* например, в глобальных *) encoderValue : WORD; (* это в plc configuration *) value : DINT; (* тут будет абсолютное положение энкодера *) value := value + WORD_TO_INT(encoderValue-prevEncoderValue); prevEncoderValue := encoderValue;
Для вычисления абсолютного положения энкодера достаточно двух строк.
Дело в том, что станок был разработан немцами более 20 лет назад, весь монтаж датчиков, релюшек и т.д. был продуман еще в то время, вся логика продумана на общем минусе, я тогда в школе еще учился, посему мне пришлось приспосабливаться к уже имеющемуся шкафу автоматики.
Сбросы по 50000 делал - мог и максимум взять, 65000, просто 50000 для удобства, для себя, а нужно для того, чтобы не потерять данных с счетчика энкодера. В ходе работ выяснилось, что даже при медленных режимах движения шпинделя за время одного цикла управляющей программы счетчик энкодера меняется на 15 и более значений. Движение шпинделя может быть от приводов, и так же от ручной подачи, т.е. оператор станка крутит штурвалы рукой и теперь нет понятия в программе, куда будет вращаться энкодер, в отличии от программного управления серводвигателями, где я явно знаю направление движения, относительно к которому привязал бы логику - или плюсовать или минусовать. Получается, если мы находимся на границе программного обнуления счетчика при 65000 (если максимальное, у меня 50000) и в это время оператор крутанул штурвал, при следующем цикле счет будет (примерно) или 25 - если вперед, или 64980 - обратка. Разница предыдущего значения счетчика и действующего будет или ABS(65000-25) = 64975 или ABS(65000-64980) = 20. Если просто это значение прибавлять или отнимать от счетчика, то будет неправильно. Потому для себя заморочился, что если разница более 40000, то нужно с полученного значения отнимать максимальное значение счетчика. И у меня общий счетчик DINT, для того чтобы соблюдался нуль и держались при необходимости и минусовые значения. 7985 им/мм * 9000 мм(максимальный ход по оси) = +-71865000, в пределы DINT входим.
Тяжеловато объяснил...
В краце, для себя такой алгоритм разработал, он работает и не привязывается к командам управления серводвигателей, а просто следит за данными с энкодеров.
value := value + WORD_TO_INT(encoderValue-prevEncoderValue); - не совсем ясно как работает выделенное.
prevEncoderValue := encoderValue;
Вижу что разницу прибавляем к общему счетчику, а если была ситуация, что обнуление энкодера при достижении 65000 произошло именно в тот момент, когда оператор в ручную ловит микроны, и в этот момент он раз 10 штурвалом крутил почуточку в разные стороны, и получаем значения то 64980, то 20, и и это все отнимается и складывается... и счет ушел
Зачем было 27 В подавать на дискретные входы. Надо подавать ровно 24 В. Дискретные входы ПЛК110 будут нормально работать при напряжении от 12 до 30 В. Какое сопротивление стоит в коллекторе КТ815 ?
Энкодер у вас исправен ?
Размах сигнала на входах ПЛК должен быть 24В. Если энкодер 5 в - ставьте высокоскоростную развязку.
Осциллограмма у Вас не с энкодера, а с генератора пилы Это точно энкодер? Китайский неликвид?
Тролль-наседка, добрый, нежный и ласковый
Простите, но "бла-бла-бла-65000".
Вот вам пример:
Вот в симуляции:Код:VAR prevEncoderValue, encoderValue : WORD; diff_word : WORD; diff_int : INT; value : DINT; newValue : DINT; newValue2 : DINT; END_VAR value := 10; (* прошлое значение -- 10 *) prevEncoderValue := 65530; (* было у границы *) encoderValue := prevEncoderValue + 9; (* крутанули на 9 *) newValue := value + encoderValue - prevEncoderValue; (* неправильно *) diff_word := encoderValue - prevEncoderValue; diff_int := WORD_TO_INT(diff_word); newValue2 := value + diff_int; (* правильно *)
newValue2 правильно изменилось с 10 до 19 (увеличилось на 9)
Попробуем в обратную сторону. Т.е. пусть старое значение 5, а крутанули на -9:
Тоже всё верно. newValue2 изменилось с 10 до 1 (уменьшилось на 9)
Поэтому никакие "сбросы по 50000" не нужны. Они только вредят и запросто могут вызывать ошибку счёта.
Честное слово, я даже не хочу вчитываться, если есть нормальный и простой вариант в одну строку.
Последний раз редактировалось Владимир Ситников; 29.12.2016 в 11:02.