Меню

Генератор импульсов в codesys

Структура программного кода и практическое использование блока «Функциональный генератор» при программировании в среде CoDeSys

Рубрика: Технические науки

Дата публикации: 14.04.2014 2014-04-14

Статья просмотрена: 3504 раза

Библиографическое описание:

Поздняков, А. Г. Структура программного кода и практическое использование блока «Функциональный генератор» при программировании в среде CoDeSys / А. Г. Поздняков, В. Х. Аль-Тибби. — Текст : непосредственный // Молодой ученый. — 2014. — № 5 (64). — С. 88-93. — URL: https://moluch.ru/archive/64/10266/ (дата обращения: 09.09.2021).

Введение, постановка проблемы. Современное производство предъявляет все более высокие требования к инструментам управления, контроля и автоматики. Персональные компьютеры применяются в настоящее время на всех уровнях промышленной автоматизации. Для большинства задач автоматизации применение промышленных ПК не оправдано экономически и технически сложно. Решать задачи автоматизации максимально просто, в кратчайшие сроки и с минимальным привлечением специалистов в области прикладного и системного программного обеспечения позволяют программируемые логические контроллеры (ПЛК). ПЛК — это программно управляемый дискретный автомат, имеющий некоторое множество вхо­дов, подключенных посредством датчиков к объекту управления, и множество выходов, подключенных к исполнительным устройствам. ПЛК контролирует состояния входов и вырабатывает опре­деленные последовательности программно заданных действий, от­ражающихся в изменении выходов. ПЛК предназначен для работы в режиме реального времени в условиях промышленной среды и должен быть доступен для про­граммирования неспециалистом в области информатики [1].

Программирование большинства современных ПЛК осуществляется на языках стандарта международной электротехнической комиссии (МЭК) 61131 [2]. Стандарт содержит описание аппаратных средств, требования к мон­тажу, тестированию, документации и связи по промышленной сети. Часть 3 стандарта описывает требования к языкам программирования, всего таких языков описывается пять: IL – ассемблероподобный текстовый язык; LD – графический язык релейно-контактных схем; ST – паскалеподобный текстовый язык; FBD – графический язык функциональных блоков; SFC – графический язык последовательных функциональных схем. Для программиро­вания ПЛК не требуется знание всех пяти языков МЭК 61131-3, но выбор языка существенно влияет на способ реализации задачи.

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

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

3S CoDeSys [3] это одна из самых полных и удачно реализованных сред программирования МЭК 61131-3. CoDeSys обладает набором открытых функциональных библиотек, предназначенных для решения широкого круга наиболее распространенных задач автоматизации. Одна из таких библиотек — Util.lib содержит дополнительный набор различных функций и функциональных блоков, применяемых регуляторов, генераторов и преобразований аналоговых сигналов. Рассмотрим работу функционального блока (ФБ) GEN, входящего в состав данной библиотеки среды CoDeSys v2.3. Данный блок предназначен для генерации периодически изменяющихся сигналов различных предустановленных форм: треугольный (двуполярный и однополярный), двуполярный пилообразный (нарастающий и ниспадающий), меандр, синусоида и косинусоида.

Читайте также:  Все виды синхронных генераторов

Описание принципа работы функционального блока. Библиотека Util.lib имеет открытый программный код. Для доступа к коду функциональных блоков, входящих в библиотеку необходимо ее открыть из меню «Открыть» вновь созданного проекта. Листинг программы с авторскими комментариями и описанием используемых переменных представлен ниже.

(*функциональный блок для генерации некоторых периодических функций*)

(*Раздел описания переменных*)

VAR_INPUT (*входной интерфейс блока*)

(*определение типа генерируемого сигнала:

TRIANGLE — сигнал треугольной формы от отрицательного значения амплитуды до положительного значения амплитуды сигнала.

TRIANGLE_POS — сигнал треугольной формы от нуля до положительного значения амплитуды сигнала.

SAWTOOTH_RISE — пилообразный сигнал увеличивающийся от отрицательного значения амплитуды до положительного значения амплитуды сигнала.

SAWTOOTH_FALL — пилообразный сигнал увеличивающийся от положительного значения амплитуды до отрицательного значения амплитуды.

RECTANGLE — сигнал прямоугольной формы от отрицательного значения амплитуды до положительного значения амплитуды сигнала.

SINUS — синусоидальный сигнал.

COSINUS — косинусоидальный сигнал. *)

BASE: BOOL;(* FALSE: период определяется как количество вызовов функционального блока; TRUE: период определяется заданным временем *)

PERIOD: TIME:=T#1s; (*время периода сигнала, учитывается только, если BASE=TRUE*)

CYCLES: INT:=1000; (*число вызовов блока за период, учитывается только, если BASE=FALSE *)

RESET: BOOL; (*обнуление выхода и остановка генерации сигнала*)

VAR_OUTPUT (*выходной интерфейс блока*)

OUT: INT; (*переменная генерируемого сигнала*)

VAR (*локальные переменные функционального блока*)

CET: DINT; (*переменная, используемая для отсчета времени генерируемого сигнала (шаг дискретизации по времени)*)

PER: DINT; (*переменная, определяющая длительность периода генерируемого сигнала *)

COUNTER: INT; (*счетчик вызовов блока*)

help: REAL; (*промежуточная переменная для вычисления значения синусоидального и косинусоидального сигналов*)

Источник

Таймеры и триггеры CODESYS. Еще один шаг Arduino к классическому ПЛК

Случается программировать контроллеры (ПЛК) в среде CODESYS. Все, кто имел дело с этой системой, знают, что в любом проекте присутствует библиотека Standard.lib, в которой реализованы базовые таймеры, триггеры, счетчики и некоторое кол-во других функций и функциональных блоков. Многие из этих блоков постоянно используются в программах для ПЛК. А сама библиотека, как и языки программирования CODESYS, является воплощением стандарта IEC 61131-3, т.е. призвана помочь при программировании классических ПЛК задач.

Одна из особенностей программ для ПЛК в том, что основной цикл программы должен выполняться без существенных задержек, в нем не должно быть внутренних циклов с неопределенным временем выхода или синхронных вызовов «задумчивых» функций, особенно это касается коммуникаций по медленным каналам. Обновление входных и выходным образов процесса происходит только на границе основного цикла, и чем дольше мы будем «сидеть» внутри одной итерации цикла, тем меньше мы будет знать о реальном состоянии объекта управления, в конечном итоге сработает watchdog переполнения времени выполнения цикла. Многие могут мне возразить, сказав, что современные ПЛК многозначны, есть с поддержкой аппаратных прерываний. Согласен, но разговор о таких системах не входит в мои планы, я же хочу поговорить о (квази, псевдо — выбирайте) ПЛК однозадачной реализации (без прерываний) на базе микропроцессорной платформы Arduino, в котором есть только один основной цикл. Кстати, не лишним будет сказать, что на написание данной заметки меня сподвигла статья Ардуино-совместимый ПЛК CONTROLLINO, часть 1 о попытке аппаратного воплощения Arduino в пром. ПЛК.

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

Читайте также:  Генератор ключей для bartender

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

А теперь давайте вспомним ту самую Standard.lib из CODESYS. В ней как раз реализованы МЭК-овские неблокирующие таймеры. Я взял ее за основу и портировал функции таймеров и триггеров в библиотечный код Arduino (С++). Т.е. попытался приблизить Arduino к классическому ПЛК.

Ниже я приведу краткое описание портированных функциональных блоков (FB) CODESYS и их аналоги в моей библиотеке plcStandardLib, все временные диаграммы верны для новой библиотеки Arduino. Подробнее описание исходных блоков можно посмотреть, например, в русскоязычной справке по CODESYS.

TON — функциональный блок «таймер с задержкой включения»

Входы IN и PT типов BOOL и TIME соответственно. Выходы Q и ET аналогично типов BOOL и TIME. Пока IN равен FALSE, выход Q = FALSE, выход ET = 0. Как только IN становится TRUE, начинается отсчет времени (в миллисекундах) на выходе ET до значения, равного PT. Далее счетчик не увеличивается. Q равен TRUE, когда IN равен TRUE, а ET равен PT, иначе FALSE. Таким
образом, выход Q устанавливается с задержкой PT от фронта входа IN.

В Arduino IDE:

Временная диаграмма работы TON:

TOF — функциональный блок «таймер с задержкой выключения»

Входы IN и PT типов BOOL и TIME соответственно. Выходы Q и ET аналогично типов BOOL и TIME. Если IN равен TRUE, то выход Q = TRUE и выход ET = 0. Как только IN переходит в FALSE, начинается отсчет времени (в миллисекундах) на выходе ET. При достижении заданной длительности отсчет останавливается. Выход Q равен FALSE, если IN равен FALSE и ET равен PT, иначе — TRUE. Таким образом, выход Q сбрасывается с задержкой PT от спада входа IN.

В Arduino IDE:

Очень похоже на TON, для краткости:

Временная диаграмма работы TOF:

TP — функциональный блок «импульс-таймер»

Входы IN и PT типов BOOL и TIME соответственно. Выходы Q и ET аналогично типов BOOL и TIME. Пока IN равен FALSE, выход Q = FALSE, выход ET = 0. При переходе IN в TRUE выход Q устанавливается в TRUE и таймер начинает отсчет времени (в миллисекундах) на выходе ET до достижения длительности, заданной PT. Далее счетчик не увеличивается. Таким образом, выход Q генерирует импульс длительностью PT по фронту входа IN.

В Arduino IDE:

Очень похоже на TON, для краткости:

Временная диаграмма работы TP:

R_TRIG — функциональный блок «дeтектор фронта»

Функциональный блок R_TRIG генерирует импульс по переднему фронту входного сигнала. Выход Q равен FALSE до тех пор, пока вход CLK равен FALSE. Как только CLK получает значение TRUE, Q устанавливается в TRUE. При следующем вызове функционального блока выход сбрасывается в FALSE. Таким образом, блок выдает единичный импульс при каждом переходе CLK из FALSE в TRUE.

Пример CODEDESYS на языке ST:

В Arduino IDE:

F_TRIG — функциональный блок «дeтектор спада»

Функциональный блок F_TRIG генерирует импульс по заднему фронту входного сигнала.
Выход Q равен FALSE до тех пор, пока вход CLK равен TRUE. Как только CLK получает значение FALSE, Q устанавливается в TRUE. При следующем вызове функционального блока выход сбрасывается в FALSE. Таким образом, блок выдает единичный импульс при каждом переходе CLK из TRUE в FALSE.

Читайте также:  Диодный мост для генератора ваз 2105

В Arduino IDE:

RS_TRIG — функциональный блок RS-триггер / SR_TRIG — функциональный блок SR-триггер

Переключатель с доминантой выключения, RS-триггер:

Переключатель с доминантой включения:

Входные переменные SET и RESET1 — как и выходная переменная Q1 типа BOOL.

Источник

Тема: Генератор на ПЛК

Опции темы
Отображение

Генератор на ПЛК

Всем доброго времени суток .
Есть вопрос по ПЛК 110 на каком и возможно ли вообще сделать выход регулируемого генератора на 200кГц . Очень нужно для управления китайского сервопривода .И ещё один вопрос по энкодеру -может кто нибудь подскажет марку ,чтобы он корректно работал с ПЛК (идет простое измерение длины трубки до нужного размера).

На контроллерах ОВЕН Вы такой частосты не добьетесь.

Если речь идет об управлении шаговым двигателем (ШД), то для этого есть специальные драйверы. Можете посмотреть здесь: http://onitex.ru/. Пытаться управлять ШД непосредственно через дискретные выходы ПЛК – безумная мысль. К вопросу с подключением энкодера к ПЛК110 надо подходить очень осторожно. В свое время по этим делам было много шума и гама. Советую найти эти темы на форуме и внимательно почитать.

Последний раз редактировалось IVM; 05.10.2012 в 17:28 .

IVM речь идет о сервоприводе DS2-21P5. Управляется он генератором, частота -это скорость, количество импульсов — шаг и дискретно направление.

По поводу генератора ,на ПЛК110 60 подмодуль PWM как его запустить? Документацию читал, но настроить не смог. С быстрых выходов ПЛК никаких сигналов нет, он настраивается только в конфигураторе или он в библиотеках где-то ещё есть?
Если есть возможность,то покажите как это настраивается.
Заранее благодарен.

IVM речь идет о сервоприводе DS2-21P5. Управляется он генератором, частота -это скорость, количество импульсов — шаг и дискретно направление.

По поводу генератора ,на ПЛК110 60 подмодуль PWM как его запустить? Документацию читал, но настроить не смог. С быстрых выходов ПЛК никаких сигналов нет, он настраивается только в конфигураторе или он в библиотеках где-то ещё есть?
Если есть возможность,то покажите как это настраивается.
Заранее благодарен.

Подавали +24 на клем +U ?
http://www.owen.ru/catalog/83032437
Выходные элементы контроллера ПЛК110 типа К «быстрые».

Да всё подключенно плюс нагрузочный резистор как на этой картинке.Может в настройке диапазона работы что-то.Период установлен 360 000, а диапазон -это заполнение импульсами от 1 до 65000. В программе я записываю в эти регистры PWM_1 PWM_1P свои значения.После записи значений должно вроде бы работать.

IVM речь идет о сервоприводе DS2-21P5. Управляется он генератором, частота -это скорость, количество импульсов — шаг и дискретно направление.

По поводу генератора ,на ПЛК110 60 подмодуль PWM как его запустить? Документацию читал, но настроить не смог. С быстрых выходов ПЛК никаких сигналов нет, он настраивается только в конфигураторе или он в библиотеках где-то ещё есть?
Если есть возможность,то покажите как это настраивается.
Заранее благодарен.

Непонятно каким образом Вы сможете сформировать требуемое количество импульсов на быстром выходе ПЛК (речь идет о тактовом сигнале). Если для формирования пачки импульсов использовать сигнал «Разрешение работы», то точность позиционирования будет невысокой. Это самое главное, все остальное ерунда. 200 кГц на выходе тоже не получите. Если в качестве датчика обратной связи использовать энкодер, то может что-то и получится. Но про энкодер я Вам ранее писал.
У этого привода есть интерфейс RS-485 c MODBUS-RTU. Если этот порт можно использовать для управления приводом, то это самое лучшее решение вопроса.

Последний раз редактировалось IVM; 06.10.2012 в 15:43 .

Источник

Adblock
detector