This is topic Поделитесь идеями, кто как реализует алгоритмы? in forum Общие вопросы / Common questions at Форум TRACE MODE: техническая поддержка.


To visit this topic, use this URL:
http://forum.adastra.ru/ultimatebb.php/ubb/get_topic/f/45/t/000176.html

Posted by alex_kh1 (Участник № / Member № 3981) on :
 
Проблема заключается в том, что 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 и придумали. [Пдмигивание / Wink]
 
Posted by alex_kh1 (Участник № / Member № 3981) on :
 
Да, когда искал варианты пытался применить SFC, но посчитал это бесполезной игрушкой и больше не возвращался.

Думаете можно его применить для эквивалентной замены того как я сейчас делаю, из расчета строк примерно на 500 в одной программе?

И там можно будет что-то понять, с учетом того что элементы SFC даже нельзя расположить на листе в желаемом порядке?
 
Posted by Romсheg (Участник № / Member № 3792) on :
 
Все можно, вопрос только в том - как применять. [Улыбка / Smile] Ведь и микроскопом можно гвоздь забить.
 
Posted by alex_kh1 (Участник № / Member № 3981) on :
 
Неправильно выразился, понятно что можно, имеет ли преимущества вариант с SFC? Или же все станет еще более запутанным.
 
Posted by Romсheg (Участник № / Member № 3792) on :
 
На вкус и цвет - все фломастеры разные. [Усмешка / Big Grin]
Мне вот лично SFC не нравится, поэтому я им никогда не пользуюсь. Все - дело вкуса и личных ощущений в процессе эксплуатации.
 
Posted by alex_kh1 (Участник № / Member № 3981) on :
 
Ну а если не SFC и не как я, есть еще варианты?
Кстати глянул SFC сейчас и не вижу возможностей:

1. Производить некую предварительную обработку набора данных, до вызова алгоритма, что бы вычисленные переменные были доступны во всех узлах и переходах.
2. Соответственно я могу изменить шаг принудительно до вызова алгоритма, реагируя на некие аварийные ситуации. И не вижу как это сделать в SFC не описывая реакцию на "аварию" во всех переходах.

т.е. не вижу некоей предобработки и постобработки.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Топик перенесен в раздел "Пользователи для пользователей".
 


Новости АСУ ТП / News | SCADA / HMI | Обучение / Trainings | Свяжитесь с нами / Contact Us



Powered by Infopop Corporation
UBB.classic™ 6.7.2