Современные технологии автоматизации» («СТА») —  журнал для квалифицированных специалистов по промышленной автоматизации Форум СТА — современные технологии автоматизации Домашняя страница
Домашняя страница форума CTA Домашняя страница форума CTA > II. АСУТП и SCADA > Программное обеспечение
  Активные темы Активные темы
  FAQ FAQ  Искать в форуме   Зарегистрироваться Зарегистрироваться  Вход в систему Вход в систему

Многозадачность и языки МЭК

 Ответить Ответить Страница  123 5>
Автор
Сообщение
_IP_ Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 29 Январь 2004
Категория: Russian Federation
Online Status: Offline
Публикации: 293
Свойства публикации Свойства публикации   Ответить, цитируя автора - _IP_ Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Тема сообщения: Многозадачность и языки МЭК
    Опубликовано: 08 Январь 2007 15:37
'Классические' программы для ПЛК пишутся в виде одной циклической задачи. Чтение входов, обработка (прикладная программа), запись выходов.
Но во многих современных средах МЭК 61131-3 программирования можно делать несколько циклических задач. Некоторые называют это вредным и опасным, другие напротив считают очень удобным.
Имеет ли кто-либо позитивный опыт написания таких программ? Поделитесь опытом. До каких пор это хорошо и где лежит порог за которым нужно использовать более радикальные средства (например QNX)?
Igor Petrov
Наверх
evgeny Смотреть выпадающим
Участник
Участник


Присоединился: 12 Апрель 2005
Online Status: Offline
Публикации: 78
Свойства публикации Свойства публикации   Ответить, цитируя автора - evgeny Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 08 Январь 2007 18:25

Насколько знаю у B&R System 2000 является многозадачной, завтра уточню и вроде дока на русском была как раз по операционной системе контроллеров (она у них собственная) попробую вам слить

Наверх
s_smirnov Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 14 Январь 2005
Категория: Russian Federation
Online Status: Offline
Публикации: 322
Свойства публикации Свойства публикации   Ответить, цитируя автора - s_smirnov Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 08 Январь 2007 19:36

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

Сергей
Наверх
_IP_ Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 29 Январь 2004
Категория: Russian Federation
Online Status: Offline
Публикации: 293
Свойства публикации Свойства публикации   Ответить, цитируя автора - _IP_ Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 09 Январь 2007 11:25
Первоначально опубликовано s_smirnov

Порог за которым требуется многозадачность (в простейшем случае прерывания) зависит от требования по быстродействию...

А если медленных процессов несколько и они слабосвязанные, например один процесс дает только несколько параметров, которые нужно учитывать в другом процессе? Либо нужно периодически собирать данные с нескольких процессов,  неспешно пересчитывать их в форму пригодную для отображения и отправлять на панель по ее медленному последовательному протоколу. Напрашивается сделать это все отдельными задачами. Не бывает такого?

Igor Petrov
Наверх
Kanzi Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 27 Сентябрь 2006
Online Status: Offline
Публикации: 125
Свойства публикации Свойства публикации   Ответить, цитируя автора - Kanzi Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 09 Январь 2007 12:46

1. Действительно, для быстрых задач хороши прерывания. Особенно, если предусмотрены группы приоритетов.

2. Если надо быстро среагировать, например, на входное сообщение, удобны т. называемые Backup функции, т.е. регистрируешь необходимый обработчик, а система его вызывает в нужный момент. Если дело происходит на компьютере (разные thread'ы), то, возможно, понадобится синхронизация, т.к. обработчик и гл. программа могут обращаться по одному и тому же адресу.

3. Если уж упомянут МЭК, то прекрасное (хотя бывают кучи ограничений) средство - Графсет (извините, по-французски). Во-первых можно сделать несколько графов. Во-вторых, в графе можно запустить параллельные ветви. Наконец, в любом месте несколько блоков могут быть активны, т.е. псевдо-многозадачность. Что касается организации, то надо предусмотреть сброс в исх. состояние (сторожевой таймер, ошибки) и, например, работа оборудования в ручном режиме.

Наверх
Kanzi Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 27 Сентябрь 2006
Online Status: Offline
Публикации: 125
Свойства публикации Свойства публикации   Ответить, цитируя автора - Kanzi Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 09 Январь 2007 13:10
Извините за английскую ошибку: функции называются не Backup, а Callback (напридумывают терминов, уж лучше бы горшком назвали...)
Наверх
D. Ushkin Смотреть выпадающим
Участник
Участник
Аватар

Присоединился: 14 Январь 2005
Категория: Russian Federation
Online Status: Offline
Публикации: 69
Свойства публикации Свойства публикации   Ответить, цитируя автора - D. Ushkin Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 09 Январь 2007 15:47
Первоначально опубликовано _IP_

[QUOTE=s_smirnov]

А если медленных процессов несколько и они слабосвязанные, например один процесс дает только несколько параметров, которые нужно учитывать в другом процессе? Либо нужно периодически собирать данные с нескольких процессов,  неспешно пересчитывать их в форму пригодную для отображения и отправлять на панель по ее медленному последовательному протоколу. Напрашивается сделать это все отдельными задачами. Не бывает такого?

Конечно бывает. Однако, по-моему, исполнение программы в цикле ПЛК "чтение-обработка-запись" как раз и подразумевает, что каждая секция или блок программы выполняется параллельно с остальными при неизменном состоянии объекта управления. А уж взаимодействие параллельно работающих программ - вопрос компетенции программиста.

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

Иван Данилушкин
Наверх
Максим Ананских Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 14 Май 2003
Online Status: Offline
Публикации: 770
Свойства публикации Свойства публикации   Ответить, цитируя автора - Максим Ананских Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 17 Январь 2007 19:21

Первоначально опубликовано _IP_

А если медленных процессов несколько и они слабосвязанные, например один процесс дает только несколько параметров, которые нужно учитывать в другом процессе? Либо нужно периодически собирать данные с нескольких процессов,  неспешно пересчитывать их в форму пригодную для отображения и отправлять на панель по ее медленному последовательному протоколу. Напрашивается сделать это все отдельными задачами. Не бывает такого?

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

На практике, даже достаточно сложные алгоритмы можно разбить на последовательность элементарных операций, которые можно выполнять в рамках одного цикла сканирования в контроллере. Приведенный Вами пример, как раз, относится к такому классу. К примеру, на очередном цикле выполняется пересчет данных, на следующем - запись нескольких байт по флагу готовности в регистр последовательного порта, на следующем операция повторяется, если данные в выходном буфере не исчерпаны... И так - пока вся посылка не будет передана полностью. Затем можно снова вернуться к пересчету.

В более сложных случаях можно использовать прерывания. К примеру, необходимо осуществлять управление достаточно динамичным объектом по ПИД закону. В таком случае, можно разрешить прерывание, возникающее раз в N миллисекунд, и назначить ему обработчик, выполняющий вычисление регулирующего воздействия.

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

Хочу отметить, что в моей практике пока не встречалось случаев, когда вставала бы необходимость использовать в МЭК-приложении несколько процессов. Хотя средства для этого в современных контроллерах имеются. Так, например, в 750-841 реализована вытесняющая многозадачность.

Инженер-системотехник
+7 (916) 477 3925
Наверх
_IP_ Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 29 Январь 2004
Категория: Russian Federation
Online Status: Offline
Публикации: 293
Свойства публикации Свойства публикации   Ответить, цитируя автора - _IP_ Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 17 Январь 2007 20:30
Первоначально опубликовано Максим Ананских

...Использование многозадачности (особенно вытесняющей) сопряжено с разнообразными тонкостями, связанными с синхронизацией процессов в контроллере...

Спасибо за ответы!

Все верно, но действительно, многозадачность уже реализована и у многих руки чешутся ее использовать, в том числе на контроллерах Wago. Однако, даже хорошо зная как этот механизм устроен внутри, я не всегда могу сходу сообразить какие последствия могут дать те или иные действия в прикладной программе. Хотелось бы найти или выработать некий перечень правил: делайте так и так, иначе будет это и это… Для МЭК систем наверное такой информации пока нет. Может быть опытные QNX программисты смогут дать ссылку, где толково объяснено что и как, понятным языком с примерами на С?

Я бы попробовал переработать этот материал применительно к МЭК системам и предложил для обсуждения.
Вообще то, что мы имеем в МЭК системах для ПЛК, надо называть многопоточностью а не многозадачностью. Так?

Igor Petrov
Наверх
Dismay Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 01 Июнь 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 464
Свойства публикации Свойства публикации   Ответить, цитируя автора - Dismay Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 18 Январь 2007 06:42

ИМХО, во многом все-таки все зависит от среды исполнения. При корректной реализации доступа к разделяемым ресурсам (глобальным переменным) издержки при совместном доступе обычно значительно ниже, чем остановка выполнения основного кода программы и вызова POU по прерыванию. Насколько я понимаю, проблемы совместного доступа в CoDeSys призвана помочь решить библиотека SysLibSem.lib. Которая позволяет обеспечить последовательный доступ к разделяемым ресурсам, единственное разумное правило на мой взгляд которое требуется здесь, заключается в том, что не следует блокировать доступ к разделяемым ресурсам на время большее чем необходимо доступа к ним на чтение или запись. То есть не следует устанавливать семафор в начале POU к примеру если Вы обратитесь к ней только в конце, иначе процесс будет удерживать блокировку все время выполнения программы. Я давно мучаю WAGO 750-841 как раз на предмет совместного доступа, вопрос о необходимости использования семафоров пока так и остался открытым, конечно я не писал многометровых листингов, но серьезных сбоев при обращениях из разных процессов к одной переменной мне так и не удалось увидеть, даже без семафоров. При доступе к переменным типа BOOL ИМХО регулирование доступа вообще теряет смысл, потому как “… пол мальчика не продается…”. В остальном, просто следует учитывать, что “процесс” в объектно ориентированной среде тоже должен рассматриваться как объект и устойчивость совокупности происходящих в нем переходов не должна зависеть от комбинаций состояний разделяемых ресурсов, в противном случае критический ресурс должен быть в самом процессе. То есть продумать декомпозицию необходимо. Вообще, на мой взгляд весьма полезно почитать Гради Буча “Объектно-ориентированный анализ и проектирование”. Книга в общем то не о многозадачности но концептуально подразумевается что подход как раз и должен обеспечивать стабильность как раз в этом случае…

Наверх
 Ответить Ответить Страница  123 5>

Переход на форум Права доступа на форуме Смотреть выпадающим

Bulletin Board Software by Web Wiz Forums® version 9.64
Powered by Web Wiz Forums Free Express Edition
Copyright ©2001-2009 Web Wiz