Просмотр полной версии : Codesys 3.5, язык ST, динамический массив со сдвигом
Student2023
26.07.2023, 17:54
Здравствуйте.
Пользователь я начинающий. Уже знаю что такое структура и массив)). А как написать код динамического массива со сдвигом...увы. Прошу о помощи.
Задача поставлена следующая: по конвейеру перемещаются ложементы, в которых детали. В конце конвейера установлен датчик ложементов, срабатывает при прохождении мимо него ложемента (независимо от того, есть там деталь или нет).
В начале конвейера установлена камера тех. зрения, которая выявляет бракованные детали, и выдает результат (брак / не брак). Между камерой тех. зрения и датчиком ложемента установлен экстрактор, который удаляет с конвейера бракованные детали, а годные детали собираются в конце конвейера.
Так вот, после обнаружения бракованной детали-нужно запомнить этот ложемент, и "проехав" по конвейеру 15 ложементов (датчик ложементов отсчитает 15 раз), ложемент с бракованной деталью будет находиться напротив экстрактора (сдувается воздухом), где его нужно удалить. Требуется запоминать бракованные детали (они могут быть в перемешку с годными на участке конвейера в 15 ложементов) и при перемещении их на 15 ложементов, включать экстрактор. Поставлен датчик ложементов, так как скорость конвейера может быть разной (установка экспериментальная), и таймер использовать не рационально.
Создал структуру и массив, в котором планирую записывать данные для дальнейшей обработки.
Принимаю передний фронт датчика ложементов и бит(взвожу по переднему фронту) с камеры тех.зрения.
А дальше "затык".. Пожалуйста, подскажите как правильно выполнить задачу.
Student2023
26.07.2023, 19:37
На запас. Знал бы 100%, лишнее бы не создавал.
Мне стало интересно. Подпишусь на тему.
Мои тезисы:
1. Написано что надо запоминать позицию брака для удаления его экстрактором.
Что происходит после удаления брака с запомненной позицией?
2. Вроде динамические массивы фиг создашь. Можно сделать статический на максимум элементов.
Почему вообще придуман динамический массив со сдвигом?
3. ИМХО (тут я могу тупить) тут же алгоритм простой: когда выявлен брак, то подождать 15 импульсов - и пнуть экстрактор.
Раз расстояние от камеры до экстракторка - 15 импульсов - то получается что максимум что может быть - это 15 раз подряд брака. Значит максимальная длина массива - это 15 элементов.
И получается, что нужен массив (очередь) FIFO. И работать должно так (ИМХО):
* С каждым импульсом от датчика сдвигаем массив на один шаг влево (на место первого - второй, на место второго - третий и так далее). После сдвига последний элемент дожен оказаться пустым.
* Если видим в массиве ссылку на брак - удаляем его экстрактором и обнуляем этот элемент массива
* Если камера видит брак - то она выставляет флаг брака в последнем элементе массива.
То есть, образно, насколько я придумал - то массив элементов должен двигаться вместе с конвеером по датчику импульсов.
И если на массиве "приехал" брак - то его и скидываем экстрактором.
Ну и не забываем про все правила работы с массивами:
* Границы минимума и максимума делаем через константы, чтобы избежать магических чисел
* Проверяем границы и условия работы циклов, чтобы не выйти за границы массива
)) Динамический массив сделать можно. Он тут не нужен.
kondor3000
26.07.2023, 20:20
Попробуйте для начала изучить простой пример работы с двумерным массивом, пример в Codesys 2.3
Потом замените массив на структуру.
Валенок, kondor3000 Вы алгоритм почитайте! Там динамический массив вообще не нужен.
Student2023
26.07.2023, 21:22
Мне стало интересно. Подпишусь на тему.
Мои тезисы:
1. Написано что надо запоминать позицию брака для удаления его экстрактором.
Что происходит после удаления брака с запомненной позицией?
2. Вроде динамические массивы фиг создашь. Можно сделать статический на максимум элементов.
Почему вообще придуман динамический массив со сдвигом?
3. ИМХО (тут я могу тупить) тут же алгоритм простой: когда выявлен брак, то подождать 15 импульсов - и пнуть экстрактор.
Раз расстояние от камеры до экстракторка - 15 импульсов - то получается что максимум что может быть - это 15 раз подряд брака. Значит максимальная длина массива - это 15 элементов.
И получается, что нужен массив (очередь) FIFO. И работать должно так (ИМХО):
* С каждым импульсом от датчика сдвигаем массив на один шаг влево (на место первого - второй, на место второго - третий и так далее). После сдвига последний элемент дожен оказаться пустым.
* Если видим в массиве ссылку на брак - удаляем его экстрактором и обнуляем этот элемент массива
* Если камера видит брак - то она выставляет флаг брака в последнем элементе массива.
То есть, образно, насколько я придумал - то массив элементов должен двигаться вместе с конвеером по датчику импульсов.
И если на массиве "приехал" брак - то его и скидываем экстрактором.
Ну и не забываем про все правила работы с массивами:
* Границы минимума и максимума делаем через константы, чтобы избежать магических чисел
* Проверяем границы и условия работы циклов, чтобы не выйти за границы массива
//================================================== ==========
1. Написано что надо запоминать позицию брака для удаления его экстрактором.
Что происходит после удаления брака с запомненной позицией?
Обнуление.
2. Вроде динамические массивы фиг создашь. Можно сделать статический на максимум элементов.
Почему вообще придуман динамический массив со сдвигом?
Каша в голове от прочитанного в интернете.
3. ИМХО (тут я могу тупить) тут же алгоритм простой: когда выявлен брак, то подождать 15 импульсов - и пнуть экстрактор.
Раз расстояние от камеры до экстракторка - 15 импульсов - то получается что максимум что может быть - это 15 раз подряд брака. Значит максимальная длина массива - это 15 элементов.
И получается, что нужен массив (очередь) FIFO. И работать должно так (ИМХО):
По алгоритму логика мне понятна, с реализацией туго, особенно когда профильного образования нет).
За подсказку про массив (очередь ) FIFO - БлагоДарю! Изучу.
Student2023
26.07.2023, 21:23
Попробуйте для начала изучить простой пример работы с двумерным массивом, пример в Codesys 2.3
Потом замените массив на структуру.
Благодарю за ответ. Изучу.
Ну, всё что тебе надо найти - это алгоритм сдвига массива. На любом языке. И портировать его на CodeSys.
А дальше по импульсу от датчика проверять брак и сдвигать массив (всегда).
Двигать массив здесь, это как подвесить кисть на верёвочке, и двигать стол с полотном под ней. Рисунок то выйдет))
Здравствуйте.
Пользователь я начинающий. Уже знаю что такое структура и массив)). А как написать код динамического массива со сдвигом...увы. Прошу о помощи.
Задача поставлена следующая: по конвейеру перемещаются ложементы, в которых детали. В конце конвейера установлен датчик ложементов, срабатывает при прохождении мимо него ложемента (независимо от того, есть там деталь или нет).
В начале конвейера установлена камера тех. зрения, которая выявляет бракованные детали, и выдает результат (брак / не брак). Между камерой тех. зрения и датчиком ложемента установлен экстрактор, который удаляет с конвейера бракованные детали, а годные детали собираются в конце конвейера.
Так вот, после обнаружения бракованной детали-нужно запомнить этот ложемент, и "проехав" по конвейеру 15 ложементов (датчик ложементов отсчитает 15 раз), ложемент с бракованной деталью будет находиться напротив экстрактора (сдувается воздухом), где его нужно удалить. Требуется запоминать бракованные детали (они могут быть в перемешку с годными на участке конвейера в 15 ложементов) и при перемещении их на 15 ложементов, включать экстрактор. Поставлен датчик ложементов, так как скорость конвейера может быть разной (установка экспериментальная), и таймер использовать не рационально.
Создал структуру и массив, в котором планирую записывать данные для дальнейшей обработки.
Принимаю передний фронт датчика ложементов и бит(взвожу по переднему фронту) с камеры тех.зрения.
А дальше "затык".. Пожалуйста, подскажите как правильно выполнить задачу.
Нафиг массив: ложементы конвейера - биты в ворде, включайте 1 бит по браку, делайте SHL по датчику движения, в конце конвейера (бит 15) смотрите его состояние и управляйте удалятором
.. ложементы конвейера - биты в ворде...
Дык автору ещё и iNumber'ы нужны. И их двигать. Зачем-то.
Ну, я бы тоже запилил бы структуру по изделию - ID, серийник и так далее.
Какая разница, что двигать? Массив или биты? Имхо массив удобнее, так как можно сделать универсальный код, определив границы массива через константы (чтобы без магических чисел).
Дык автору ещё и iNumber'ы нужны. И их двигать. Зачем-то.
Непонятно откуда значение этого номера должно появиться. Ну, допустим, на деталях наклейки с индивидуальными номерами и сканер - тогда массив структур, всё то-же - только сдвигать их руками в цикле. Или вместо сдвига завести в структуре поле "позиция детали на конвейере" и менять её при движении.
Непонятно откуда значение этого номера должно появиться..
Так автор и сам не знает (может и внукам завещать ?):
На запас. Знал бы 100%, лишнее бы не создавал.
...массив структур, всё то-же - только сдвигать их руками в цикле...
Двигаем стол с бумажкой вдоль карандаша
...Или вместо сдвига завести в структуре поле "позиция детали на конвейере" и менять её при движении.
зачем !? индекс массива это оно же есть
Может карандаш двигать ?
var
стол : array[0..14] of какой-то тип с полями; //15 штук же заявлено
карандаш : INT;
----------
if Принимаю передний фронт датчика ложементов then
стол[карандаш].брак := с камеры тех.зрения;
карандаш := (карандаш + 1) mod 15; //и думаем кто же теперь в [карандаш]-то? ..
if стол[карандаш].брак then //.. а вот кто
экстрактор.дунь_воздухом();
end_if
end_if
экстактор(); //отрабатывает свою внутрянку которая дует и все такое
Может карандаш двигать ?
...[/CODE]
Что-то не доходит. Ладно карандаш двигается, а как происходит обновление элементов в массиве (на конвейере) ?
.. как происходит обновление элементов в массиве (на конвейере) ?
Ну здрастьте.
...Задача поставлена следующая: по конвейеру перемещаются ложементы, в которых детали. В конце конвейера установлен датчик ложементов, срабатывает при прохождении мимо него ложемента (независимо от того, есть там деталь или нет).
В начале конвейера установлена камера тех. зрения, которая выявляет бракованные детали, и выдает результат (брак / не брак)....
label:
В 0-ой из 0...14 пустых коробок упала деталька
Пометилась (ок/ёк)
перед собой вы всегда видите хвост..
69243
и до ..14] там не ок и не ёк а тупо пусто.
....карандаш := (карандаш + 1) mod 15;
А если до этого было 14 то сейчас видите/не видите репейник в [0] который был/небыл 15 раз назад
Есть репейник => сдуваем
goto label
Ну здрастьте.
label:
В 0-ой из 0...14 пустых коробок упала деталька
Пометилась (ок/ёк)
перед собой вы всегда видите хвост..
69243
и до ..14] там не ок и не ёк а тупо пусто.
....карандаш := (карандаш + 1) mod 15;
А если до этого было 14 то сейчас видите/не видите репейник в [0] который был/небыл 15 раз назад
Есть репейник => сдуваем
goto label
Попробовал - что-то получилось, но удаление почему-то запаздывает на такт.
Напомнило историю про велосипед (http://books.rusf.ru/unzip/add-on/xussr_mr/mihanv20.htm?1/2)
На массиве 0...13 (MOD 14) работает нормально.
Какое удаление 8( ?
Ну сдуватель включается на такт позже, как-будто конвейер не 15 мест, а 16
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot