Данный CODESYS форум содержит архивную копию русской ветви только для чтения. Для создания сообщений пожалуйста используйте актуальную международную платформу CODESYS Forum. Close

"Временные" сложности

Nekit
2007-11-17
2014-06-16
  • Nekit

    Nekit - 2007-11-17

    Здраствуйте коллеги.

    Возникли такие вопросы:

    программа написаная на SFC работает медленне чем ее аналоги на ST? Если да то почему?

    Если задачу настроить как Cyclic и задать ей времявыполнения, то что будет если задача не успеет не успеет отработать?

     
  • Igor Petrov

    Igor Petrov - 2007-11-18

    Nekit писал(а):
    программа написаная на SFC работает медленне чем ее аналоги на ST? Если да то почему?

    Как можно их сравнивать? Программа на ST (и всех языках кроме SFC) при одном ее вызове проскакивает от начала до конца (возможно разыми путями по IF ELSE) и сразу отдает управление. Программа на SFC идет с шага на шаг. Даже если в условии перехода стоит TRUE, то следующий шаг начнет работать только при следующем вызове. Обычно шаги SFC описывают некие состояния, в которых программа стоит некое время (например, пока идет перемещение до концевика и т.п.). Переход с одного шага на другой выполняется строго по рабочим циклам ПЛК (синхронно с обновлением входов/выходов). Так и задумано.

    Можно нечто подобное SFC сделать в ST (или на Си). Написать большой CASE по переменной определяющей текущий шаг. Каждая ветка CASE будет как бы шагом. В шаге делать полезную работу и вычислять новое состояние и отдавать управление (по Return). Получится упрощенное подобие SFC. (Такой прием является частью известной Switch технологии программирования.) Тут одновременно активным может быть только один единственный шаг, поэтому его номер можно задать 1 переменной.

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

    Nekit писал(а):
    Если задачу настроить как Cyclic и задать ей времявыполнения, то что будет если задача не успеет не успеет отработать?

    Возможны варианты:

    1) если наш ПЛК поддерживает вытесняющую многозадачность (система исполнения CoDeSys CSP32F), то ничего страшного не будет. Задачи с более высоким приоритетом будут спокойно ее прерывать, как им задано.

    2) если на задачу поставлен строжевой таймер, то она может быть снята, если работает дольше чем ей положено (возможно зависла).

    3) в самых простых ПЛК (не подержано 1, 2) задача будет работать сколько хочет, т.е. при ее зависании зависнет все.

    Для конкретного ПЛК его поведение в таком случае легко определить опытным путем (если не сказано в документации).

     
  • Nekit

    Nekit - 2007-11-18

    По вопросу 1: да пожалуй вопрос немного некорректен. Правилнее было бы спросить много ли времени забирает непосредственно исполнитель SFC на свою работу? Вопрос возник всвязи со следующей ситуацией: по роду работы приходится писать много драйверов для связи ПЛК с интеллектуальными устройствами. Писать их на ST довольно просто и результат (скорость работы подпрограммы драйвера) удовлетворяет, но нет "читаемости" программы, т.е. другому программисту уже нельзя сходу разобраться в коде программы и чтото поправить если нужно. Язык SFC дает "читаемость" однако нет уверенности что время работы программы на нем будет хоть сколь-нибудь приемлемым.

    По вопросу 2:

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

    По варианту 2: при срабатывании таймера задача останавливается вплоть до перезагруза ПЛК или только на текущий цикл?

    Заранее спасибо.

     
  • Igor Petrov

    Igor Petrov - 2007-11-27

    Nekit писал(а):
    …много ли времени забирает непосредственно исполнитель SFC на свою работу?…

    Чем больше диаграмма на SFC, тем соответственно больше внутренние таблицы состояний шагов и дольше их разбор. Но в сравнении с типовым временем рабочего цикла ПЛК (задачи, если они определены) – это очень малое время. Если же мы пишем на SFC, то понятно, что переход с шага на шаг в принципе будет происходить только по циклам ПЛК. Например, есть у меня задача с циклом 10 мс, в ней работает SFC программа. Допустим, исполнитель потратил 50мкс, затем за 1мс отработали действия активных шагов. Оставшееся до конца цикла задачи время ничего не делается. Просто выжидается время (или работают другие задачи)! Насколько важно здесь вообще время работы исполнителя? Мне кажется, что в не важно принципе. Будет он работать 5мкс или 500, время цикла от этого не изменится и диаграмма с шага на шаг быстрее прыгать не будет.

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

    Nekit писал(а):
    …на ST…нет "читаемости" программы…

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

    Nekit писал(а):
    …SFC дает "читаемость" однако нет уверенности что время работы программы на нем будет хоть сколь-нибудь приемлемым.

    Оно будет точно таким, как задано в цикле задачи. Не больше и не меньше.

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

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

    Nekit писал(а):
    …при срабатывании таймера задача останавливается вплоть до перезагруза ПЛК или только на текущий цикл?

    Изготовитель ПЛК может этот момент переделать, это в его руках. По умолчанию по сторожевому таймеру задачи ПЛК переходит в режим Останов. Однако прямо в CoDeSys можно написать свой обработчик события “”. В нем можно запрограммировать поведение, например продолжить работу или перезапуститься.

     
  • Nekit

    Nekit - 2007-11-27

    На самом деле с автоматного проектирования все и началось . Стоит дилема или писать все по этой методике на ST, или воспользоваться более подходящим (как мне кажется) SFC, который по сути своей является автоматом с набором конечных состояний - шагов и переходов. Вот и хочется знать, "не больно ли" переходить на SFC (немного не привычный для обычного программиста). Спасибо за полный ответ.

    С уважением Nekit.

     
  • kgb

    kgb - 2013-08-19

    Вопрос к Igor Petrov. В своей книге "Программируемые контроллеры" Вы пишете: "...В системе CoDeSys реализована невытесняющая многозадачность..." (стр.104).
    В данной теме:>Цитата:
    Возможны варианты:
    1) если наш ПЛК поддерживает вытесняющую многозадачность (система исполнения CoDeSys CSP32F), то ничего страшного не будет. Задачи с более высоким приоритетом будут спокойно ее прерывать, как им задано.

    Отсюда вопрос: Можно ли в CoDeSys реализовать нормальное аппаратное прерывание, не связанное с циклом исполнения ПЛК, и какие контроллеры поддерживают такую функцию?

     
  • kgb

    kgb - 2013-08-19

    Простите, имелось ввиду в CoDeSys 2.3.

     
  • Igor Petrov

    Igor Petrov - 2013-08-19

    kgb писал(а):
    В своей книге "Программируемые контроллеры" Вы пишете: "...В системе CoDeSys реализована невытесняющая многозадачность..." (стр.104).

    Книга устарела. Особенно этот раздел.

    В CODESYS Control входит обязательный компонент – планировщик задач. Его можно настраивать под разное железо. Во встраиваемых системах (без ОС) используется планировщик без вытеснения. В прошлом веке это был типовой вариант. В современных ПЛК, как правило, есть ОС и есть реальная МЭК многозадачность.

    Вызов задачи можно связать с событием (аппаратным или программным). В 2.3 работает. Во многих контроллерах есть быстрые входы. См. конфиг. задач – по событию.

     
  • kgb

    kgb - 2013-08-20

    Спасибо за ответ, пусть даже и упрощенный. Наверное - каков вопрос...
    Я в курсе про планировщик задач и обработчик событий.
    У того же Овена есть быстрые входы, но документация (ПЛК1хх) описывает их только как аппаратный счетчик или обработчик сигналов энкодера. Где то в примерах описывается возможность чтения их напрямую вне цикла, и ни слова о использовании таких входов, как событие вызывающее выполнение задачи.
    Отсюда вопрос: Контроллеры каких производителей, работающих со средой CoDeSys, или ее полноценного аналога, могут использовть физический вход, как сигнал первоочередного вызова конкретной задачи ( в общем использовать сигнал как прерывание).

    P.S. А о книге, Вы зря так. Книги не стареют, хотя и нуждаются в корректировке.

     
  • Igor Petrov

    Igor Petrov - 2013-08-20

    Более глубокий ответ требует уточнения. Если Вы изготовитель контроллера, то для своих внутренних целей, Вы можете в CODESYS сделать нормальный обработчик аппаратного прерывания. Например, некоторые стеки полевых сетей требуют этого. Обработчики прерываний всегда пишутся специальным образом с жесткими ограничениями иначе можно обрушить всю систему. Выносить их в прикладную программу ПЛК нельзя. Ни в одном ПЛК Вы не найдете возможности обработки аппаратного прерывания в прикладной МЭК задаче.

    Быстрый вызов прикладных задач по событиям могут все контроллеры с CODESYS, если изготовитель включил соответствующие события в прошивку и таргет. Даже простенькие ПЛК Frenzel Berg это умеют. У Овен 100% есть обработка событий. Вопрос только в их составе в разных моделях. Нужно смотреть список событий конкретного ПЛК или уточнять у изготовителя. Все МЭК задачи вызывает планировщик, циклические по таймерам, событийные по соответствующим событиям. Хороший планировщик может быстро обнаружить событие (по прерыванию или иным способом) корректно прервать работу активных задач и вызвать соответствующую задачу.

     
  • kgb

    kgb - 2013-08-22

    Спасибо! Теперь туман немного рассеялся.

     
  • ajonta

    ajonta - 2014-06-11

    Добрый день! Подскажите, пожалуйста, как в Codesys можно проверить переменная увеличивается или уменьшается?

     
  • Igor Petrov

    Igor Petrov - 2014-06-16

    Перейти в режим Онлайн и посмотреть глазами как изменяется значение.