PDA

Просмотр полной версии : Вопросы по переводу алгоритма из блок-схемы в язык ST



Вова
11.04.2011, 15:51
Deleted by request

swerder
11.04.2011, 16:00
может это не мое дело, но описывать алгоритмические последовательности на st не самый лучший вариант. нет, кончено, если очень хочется, то и на st можно все реализовать, правда мне кажется, что это не будет выглядеть оптимально/красиво.
подпрограммы в одну строку такими и останутся? в таком случае можно и без них обойтись. в остальном - на вкус и цвет...

Вова
11.04.2011, 16:12
может это не мое дело, но описывать алгоритмические последовательности на st не самый лучший вариант. нет, кончено, если очень хочется, то и на st можно все реализовать, правда мне кажется, что это не будет выглядеть оптимально/красиво.
Согласен, потому и спрашиваю, как можно структуризировать программу.
Графические языки очень не хочется использовать... Мне текст как-то намного понятнее сходу...


подпрограммы в одну строку такими и останутся? в таком случае можно и без них обойтись. в остальном - на вкус и цвет...
Нет, это очень упрощенный вариант, будет побольше строк. Иначе и не стал бы городит огород :)

Pointer
11.04.2011, 16:21
написал алгоритм работы в виде блок-схемы...

Начал писать программу по алгоритму. Язык - ST. Теперь вопросы.
1. Насколько я понимаю, по алгоритму нужно реализовать машину состояний, минимизировав их количество?

Почитайте о языке SFC...по моему это под вашу задачу и мышление...
ЗЫ.. ну если очень не нравятся графические языки ;-) то почитайте о switch-программировании...

swerder
11.04.2011, 16:34
как можно структуризировать программу.

задачу управления автооператором структурировать можно, по моему мнению (также занимаюсь электрохимией в ваннах с автооператорами), используя упомянутый выше SFC. но если душа лежит к st, а к графическим жесткое отвращение - то все в ваших руках, нет ничего невозможного.
хотя если посмотреть на картинки вашей блок-схемы и сравнить с языком SFC..., то угадайте на что будут похожи картинки?)

Вова
11.04.2011, 17:17
задачу управления автооператором структурировать можно, по моему мнению (также занимаюсь электрохимией в ваннах с автооператорами), используя упомянутый выше SFC. но если душа лежит к st, а к графическим жесткое отвращение - то все в ваших руках, нет ничего невозможного.
хотя если посмотреть на картинки вашей блок-схемы и сравнить с языком SFC..., то угадайте на что будут похожи картинки?)
Да я сразу и подумал, что алгоритм очень похож на этот язык :) И не то, чтобы испытываю отвращение к графическим языкам, просто привык к тексту, как-то он понятнее для меня.

Почитайте о языке SFC...по моему это под вашу задачу и мышление...
ЗЫ.. ну если очень не нравятся графические языки ;-) то почитайте о switch-программировании...
Спасибо, почитаю. Но всё же ещё раз главный вопрос - если писать на st, то всю логику нужно будет держать в одной простыне текста, так?

Pointer
11.04.2011, 17:30
Создайте нужное количество функциональных блоков (типа подпрограмм) и работайте с ними из основной программы... В документации всё это есть, а на каком языке вы будете создавать функциональные блоки - не важно...

Вова
11.04.2011, 17:49
Тогда ещё два вопроса
1. В функциональном блоке или программе, отличной от главной, можно оставаться неограниченно долго? Так, чтобы ПЛК в циклах обрабатывал лишь действия, описанные в этом блоке/программе?
2. Если можно, то как вернуться, когда нужно, в основную программу?
У меня сложилось мнение, что в функциональных блоках/программах нельзя задерживаться долго, там можно делать как можно более короткие операции (типа как прерывания в микроконтроллерах).

swerder
11.04.2011, 18:20
надо описать условия возврата в основную прогу, а потом хоть всю работу выполнять в этом ФБ

Pointer
11.04.2011, 18:22
У меня сложилось мнение, что в функциональных блоках/программах нельзя задерживаться долго, там можно делать как можно более короткие операции (типа как прерывания в микроконтроллерах).
Типа того...
ВСЕ блоки обрабатываются за один цикл ПЛК... их нельзя останавливать, приостанавливать и т.п... можно только передавать параметры и получать результат... Почитайте побольше о принципах фунициклирования ПЛК...
Хотя существуют ПЛК, где довольно гибко можно работать и с внешними прерываниями, и с прерываниями по таймеру...

Вова
12.04.2011, 09:49
надо описать условия возврата в основную прогу, а потом хоть всю работу выполнять в этом ФБ
Не понимаю. Если я вызвал функциональный блок, то управление передаётся в него, это понятно. Но разве по выполнению всех строк блока управление не передаётся в основную программу? Не могли бы вы на примере моей программы показать, как оформить обработку нажатия кнопки _влево_ в виде функционального блока, передать ему управление целиком и пример условия возврата в основную программу? Спасибо заранее.

swerder
12.04.2011, 13:14
Не понимаю. Если я вызвал функциональный блок, то управление передаётся в него, это понятно. Но разве по выполнению всех строк блока управление не передаётся в основную программу?
если ФБ из одной строки вида
out:=in1+in2;
то да, надолго тут не задержишься.
если же у вас в ФБ описан алгоритм (на SFC) подготовки космического корабля к запуску в долгий полет, по окончании которого ФБ радостно рапортует о проделанной работе, то тут придется задержаться, и чтоб в случае чего прервать этот алгоритм надо описать условия преждевременного завершения
управление туда, управление сюда... если вызывается ФБ это еще не значит, что в основной программе в этот момент нельзя производить никаких действий. контроллер все равно обрабатывает весь код.
вот слабо, но на вашем примере - в каком-то ФБ идет обработка каких-либо условий и выполнение каких-либо действий. а если в этот момент произошел сбой, АО съехал с рельс (просто для примера). где будет сидеть код обработки этой ошибки, в ФБ, в основной программе? если в основной, то по вашим словам вы все управление передаете в ФБ. так можно и установку сломать. а если обработка в ФБ, то что же вы будете 1 и тот же код пихать во все ФБ?

Вова
12.04.2011, 13:40
управление туда, управление сюда... если вызывается ФБ это еще не значит, что в основной программе в этот момент нельзя производить никаких действий. контроллер все равно обрабатывает весь код.

Мне просто казалось, что в конкретный цикл контроллер обрабатывает одну задачу (если в ней идёт вызов других, то и их тоже, конечно). А далее - по условию, т.е. если одна программа, то в следующем цикле - тот же CASE, если используется несколько задач, то будет вызов задачи циклически либо по событию. Но я правильно понимаю, что в одном цикле обрабатывается только одна задача, или нет?

swerder
12.04.2011, 14:37
Но я правильно понимаю, что в одном цикле обрабатывается только одна задача, или нет?

нет. в каждом цикле ПЛК опрашивает входы, обрабатывает всю программу пользователя, записывает выходы, (передает данные по сети)

То есть обработка будет в отдельной программе, но вызываться она будет немедленно, а так как во всех задачах у меня нет длительных ожиданий чего-либо, то думаю обработка аварийной ситуации не доставит трудностей.
т.е. обработка ошибок в подпрограмме, которая вызывается только по окончании какой либо задачи? а если задача все же затянется?

Вова
12.04.2011, 15:00
нет. в каждом цикле ПЛК опрашивает входы, обрабатывает всю программу пользователя, записывает выходы, (передает данные по сети)
Так а если у меня все подпрограммы вызываются либо из основной программы, либо по внешнему событию, на основании чего ПЛК будет их обрабатывать, если они не вызываются в конкретный цикл ниоткуда?

swerder
12.04.2011, 17:01
Так а если у меня все подпрограммы вызываются либо из основной программы, либо по внешнему событию, на основании чего ПЛК будет их обрабатывать, если они не вызываются в конкретный цикл ниоткуда?
это как загадка «Слышен ли звук падающего дерева в лесу, если рядом никого нет?»:)
не вызываем - не обрабатывает. а как проверить что не обрабатывает?:)
p.s. надо сделать уточнение - под "обрабатывает всю" я имел ввиду не то, что прямо производит вычисления, действия если подпрога не вызвана, а что просто пробегается по простыне кода

Вова
12.04.2011, 17:53
под "обрабатывает всю" я имел ввиду не то, что прямо производит вычисления, действия если подпрога не вызвана, а что просто пробегается по простыне кода
А зачем это, зачем терять процессорное время, если действия и вычисления не производятся?
И, как процессор может "пробежаться" по коду, не исполняя его?

Pointer
12.04.2011, 18:48
Для того, что бы не пропустить никакого изменения в переменных...и не важно входа это или регистры, таймеры или счётчики....

Алексей Дмитриев
18.04.2011, 23:22
Господа, может конечно я чего не понял, но
http://i017.radikal.ru/1104/de/bdce404a4556.jpg (http://www.radikal.ru)
Пишем на LD 14...20 цепочек и вуаля, зачем так сложно-то. Почитайте литературу по контроллерам (PLC) для начинающих.

Игорь Петров
17.05.2011, 12:46
Хорошая работа!

Используйте многозадачность для эмулятора. Обычно параллельно с рабочей программой, прямо в CoDeSys мы запускаем программу эмулирующую объект. В старые времена (до CoDeSys) делали подобные внешние эмуляторы.

swerder
19.05.2011, 15:28
кажется кусочек потерялся)

swerder
19.05.2011, 18:29
извините, у меня картинки не отображались)