Показано с 1 по 10 из 35

Тема: Подключение энкодеров 5В с частотой до 65 кГц к ПЛК110-60М02

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию

    Цитата Сообщение от Вольд Посмотреть сообщение
    Зачем было нужно делать общий минус для дискретных входов ?
    Дело в том, что станок был разработан немцами более 20 лет назад, весь монтаж датчиков, релюшек и т.д. был продуман еще в то время, вся логика продумана на общем минусе, я тогда в школе еще учился, посему мне пришлось приспосабливаться к уже имеющемуся шкафу автоматики.

    Цитата Сообщение от Владимир Ситников Посмотреть сообщение
    Вообще говоря, должно хватать такого (и разнообразные программные сбросы по 50000 я бы выключал. Зачем они?):
    Код:
    prevEncoderValue : WORD; (* например, в глобальных *)
    encoderValue : WORD; (* это в plc configuration *)
    
    value : DINT; (* тут будет абсолютное положение энкодера *)
    
    value := value + WORD_TO_INT(encoderValue-prevEncoderValue);
    prevEncoderValue := encoderValue;
    Т.е. все эти "abs", ">40000" и т.п. это всё не нужно.
    Для вычисления абсолютного положения энкодера достаточно двух строк.
    Сбросы по 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, и и это все отнимается и складывается... и счет ушел

  2. #2

    По умолчанию

    Цитата Сообщение от ilys Посмотреть сообщение
    Получается, если мы находимся на границе программного обнуления счетчика при 65000
    Простите, но "бла-бла-бла-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; (* правильно *)
    Вот в симуляции:
    Нажмите на изображение для увеличения. 

Название:	Снимок экрана 2016-12-29 в 10.54.07.png 
Просмотров:	324 
Размер:	47.8 Кб 
ID:	28461

    newValue2 правильно изменилось с 10 до 19 (увеличилось на 9)

    Попробуем в обратную сторону. Т.е. пусть старое значение 5, а крутанули на -9:
    Нажмите на изображение для увеличения. 

Название:	Снимок экрана 2016-12-29 в 10.55.41.png 
Просмотров:	230 
Размер:	48.1 Кб 
ID:	28462

    Тоже всё верно. newValue2 изменилось с 10 до 1 (уменьшилось на 9)
    Поэтому никакие "сбросы по 50000" не нужны. Они только вредят и запросто могут вызывать ошибку счёта.
    Честное слово, я даже не хочу вчитываться, если есть нормальный и простой вариант в одну строку.
    Последний раз редактировалось Владимир Ситников; 29.12.2016 в 11:02.

  3. #3

    По умолчанию

    Цитата Сообщение от Владимир Ситников Посмотреть сообщение
    Поэтому никакие "сбросы по 50000" не нужны. Они только вредят и запросто могут вызывать ошибку счёта.
    Честное слово, я даже не хочу вчитываться, если есть нормальный и простой вариант в одну строку.
    Спасибо Вам, за обед прочитал в архивах форума про WORD_TO_INT, попробую у себя этот пример!

Похожие темы

  1. Как считать данные с 10 ABZ-энкодеров
    от bladerunner в разделе Подбор Оборудования
    Ответов: 11
    Последнее сообщение: 15.09.2016, 11:20
  2. ПЧВ Запуск с 18 клемы управление частотой по шине
    от Aleksey Belokon в разделе Эксплуатация
    Ответов: 1
    Последнее сообщение: 22.06.2015, 16:18
  3. Подбор и подключение энкодеров и датчиковк ПЛК 160
    от albert3030 в разделе Подбор Оборудования
    Ответов: 1
    Последнее сообщение: 10.01.2015, 19:58
  4. Модули для подключения энкодеров с SSI
    от Леонид в разделе Разработки
    Ответов: 5
    Последнее сообщение: 18.01.2012, 11:29
  5. Ответов: 20
    Последнее сообщение: 20.10.2011, 22:49

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •