I1 писал(а):
ssv,
В общих чертах как работает автомат понятно. Еще бы для сравнения хотел бы увидеть автомат с большим числом состояний. (Уж я совсем обнаглею) Думаю, что сложность его не сильно увеличится по сравнению с обычной программой без применения автомата.
Пневмопривод достаточно не прихотлив, остановить его на полпути и продолжить перемещение потом - задача не для пневматики. У Вас очень хорошо показан пример для понимания принципа. Пожалуйста покажите посложнее автоматик если не затруднит. Спасибо огромное!
Смотрите что принципиально. Для понимания и осознания работы автомата не рекомендуется делать больше 7-9 состояний. Если больше - разбивайте на другие автоматы.
Важно выделять именно управляющие состояния. Я принципиально в примере увеличил типа долгое открытие... На объекте реально пневматика тупила из неосушенного воздуха поначалу работы...
Ну а вообще какие проблемы если вы придумаете больше состояний, ну к примеру РЕГУЛИРОВАНИЕ и вставите туда PIDAT. Для PIDAT сделаете отдельный автомат на применение различных настроек коэффициентов (старт, разгон, регулирование, останов и т.д.)
Вы в принципе можете хоть 100 состояний себе придумать, только вот вряд ли они будут действительно управляющими а не вычислительными.
Я для себя решил так: есть автомат режима управления, есть узлы, механизмы. Можно конечно механизмы определять в узлы и автомат для них, а можно для каждого механизма и обмен состояниями между ними. Если узел такой-то в состоянии таком-то то мы делаем такие то действия (как в примере).
Недавно участвовали в хорошем конкурсе. ТЗ писал проектный институт. Все сигналы описаны, логика работы. Сказка просто. Но вот один нюанс: вся логика очень подробно расписана что делать когда все правильно работает, двигатели запускаются, задвижки доходят до концевиков, ожидаем когда придёт сигнал готовности с весового устройства и т.д. И ни слова про то, а что делать если этих условий, признаков не произойдет. А ведь программа именно на 80% состоит из таких состояний...Т.е нам нужно добиться детерминизма, описать все возможные состояния и дать конкретное время на это исполнение и тогда ваша программа поедет как по рельсам со стрелками, и некуда будет свернуть. И все сразу заработает. Забыл что то, упустили, вкинете это условие в нужное состояние и не сломаете при этом все остальное.
Возможно вы никогда не добьётесь от Заказчика всего алгоритма в моем понимании, хотя если пойдете по таким состояниям, то сами будете прорубать и вычислять все возможные комбинации и дотошно пытать Заказчика, который даже не подозревает что все так может быть))). Но уж управляющие состояние все вычислите. И если потом на объекте вдруг что то добавиться то будите филигранно вписывать это условие в уже определенное состояние и легко ориентироваться в программе.
И правильно вы говорите, сложность не увеличится, вы как бы просто секционируете свою программу и по одной переменной контролируете все что происходит с механизмом, у вас сто механизмов, узлов, вы контролируете 100 переменных а не 100 *10=1000 разных флагов, битов по всей программе.
Внутри автомата если хотите есть действия, функции при входе, во время выполнения и на выходе из него при переходе в другое состояние.
Одно нужно помнить если пишите на Case, не важно где, в скаде, на ++ CASE перейдет в следующее состояние и выполнит условие на следующем цикле только а не в этом. Поэтому в своем примере я выполняю действия на его выходе. Т.е перехожу в другое состояние, изменяя выходы автомата (катушки) (вот и Мур). Если же я перейду по входу (условно по кнопке), а в следующем состоянии включу выходы (Мили), то они сработают только в след. цикле.
Так что при всей сложности систем разбивайте на автоматы, описывайте состояния, обменивайтесь состояниями и событиями и будет счастье. Хотя поначалу кажется все очень запутанно, все очень просто. Есть просто наши ученые, которые простые вещи объясняют очень сложным языком высшей математики...
А нам, простым смертным, остается просто очень все сделать)))
Каркас вам дал, используйте как шаблон.
Удачи.