Работа с высокочастотным таймером

ПЛК110 имеет встроенный таймер, по прерыванию которого может быть вызвана отдельная программа, не связанная с выполнением основной программы ПЛК. Пример такой программы приведен в файле «hi_timer.pro», который можно скачать в архиве «Работа с быстрыми входами/выходами по прерыванию высокочастотного таймера» в разделе «Примеры» на странице CODESYS V2 на сайте owen.ru. Перед открытием проекта его следует скопировать на жесткий диск ПК.

В программе, вызываемой по прерыванию встроенного таймера, могут обрабатываться состояния «быстрых» входов и выходов ПЛК (Fast inputs & Fast outputs). Подробно о количестве «быстрых» входов и выходов см. Руководство по эксплуатации ПЛК.

Такой режим обработки может потребоваться для задач, время обработки которых должно быть существенно меньше времени цикла ПЛК или для автоматизации объектов, критичных ко времени реакции на определенные события. Минимальный период вызовов прерываний таймера составляет 20 мкс и может быть увеличен при вызове функции инициализации (период должен быть кратен 20 мкс).

В качестве примера рассмотрим объект, требующий выключение исполнительного механизма при замыкании дискретного датчика. Датчик подключен к «быстрому» входу 1 ПЛК110, исполнительный механизм управляется «быстрым» выходом 1 того же контроллера. Также требуется вычислять, сколько таких переключений произошло между началами основных циклов ПЛК.

Для создания программы обработки прерывания таймера следует:

  1. Создать проект в CODESYS. Процедура создания описана в разделе. В примере используется контроллер ПЛК110-60.К-M. Основная программа контроллера – PLC_PRG будет написана на языке ST.

  2. Перейти на вкладку «POU» организатора объектов.

  3. Выбрать команду Добавить объект… контекстного меню вкладки «POU» организатора объектов или команду Проект → Объект → Добавить в главном меню.

  4. В открывшемся окне задать тип, имя и язык написания POU: добавляемый POU должен быть типа «Программа» (Program), имя и язык написания могут быть любыми, однако, рекомендуется использовать язык ST, что повысит скорость выполнения программы и позволит придерживаться минимального периода вызовов прерываний таймера.

    Graphic
    Добавление POU
  5. Для подключения POU к прерыванию таймера следует перейти в режим «Конфигурация задач» (Task Configuration) на вкладке «Ресурсы» организатора объектов. Откроется окно режима.

    В левой части окна режима следует выделить строку «Системные события» (System events). В правой части окна отобразится доступный для выбранного контроллера список прерываний. В списке следует выбрать прерывание «Timer» (установить флажок в поле соответствующего переключателя) и в колонке «Вызываемый POU» (called POU) указать имя созданного POU (в примере – «Timer_POU»).

    Использовать кнопку «Создать POU» (Create POU) не следует, т. к. она создает POU типа Function, а для работы требуется POU типа Program.

    Graphic
    Окно режима «Конфигурация задач» (Task Configuration)
  6. Перевести «быстрые» дискретные входы и выходы в режим прямого управления (управления из POU), так как прерывание таймера вызывается в несколько десятков раз чаще, чем происходит цикл ПЛК, и использовать в POU обработки прерываний таймера значения из области памяти ввода-вывода не имеет смысла. Для исключения ситуации, когда одним и тем же входом или выходом управляет POU обработки прерывания таймера и основная программа ПЛК, следует перевести «быстрые» входы и выходы в режим прямого управления (Direct Control mode), в котором для «быстрых» входов и выходов не выделяется каналов в памяти ввода-вывода. Для перевода выходов в режим прямого управления следует перейти в режим «Конфигурация ПЛК» (PLC Configuration) и заменить модуль «Fast Discrete Outputs» на модуль «Fast Discrete Outputs – Direct Control» и модуль «Fast Discrete Inputs» – на модуль «Fast Discrete Inputs – Direct Control».

    Graphic
    Замена модуля
    Graphic
    Результат замены модулей
  7. Подключить требуемые библиотеки. Таймер запускается из основной программы посредством вызова функции, входящей в состав библиотеки Timer.lib (одна из библиотек ОВЕН, поставляемых в комплекте с ПЛК). Работа с «быстрыми» входами и выходами из POU обработки прерываний таймера выполняется не через пространство памяти ввода-вывода, а посредством вызова функций библиотеки SysLibPorts.lib (библиотека CODESYS, поставляется в комплекте с ПЛК). Библиотеки подключаются в режиме «Менеджер библиотек (Library Manager)». Процедура подключения описана в разделе.

  8. Перейти в режим «POU», выбрать в списке POU проекта требуемое окно и написать программу обработки прерывания таймера.

    Внимание

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

    В описываемом примере программа состоит из чтения состояния «быстрых» входов функцией SysPortIn (из библиотеки SysLibPorts.lib), инвертировании прочитанного значения и передаче его в «быстрые» выходы функцией SysPortOut (см. рисунок).

    Для обеих функций работа ведется с портом 0, с младшими битами. Число ликвидных бит равно числу «быстрых» входов и выходов используемого контроллера.

    Внимание
    Во время отладки прерывания таймера запрещается использовать точку остановки (breakpoint), так как это приведет к зависанию контроллера.
    Graphic
    Программа обработки высокочастотного таймера («Timer_POU»)

    Для передачи информации о количестве срабатываний «быстрых» входов между вызовами циклов ПЛК из обработчика прерывания в основную программу используются глобальные переменные (см. рисунок). Работа с глобальными переменными ведется в режиме «Глобальные переменные» (Global Variables) организатора объектов.

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

    Graphic
    Глобальные переменные, используемые программой обработки высокочастотного таймера («Timer_POU»)
  9. Написать основную программу ПЛК, выбрав в списке объектов основную программу «PLC_PRG». В окне программы (см. рисунок) записать вызов функции инициализации прерывания таймера SetIRQ (из библиотеки Timer.lib). Аргументом функции является значение периода вызова прерывания в микросекундах (период должен быть кратен 20). Вызов функции требуется делать однократно при старте программы (пример кода представлен в проекте hi_timer.pro).

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

    Graphic
    Программа ПЛК, которая обращается к функции инициализации прерывания таймера «SetIRQ»