Многозадачность и языки МЭК |
Ответить | Страница 123 5> |
Автор | |
Действительный член Присоединился: 29 Январь 2004 Категория: Russian Federation Online Status: Offline Публикации: 293 |
Опубликовано: 08 Январь 2007 15:37 |
'Классические' программы для ПЛК пишутся в виде одной циклической задачи. Чтение входов, обработка (прикладная программа), запись выходов.
Но во многих современных средах МЭК 61131-3 программирования можно делать несколько циклических задач. Некоторые называют это вредным и опасным, другие напротив считают очень удобным. Имеет ли кто-либо позитивный опыт написания таких программ? Поделитесь опытом. До каких пор это хорошо и где лежит порог за которым нужно использовать более радикальные средства (например QNX)? |
|
Igor Petrov
|
|
Участник Присоединился: 12 Апрель 2005 Online Status: Offline Публикации: 78 |
|
Насколько знаю у B&R System 2000 является многозадачной, завтра уточню и вроде дока на русском была как раз по операционной системе контроллеров (она у них собственная) попробую вам слить |
|
Действительный член Присоединился: 14 Январь 2005 Категория: Russian Federation Online Status: Offline Публикации: 322 |
|
Порог за которым требуется многозадачность (в простейшем случае прерывания) зависит от требования по быстродействию. Для тепловых процессов даже на самом медленном контроллере многозадачности никакой не надо. А вот если одновременно с этим нужно еще формировать импульсы определенной длительности, тут уже стоит призадуматься, успеет-ли циклический алгоритм. |
|
Сергей
|
|
Действительный член Присоединился: 29 Январь 2004 Категория: Russian Federation Online Status: Offline Публикации: 293 |
|
А если медленных процессов несколько и они слабосвязанные, например один процесс дает только несколько параметров, которые нужно учитывать в другом процессе? Либо нужно периодически собирать данные с нескольких процессов, неспешно пересчитывать их в форму пригодную для отображения и отправлять на панель по ее медленному последовательному протоколу. Напрашивается сделать это все отдельными задачами. Не бывает такого? |
|
Igor Petrov
|
|
Действительный член Присоединился: 27 Сентябрь 2006 Online Status: Offline Публикации: 125 |
|
1. Действительно, для быстрых задач хороши прерывания. Особенно, если предусмотрены группы приоритетов. 2. Если надо быстро среагировать, например, на входное сообщение, удобны т. называемые Backup функции, т.е. регистрируешь необходимый обработчик, а система его вызывает в нужный момент. Если дело происходит на компьютере (разные thread'ы), то, возможно, понадобится синхронизация, т.к. обработчик и гл. программа могут обращаться по одному и тому же адресу. 3. Если уж упомянут МЭК, то прекрасное (хотя бывают кучи ограничений) средство - Графсет (извините, по-французски). Во-первых можно сделать несколько графов. Во-вторых, в графе можно запустить параллельные ветви. Наконец, в любом месте несколько блоков могут быть активны, т.е. псевдо-многозадачность. Что касается организации, то надо предусмотреть сброс в исх. состояние (сторожевой таймер, ошибки) и, например, работа оборудования в ручном режиме. |
|
Действительный член Присоединился: 27 Сентябрь 2006 Online Status: Offline Публикации: 125 |
|
Извините за английскую ошибку: функции называются не Backup, а Callback (напридумывают терминов, уж лучше бы горшком назвали...)
|
|
Участник Присоединился: 14 Январь 2005 Категория: Russian Federation Online Status: Offline Публикации: 69 |
|
Конечно бывает. Однако, по-моему, исполнение программы в цикле ПЛК "чтение-обработка-запись" как раз и подразумевает, что каждая секция или блок программы выполняется параллельно с остальными при неизменном состоянии объекта управления. А уж взаимодействие параллельно работающих программ - вопрос компетенции программиста. По крайней мере, мы в своих программах выделяем блок обработки аналоговых входов, а во всех остальных блоках используем преобразованные величины. При этом, например при слишком большой длительности рабочего цикла ПЛК, имеется возможность обрабатывать аналоговые входы по частям (первая треть - вторая треть - последняя треть) |
|
Иван Данилушкин
|
|
Профили участников
Послать частное письмо
Поиск публикаций участников
Посетить домашнюю страницу участника
Добавить в список приятелей
Действительный член Присоединился: 14 Май 2003 Online Status: Offline Публикации: 770 |
|
Я бы не рекомендовал пользоваться многозадачностью без веских на то оснований. В большинстве приложений вполне достаточно одного процесса, в крайнем случае можно использовать прерывания. На практике, даже достаточно сложные алгоритмы можно разбить на последовательность элементарных операций, которые можно выполнять в рамках одного цикла сканирования в контроллере. Приведенный Вами пример, как раз, относится к такому классу. К примеру, на очередном цикле выполняется пересчет данных, на следующем - запись нескольких байт по флагу готовности в регистр последовательного порта, на следующем операция повторяется, если данные в выходном буфере не исчерпаны... И так - пока вся посылка не будет передана полностью. Затем можно снова вернуться к пересчету. В более сложных случаях можно использовать прерывания. К примеру, необходимо осуществлять управление достаточно динамичным объектом по ПИД закону. В таком случае, можно разрешить прерывание, возникающее раз в N миллисекунд, и назначить ему обработчик, выполняющий вычисление регулирующего воздействия. Использование многозадачности (особенно вытесняющей) сопряжено с разнообразными тонкостями, связанными с синхронизацией процессов в контроллере, и я бы рекомендовал, в случае такой необходимости, обратиться к профессиональному программисту, имеющему опыт создания подобных программ. В качестве примера я могу привести приложения, в которых необходимо выполнять достаточно длительные операции, занимающие неизвестное заранее время, и которые нельзя разбить на более элементарные действия - например, запись в файл; но при этом нельзя надолго прерывать цикл управления. В таком случае, необходимо создать процесс, выполняющий запись в файл, и назначить ему младший приоритет. Собственно процесс управления выполняется циклически через определенные промежутки времени, и имеет старший приоритет. Данные, подлежащие записи, передаются более приоритетным процессом в специальный буфер обмена, организованный в виде очереди. Из очереди данные считываются менее приоритетным процессом и записываются в файл. Доступ к этому буферу регулируется, например, семафором, чтобы предотвратить одновременный доступ обоих процессов к этому ресурсу... Хочу отметить, что в моей практике пока не встречалось случаев, когда вставала бы необходимость использовать в МЭК-приложении несколько процессов. Хотя средства для этого в современных контроллерах имеются. Так, например, в 750-841 реализована вытесняющая многозадачность. |
|
Инженер-системотехник
+7 (916) 477 3925 |
|
Действительный член Присоединился: 29 Январь 2004 Категория: Russian Federation Online Status: Offline Публикации: 293 |
|
Спасибо за ответы! Все верно, но действительно, многозадачность уже реализована и у многих руки чешутся ее использовать, в том числе на контроллерах Wago. Однако, даже хорошо зная как этот механизм устроен внутри, я не всегда могу сходу сообразить какие последствия могут дать те или иные действия в прикладной программе. Хотелось бы найти или выработать некий перечень правил: делайте так и так, иначе будет это и это… Для МЭК систем наверное такой информации пока нет. Может быть опытные QNX программисты смогут дать ссылку, где толково объяснено что и как, понятным языком с примерами на С? Я бы попробовал переработать этот материал применительно к МЭК системам и предложил для обсуждения. |
|
Igor Petrov
|
|
Действительный член Присоединился: 01 Июнь 2006 Категория: Russian Federation Online Status: Offline Публикации: 464 |
|
ИМХО, во многом все-таки все зависит от среды исполнения. При корректной реализации доступа к разделяемым ресурсам (глобальным переменным) издержки при совместном доступе обычно значительно ниже, чем остановка выполнения основного кода программы и вызова POU по прерыванию. Насколько я понимаю, проблемы совместного доступа в CoDeSys призвана помочь решить библиотека SysLibSem.lib. Которая позволяет обеспечить последовательный доступ к разделяемым ресурсам, единственное разумное правило на мой взгляд которое требуется здесь, заключается в том, что не следует блокировать доступ к разделяемым ресурсам на время большее чем необходимо доступа к ним на чтение или запись. То есть не следует устанавливать семафор в начале POU к примеру если Вы обратитесь к ней только в конце, иначе процесс будет удерживать блокировку все время выполнения программы. Я давно мучаю WAGO 750-841 как раз на предмет совместного доступа, вопрос о необходимости использования семафоров пока так и остался открытым, конечно я не писал многометровых листингов, но серьезных сбоев при обращениях из разных процессов к одной переменной мне так и не удалось увидеть, даже без семафоров. При доступе к переменным типа BOOL ИМХО регулирование доступа вообще теряет смысл, потому как “… пол мальчика не продается…”. В остальном, просто следует учитывать, что “процесс” в объектно ориентированной среде тоже должен рассматриваться как объект и устойчивость совокупности происходящих в нем переходов не должна зависеть от комбинаций состояний разделяемых ресурсов, в противном случае критический ресурс должен быть в самом процессе. То есть продумать декомпозицию необходимо. Вообще, на мой взгляд весьма полезно почитать Гради Буча “Объектно-ориентированный анализ и проектирование”. Книга в общем то не о многозадачности но концептуально подразумевается что подход как раз и должен обеспечивать стабильность как раз в этом случае… |
|
Ответить | Страница 123 5> |
Переход на форум | Права доступа на форуме Вы не можете публиковать новые темы в этом форуме Вы не можете отвечать на сообщения в этом форуме Вы не можете удалять Ваши сообщения на этом форуме Вы не можете редактировать Ваши сообщения на этом форуме Вы не можете создавать голосования на этом форуме Вы не можете выражать своё мнение в голосованиях на этом форуме |