Проблема заключается в том, что Trace Mode замечательно подходит моделирования жесткой логики, эквивалентной электронным схемам. Но как на ней по человечески реализовывать сложные ветвящиеся алгоритмы с большим количество входов выходов? Я выкрутился тем что ввожу счетчик шагов, и по CASE каждый раз при выполнении подпрограммы проверяю условия выполняю действия и новым значение счетчика определяю следующий шаг алгоритма. Криво, не наглядно, трудоемко, но ничего лучше не придумал. Может я чего нибудь не знаю и кто-то умеет лучше?
Posted by A40 (Участник № / Member № 3999) on :
Вам нужен конечный автомат?
Posted by alex_kh1 (Участник № / Member № 3981) on :
Ну, я затрудняюсь в применении данного термина. Скажем так, я привык к тому хорошему чо есть в обычных языках, т.е. вызвали в процедуру и реализуем в ней логику алгоритма, получили одно условие, выставили какие-то переменные и идем на следую проверку-выставление. В Трасе Моде же такое невозможно поскольку что бы обновились значения выходов-входов программа должна закончиться, т.е. каждый следующий шаг подразумевает выход и повторный вход на следующем обсчете. В результате получается та канитель, которую я описал в первом посте.
Posted by alex_kh1 (Участник № / Member № 3981) on :
Вот кусочек кода для примера
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;
Posted by A40 (Участник № / Member № 3999) on :
SFC не подойдет?
Posted by Romсheg (Участник № / Member № 3792) on :
2alex_kh1:
Рекомендую попробовать на SFC это делать. Там как раз ветвление логики и шаги с условиями переходов.
Для себя в проектах подобное делаю всегда так: 1) Выполняю декомпозицию алгоритма на отдельные подфункции, которые выполняю в виде отдельных программ на FBD или ST 2) Создаю на ST некий арбитражный алгоритм, который следит за общей работой всех этих подфункций, управляя их статусами в зависимости от неких условий.
Иногда можно и как вы в примере показали делать, вот только потом разбираться в такой "портянке" ой как сложно...
Но вообще именно для этого в стандарте SFC и придумали.
Posted by alex_kh1 (Участник № / Member № 3981) on :
Да, когда искал варианты пытался применить SFC, но посчитал это бесполезной игрушкой и больше не возвращался.
Думаете можно его применить для эквивалентной замены того как я сейчас делаю, из расчета строк примерно на 500 в одной программе?
И там можно будет что-то понять, с учетом того что элементы SFC даже нельзя расположить на листе в желаемом порядке?
Posted by Romсheg (Участник № / Member № 3792) on :
Все можно, вопрос только в том - как применять. Ведь и микроскопом можно гвоздь забить.
Posted by alex_kh1 (Участник № / Member № 3981) on :
Неправильно выразился, понятно что можно, имеет ли преимущества вариант с SFC? Или же все станет еще более запутанным.
Posted by Romсheg (Участник № / Member № 3792) on :
На вкус и цвет - все фломастеры разные. Мне вот лично SFC не нравится, поэтому я им никогда не пользуюсь. Все - дело вкуса и личных ощущений в процессе эксплуатации.
Posted by alex_kh1 (Участник № / Member № 3981) on :
Ну а если не SFC и не как я, есть еще варианты? Кстати глянул SFC сейчас и не вижу возможностей:
1. Производить некую предварительную обработку набора данных, до вызова алгоритма, что бы вычисленные переменные были доступны во всех узлах и переходах. 2. Соответственно я могу изменить шаг принудительно до вызова алгоритма, реагируя на некие аварийные ситуации. И не вижу как это сделать в SFC не описывая реакцию на "аварию" во всех переходах.
т.е. не вижу некоей предобработки и постобработки.
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Топик перенесен в раздел "Пользователи для пользователей".
Posted by Abram Shnider (Участник № / Member № 4534) on :
Согласен с предложением, которое высказал Romсheg.
Для Ваших запросов будет удобнее организовать несколько программ на Техно ST, одна из которых будет отслеживать признаки перехода между ними (как вариант можно использовать канал HEX16 с использованием отдельных битов в качестве условий переходов).
Такой вариант наиболее приближен к логике дискретного автомата, да и разбираться в такой конструкции достаточно удобно)
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Можно обратить внимание на функциональный блок "Конечный автомат (SSTP)" раздела "Функции выбора" библиотеки FBD. Для его реализации нужна только комбинаторика формирования входов и декодер на выходе. Достаточно гибкая логика с памяться зашита в нем.
Posted by alex_kh1 (Участник № / Member № 3981) on :
Жаль конечно, что примеров нет, смотрю я на описание SSTP и не пойму как это можно использовать в реальных задачах, хотя модуль выглядит полезным, академически если смотреть. Наверно одного курса АСУ мало, нужен факультет АСУ )).
Posted by Romсheg (Участник № / Member № 3792) on :
alex_kh1: А тут одной математики мало будет, для того, чтобы такие алгоритмы создавать, тут решения по отладке таких монстров нужны. Я вот как раз сейчас решил две такие задачи в паре реальных проектов - ну прямо один в один ваша задача. Есть очень большое желание статью написать как я это делал и что из этого получилось. Если по времени не критично, то я думаю, что к концу следующей недели смогу вам скинуть ее для ознакомления с моим опытом реализации подобных задач.
Posted by alex_kh1 (Участник № / Member № 3981) on :
Ознакомился бы с удовольствием. Для меня работа с Trace Mode сплошная головоломка, только и придумываю как выкрутится и сделать то что в обычных средах программирования вообще вопросов бы не вызвало )). Хотя других скад не знаю, может они и все такие.
Posted by Romсheg (Участник № / Member № 3792) on :