Тема / Topic: Поделитесь идеями, кто как реализует алгоритмы?
alex_kh1
Forum Member / Участник форума
Участник № / Member № 3981
отправлено / posted
Проблема заключается в том, что Trace Mode замечательно подходит моделирования жесткой логики, эквивалентной электронным схемам. Но как на ней по человечески реализовывать сложные ветвящиеся алгоритмы с большим количество входов выходов? Я выкрутился тем что ввожу счетчик шагов, и по CASE каждый раз при выполнении подпрограммы проверяю условия выполняю действия и новым значение счетчика определяю следующий шаг алгоритма. Криво, не наглядно, трудоемко, но ничего лучше не придумал. Может я чего нибудь не знаю и кто-то умеет лучше?
Сообщения / Posts 49 | Из / From: Украина
| IP / IP: IP адрес / IP address |
alex_kh1
Forum Member / Участник форума
Участник № / Member № 3981
отправлено / posted
Ну, я затрудняюсь в применении данного термина. Скажем так, я привык к тому хорошему чо есть в обычных языках, т.е. вызвали в процедуру и реализуем в ней логику алгоритма, получили одно условие, выставили какие-то переменные и идем на следую проверку-выставление. В Трасе Моде же такое невозможно поскольку что бы обновились значения выходов-входов программа должна закончиться, т.е. каждый следующий шаг подразумевает выход и повторный вход на следующем обсчете. В результате получается та канитель, которую я описал в первом посте.
Сообщения / Posts 49 | Из / From: Украина
| IP / IP: IP адрес / IP address |
alex_kh1
Forum Member / Участник форума
Участник № / Member № 3981
отправлено / posted
Вот кусочек кода для примера
CASE Шаг OF
0: Флаг_шнека_непоступление=0; Таймер_непоступления=Пауза_непоступления*1000; if Рецепт_выполнен_полностью==1 then Рецепт_выполнен_полностью=0; Отдозировано_по_рецепту=0; end_if; Шаг=10;
10: if Условия_начала_дозирования then if Есть_рецепт then Дозатор_ожидает_рецепт=0; if Рецепт_выполнен_полностью==1 then Рецепт_выполнен_полностью=0; Отдозировано_по_рецепту=0; end_if; Шаг=20; else Дозатор_ожидает_рецепт=1; end_if; elsif Шнеки_наполнения_включены then Шаг=1000; end_if;
20: Шаг=25;
25: Таймер=Пауза_доз_эл*1000; Шаг=30;// if Рецепт_выполнен_полностью==1 then Рецепт_выполнен_полностью=0; Отдозировано_по_рецепту=0; end_if; 30: if Таймер<=0 then Флаг_дозатора_дозирование=1; Флаг_дозатора_для_фиксации_веса=1; Кнопка_пауза =4; Кнопка_стоп =4; Начальный_вес=Показания_весов; Шаг=40; if Доза<>0 then Шаг=40; else Флаг_дозатора_для_фиксации_веса=2; Шаг=110; end_if; end_if;
40: if Нужно_сбросить_начальный_вес then Начальный_вес=Показания_весов; Нужно_сбросить_начальный_вес=0; end_if; Шаг=45; 45: if Режим_дозатора then if (Доза-Отдозированное_ранее-(Начальный_вес-Показания_весов))<=Досыпка then Включить_шнек_точно=1; Включить_шнек_грубо=1; Шаг=60; else Включить_шнек_грубо=1; Шаг=70; end_if; else Шаг=520; end_if;
Сообщения / Posts 49 | Из / From: Украина
| IP / IP: IP адрес / IP address |
Рекомендую попробовать на SFC это делать. Там как раз ветвление логики и шаги с условиями переходов.
Для себя в проектах подобное делаю всегда так: 1) Выполняю декомпозицию алгоритма на отдельные подфункции, которые выполняю в виде отдельных программ на FBD или ST 2) Создаю на ST некий арбитражный алгоритм, который следит за общей работой всех этих подфункций, управляя их статусами в зависимости от неких условий.
Иногда можно и как вы в примере показали делать, вот только потом разбираться в такой "портянке" ой как сложно...
Но вообще именно для этого в стандарте SFC и придумали.
IP / IP: IP адрес / IP address |
alex_kh1
Forum Member / Участник форума
Участник № / Member № 3981
отправлено / posted
Да, когда искал варианты пытался применить SFC, но посчитал это бесполезной игрушкой и больше не возвращался.
Думаете можно его применить для эквивалентной замены того как я сейчас делаю, из расчета строк примерно на 500 в одной программе?
И там можно будет что-то понять, с учетом того что элементы SFC даже нельзя расположить на листе в желаемом порядке?
Сообщения / Posts 49 | Из / From: Украина
| IP / IP: IP адрес / IP address |
Romсheg
unregistered
отправлено / posted
Все можно, вопрос только в том - как применять. Ведь и микроскопом можно гвоздь забить.
IP / IP: IP адрес / IP address |
alex_kh1
Forum Member / Участник форума
Участник № / Member № 3981
отправлено / posted
Неправильно выразился, понятно что можно, имеет ли преимущества вариант с SFC? Или же все станет еще более запутанным.
Сообщения / Posts 49 | Из / From: Украина
| IP / IP: IP адрес / IP address |
Romсheg
unregistered
отправлено / posted
На вкус и цвет - все фломастеры разные. Мне вот лично SFC не нравится, поэтому я им никогда не пользуюсь. Все - дело вкуса и личных ощущений в процессе эксплуатации.
IP / IP: IP адрес / IP address |
alex_kh1
Forum Member / Участник форума
Участник № / Member № 3981
отправлено / posted
Ну а если не SFC и не как я, есть еще варианты? Кстати глянул SFC сейчас и не вижу возможностей:
1. Производить некую предварительную обработку набора данных, до вызова алгоритма, что бы вычисленные переменные были доступны во всех узлах и переходах. 2. Соответственно я могу изменить шаг принудительно до вызова алгоритма, реагируя на некие аварийные ситуации. И не вижу как это сделать в SFC не описывая реакцию на "аварию" во всех переходах.