Просмотр полной версии : ПЛК150 работа с массивами.
Здравствуйте!
Дорогие коллеги прошу помощи в реализации проекта на ПЛК150. Задача собственно такая: нужно распределить коробки на конвейере по свои окошкам. Считываем номер коробки и отправляем в окно с этим же номером. Всего 6. Есть датчик который видит что коробка находится на против 2ух окон. Окна располагаются по обе стороны от конвейера. В принципе ничего сложного, но вот проблема в том что коробки на конвейер попадают не равномерно и возможно что коробка еще не успела попасть в своё окно, а датчик считал новую.
Предполагаю что тут нужно работать с массивом, а вот как я не знаю( Никогда с массивом не работал. Подскажите или направьте в нужное русло пожалуйста.
lara197a
22.09.2016, 14:21
Вам нужно использовать сдвиговый регистр.
т.е после того, как к считывателю подъехала новая коробка,
нужно сдвинуть в массиве номер ранее считанного на 1.
делал такое как-то давно-давно на LOGO!
а мне кажется тут нужно работать со стеком fifo
Вам нужно использовать сдвиговый регистр.
т.е после того, как к считывателю подъехала новая коробка,
нужно сдвинуть в массиве номер ранее считанного на 1.
делал такое как-то давно-давно на LOGO!
Это я понимаю, но проблема в тм что я не разу не работал с массивом. Как его создать? направте пожалуйста.
lara197a
22.09.2016, 15:22
а мне кажется тут нужно работать со стеком fifo
Не знаю конкретную задачу,
у меня к примеру нужно было считывать датчиком качество изделия в одном месте, а отбраковывать в другом.
при этом через датчик "качества" могло проходить различное количество изделий, до момента прибытия к месту отбраковки.
Массивы хорошо описаны в книге И. Петрова "Программируемые логические контроллеры"
http://lib-bkm.ru/load/93-1-0-56
и в справке кдс
а мне кажется тут нужно работать со стеком fifo
Нашел библиотеки OSCAT и там есть функция FIFO, но по какому принципу она работает я так и не разобрался((
Не знаю конкретную задачу,
у меня к примеру нужно было считывать датчиком качество изделия в одном месте, а отбраковывать в другом.
при этом через датчик "качества" могло проходить различное количество изделий, до момента прибытия к месту отбраковки.
Массивы хорошо описаны в книге И. Петрова "Программируемые логические контроллеры"
http://lib-bkm.ru/load/93-1-0-56
и в справке кдс
Вот у меня такая же задача. Я считываю коробки и отправляю их в нужное окно
и через считыватель может проходить разное колличество коробок.
Помогте пожалуйста реализовать эту задачу))
Бинкевич Игорь
22.09.2016, 16:46
Создать массив, с номером сортировки и признаками коробки при каждом появлении коробки номер увеличивать на единицу. При нахождении коробки в зоне окна сравнивать параметры массива (Без номера) с заданием для данного окна.
Создать массив, с номером сортировки и признаками коробки при каждом появлении коробки номер увеличивать на единицу. При нахождении коробки в зоне окна сравнивать параметры массива (Без номера) с заданием для данного окна.
Да я понимаю... но как реализовать в программе. Можно пример, если не трудно.
Заморочился с FIFO, но как то не работает((
с фифо на самом деле все просто, есть только один момент это когда активировать событие чтения из стека.
На входе должно быть все понятно, пришел новый объект записали в стек, а возле окон если появилась коробка из стека нужно сделать чтение,тогда на выходе будет первая записанная инфа
Бинкевич Игорь
22.09.2016, 17:14
Моделирую ситуацию: есть некий конвейер на одной стороне находится считывающее устройство.
Далее по конвейеру находятся окна приемники.
По факту считывания номера увеличиваем счетчик на единицу. В первый столбец массива операцией MOVE записываем этот номер , во второй и следующий признаки сортировки коробок.
При движении по конвейеру срабатывают датчики положения по этому сигналу проверяем соответствие признаков сортировки и окна выгрузки. Например функцией EQ.
У Вас может быть много коробок на конвейере, но у Вас есть номер коробки находящейся под данным окном ( по нему и происходит выборка параметров)
Игорь, Вам придется еще смоделировать ситуацию когда коробки закончатся, на просто массиве это не реализовать, все равно придёте к подобию стека
lara197a
22.09.2016, 17:49
Я писал на лого, там есть "сдвиговы регистр".
поэтому программу не привожу.
Рассказываю алгоритм.
1.конвейер и посылки нужно синхронизировать.
для этого нужно использовать метки временные или реальные.
К примеру:
1. ставим датчик синхронизации рядом со считывателем номера(как считывать номер вдаваться не буду)
2. при прохождении метки мимо датчика синхронизации записываем в массив (из структуры бит и байт)
- номер (байт) если есть объект
- наличие (бит)
И при приходе следующей метки сдвигаем запись на 1 вниз в массиве.
как к примеру в позиции 5 совпал номер и наличие объекта,
толкатель выполняет перемещение объекта на др. линию.
Можно без меток, по времени.
lara197a
22.09.2016, 17:59
В вашем случае можно к примеру
считывать номер по срабатыванию датчика наличия у каждого места перегрузки.
Если номер объекта совпадает с номером позиции перегрузки, то включается толкатель для перемещения.
Бинкевич Игорь
22.09.2016, 19:22
Заболтали простой вопрос. Пример реализации сортировки в примере. При необходимости дам пояснения.
lara197a
22.09.2016, 20:55
Хотелось бы заметить, что без меток на конвейере не получится синхронизировать положение посылок.
т.к. скорость может меняться, останавливаться полностью, отключаться питание.
для последнего обязательно сделайте массив сохраняемым.
с фифо на самом деле все просто, есть только один момент это когда активировать событие чтения из стека.
На входе должно быть все понятно, пришел новый объект записали в стек, а возле окон если появилась коробка из стека нужно сделать чтение,тогда на выходе будет первая записанная инфа
Про FIFO прочитал в ""Программируемые логические контроллеры", там действительно всё просто, но почему то FIFO выдает последний номер в очереди, а не первый....((
Спасибо большое за поддержку!!!
Увы но чет я все равно не понимаю...
Не могу реализовать, что бы через датчик который видит номер коробки в которое надо отправить окно, прошло несколько коробок. понимаю что мне как то надо записывать данные в массив, а потом считывать и перезаписывать но вот как не пойму.....
На codesys 3.5 набросал макет задачи с визуализацией, там её проще и нагляднее рисовать.
Может кто и подскажет....
так в моем примере это и есть, на входе заполнение заканчивается, а вычитывается еще некоторое время
так в моем примере это и есть, на входе заполнение заканчивается, а вычитывается еще некоторое время
А можно пояснение к Вашему проекту
value : BYTE; (*значение *)
count : BYTE; (*........ *)
winUno : BYTE;
winDuo : BYTE;
winTre : BYTE;
winQua : BYTE;
finish : INT;
result : INT;
Если не трудно.....
валуе и коунт это демо переменные, чтоб организовать случайную нумерацию в ограниченном количестве. результат просто проверка что сколько значений записалось, столько и распределено по окнам, все что начинается с вин это четыре предполагаемых окна, финиш это последний элемент, чтоб не записать лишнего в такой реализации
lara197a
23.09.2016, 10:39
Я бы рекомендовал использовать массивы.
Чем это удобно?
Мы к примеру не знаем расстояние до точек сортировки.
если они разные, то мы зная расстояние до них в количестве меток,
можем перемещать массив вниз на столько, на сколько нам нужно,
изменяя только его размер(глубину).
К примеру. решили добавить точку сортировки, перенесли ближе или дальше или удлинили конвейер.
также можно использовать энкодер, как датчик расстояния.
валуе и коунт это демо переменные, чтоб организовать случайную нумерацию в ограниченном количестве. результат просто проверка что сколько значений записалось, столько и распределено по окнам, все что начинается с вин это четыре предполагаемых окна, финиш это последний элемент, чтоб не записать лишнего в такой реализации
Хм.... получается, что пришло значение на winUno, т.е. на 1ое окно и в результат запишется то же 1ое окно, но другие встанут в очередь? финиш это номер в очереди коробки?
Или я совсем туплю....
Хм.... получается, что пришло значение на winUno, т.е. на 1ое окно и в результат запишется то же 1ое окно, но другие встанут в очередь? финиш это номер в очереди коробки?
Или я совсем туплю....
так Вы запустили код в эмуляторе или нет? Пару раз погоняете и поймёте что к чему
так Вы запустили код в эмуляторе или нет? Пару раз погоняете и поймёте что к чему
Запустил, побежало распределение по окнам, потом результат стал 100, а финишь 4. Я так понимаю прошло 100 коробо а распределилось 4. А как именно прошло распределение не понял((
Запустил, побежало распределение по окнам, потом результат стал 100, а финишь 4. Я так понимаю прошло 100 коробо а распределилось 4. А как именно прошло распределение не понял((
генерируется случайное число от одного до четырех (здесь видимо нужно указать что идею метода предложил Ситников,а то задолбает своими требованиями извинений), затем это число заносится в стек, это предположим номер коробки в какое окну нужно ее послать. И так сто раз. Во втором таймере имитируется подход к окнам, анализируется выход стека и суммируется в соответствующую переменную символизирующую определенное окно,то что в переменной записалось четыре вовсе не означает количество окон, это просто последний сгенерированный элемент, если несколько раз запустить то значение должно менятся
генерируется случайное число от одного до четырех (здесь видимо нужно указать что идею метода предложил Ситников,а то задолбает своими требованиями извинений), затем это число заносится в стек, это предположим номер коробки в какое окну нужно ее послать. И так сто раз. Во втором таймере имитируется подход к окнам, анализируется выход стека и суммируется в соответствующую переменную символизирующую определенное окно,то что в переменной записалось четыре вовсе не означает количество окон, это просто последний сгенерированный элемент, если несколько раз запустить то значение должно менятся
Ясно.
Блин, мне уже неудобно, а как переделать на дискретную логику?
выкидываете таймеры, а в условиях ставите фронт сигнала с датчиков. Так то это демка, а не готовое решение, тат еще много чего нужно будет переделать
выкидываете таймеры, а в условиях ставите фронт сигнала с датчиков. Так то это демка, а не готовое решение, тат еще много чего нужно будет переделать
Подскажите пожалуйста по поводу блока FIFO256. В Вашем примере он быстро работает, а вот у меня он почему то долго( т.е. режим записи включен постоянно, а если подать сигнал на чтение то переменная выдаётся из очереди не сразу, а с задержкой. Это можно как то исправить??
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot