Здравствуйте, коллеги!
Может кто сталкивался с похожей задачкой:
Допустим имеется абстрактная установка с н-ным количеством клапанов, работающих в один коллектор, пропускная способность которого допускает одновременную работу всего двух клапанов. Каждый клапан открывается только по достижении максимального уровня в своей емкости. Но при этом очередность открытия должна соответствовать очередности сработки уровней...
Как можно оптимально по ресурсу памяти и с более менее оптимизированым кодом решить эту задачупри помощи ПЛК?
Допустим через цикл я могу составить очередь, но как заставить ее подвинуться вперед, когда первый вышел из очереди...
Видимо сказывается ограниченость фантазии...
- Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
- Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
- Не надо писать свой вопрос в первую попавшуюся тему - всегда лучше создать новую тему.
- За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения. Непонятно? - Читать здесь.
- Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
- Перед тем как что-то написать - читать здесь, а затем здесь и здесь.
- Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.
Организация очереди при помощи ПЛК
Модератор: Глоб.модераторы
-
- эксперт
- Сообщения: 1172
- Зарегистрирован: 14 ноя 2013, 20:35
- Имя: Анатолий Сергеевич
- Страна: Россия
- город/регион: Башкортостан
- Благодарил (а): 13 раз
- Поблагодарили: 68 раз
-
- освоился
- Сообщения: 248
- Зарегистрирован: 31 янв 2017, 08:44
- Имя: Маркушин Андрей Геннадьевич
- Страна: Россия
- город/регион: Нижегородская обл., Выкса
- Благодарил (а): 19 раз
- Поблагодарили: 64 раза
Организация очереди при помощи ПЛК
1. Определить очередь в виде массива в DB + BLKMOV для сдвига - для симатиков. Элементы массива - номера клапанов.
2. Разработать блок управления очередью (сдвиг очереди и прочее), лучше на ST-языках (работать с массивами легче)
3. Опять-таки для симатиков - использовать стандартные блоки работы с таблицами (FC85 - FIFO, FC87 - LIFO)
2. Разработать блок управления очередью (сдвиг очереди и прочее), лучше на ST-языках (работать с массивами легче)
3. Опять-таки для симатиков - использовать стандартные блоки работы с таблицами (FC85 - FIFO, FC87 - LIFO)
-
- освоился
- Сообщения: 237
- Зарегистрирован: 28 июл 2008, 15:40
- Имя: Сергеев Евгений Викторович
- Страна: Karjala/Suomi
- город/регион: Petroskoi/Helsinki
- Благодарил (а): 3 раза
- Поблагодарили: 3 раза
Организация очереди при помощи ПЛК
Всё достаточно просто - заводите блок данных с массивом.
Ну, типа Очередь: ARRAY 1..100 OF INT;
Заводите две переменные - НачалоОчереди и КонецОчереди.
При инициализации обе они равны нулю ( не обязательно, просто должны быть одинаковыми ).
Дальше будут какие-то обработчики событий от каждого, гм, юнита что-ли, не знаю, что у вас там.
У меня это кнопки ( нажал - поставил устр-во в очередь на обработку ) и датчики наличия продукта в бункере ( насыпало туда продукту - эмулируем нажатие той же кнопки ).
Обработчик смотрит - ага, кнопку нажали. Он смотрит, что в переменной КонецОчереди, пихает по ссылке номер юнита в массив Очередь и увеличивает на единицу переменную КонецОчереди.
Дальше, должен быть обработчик очереди. Он смотрит - НачалоОчереди <> КонецОчереди. Что-то обработать надо. Он достаёт из массива по индексу, содержащемуся в КонецОчереди номер юнита и вызывает подпрограмму обработки, в которую передаёт оный номер в кач-ве аргумента. Когда эта подпрограмма сообщит ему, что обработка закончена, он уменьшает переменную КонецОчереди на единицу.
Вот, собственно, и всё.
По вкусу можно добавить приоритеты юнитам, тогда, если попадается высокий приоритет события массив Очередь сдвигают на шаг вниз, и вверх очереди пихают номер уст-ва с высоким приоритетом.
Так-же читать можно не верх очереди, а низ; сортировать очередь согласно каким-то критериям, добавлять в неё разные поля - если нужна разная обработка для разных категорий юнитов этцетера. Штука гибкая, сами сообразите, как пользоваться.
Ну, типа Очередь: ARRAY 1..100 OF INT;
Заводите две переменные - НачалоОчереди и КонецОчереди.
При инициализации обе они равны нулю ( не обязательно, просто должны быть одинаковыми ).
Дальше будут какие-то обработчики событий от каждого, гм, юнита что-ли, не знаю, что у вас там.
У меня это кнопки ( нажал - поставил устр-во в очередь на обработку ) и датчики наличия продукта в бункере ( насыпало туда продукту - эмулируем нажатие той же кнопки ).
Обработчик смотрит - ага, кнопку нажали. Он смотрит, что в переменной КонецОчереди, пихает по ссылке номер юнита в массив Очередь и увеличивает на единицу переменную КонецОчереди.
Дальше, должен быть обработчик очереди. Он смотрит - НачалоОчереди <> КонецОчереди. Что-то обработать надо. Он достаёт из массива по индексу, содержащемуся в КонецОчереди номер юнита и вызывает подпрограмму обработки, в которую передаёт оный номер в кач-ве аргумента. Когда эта подпрограмма сообщит ему, что обработка закончена, он уменьшает переменную КонецОчереди на единицу.
Вот, собственно, и всё.
По вкусу можно добавить приоритеты юнитам, тогда, если попадается высокий приоритет события массив Очередь сдвигают на шаг вниз, и вверх очереди пихают номер уст-ва с высоким приоритетом.
Так-же читать можно не верх очереди, а низ; сортировать очередь согласно каким-то критериям, добавлять в неё разные поля - если нужна разная обработка для разных категорий юнитов этцетера. Штука гибкая, сами сообразите, как пользоваться.
пдпс скрщна по трбвнию мдратра