Ton codesys как работает
Перейти к содержимому

Ton codesys как работает

  • автор:

Алгоритм таймера пользовательской библиотеки

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

Ключевые слова: алгоритм таймера, пользовательская библиотека, модернизация таймера, универсальный таймер, кодесис, CFC

05.13.05 — Элементы и устройства вычислительной техники и систем управления

05.13.06 — Автоматизация и управление технологическими процессами и производствами (по отраслям)

Программируемые логические контроллеры (далее ПЛК) получили широкое применение в промышленности. Важной частью современных контроллеров являются алгоритмы пользователя, реализуемые в виде библиотек. Качество создаваемой автоматической системы управления технологическим производством (далее АСУ ТП) во многом определяют эти библиотеки.
Отдельные алгоритмы в стандартных библиотеках не удовлетворяют пользователя или вовсе отсутствуют. К счастью, на сегодняшний момент практически в любой среде программирования промышленных контроллеров имеется возможность добавления пользователем своих алгоритмов. Разработка новых алгоритмов расширяет возможности и улучшает качество программ.
Рассмотрим недостатки алгоритма таймер, реализованного в библиотеке алгоритмов контроллера Ремиконт Р-130, контроллера Simatic S7-300 фирмы Siemens (German, Berlin), контроллера ПЛК-150 и контроллера фирмы Phoenix Contact (Germany, Blomberg).
Возможности, которые предоставляется программисту благодаря применению расширяемой пользовательской библиотеки можно продемонстрировать на примере модернизации алгоритма таймер.
ТАЙМЕР
Алгоритм таймера является одним из самых распространённых и используемых алгоритмов. Таймеры могут использоваться в программах управления запуском и остановкой двигателей, турбин, конвейеров и т.д.
Существующие таймеры из стандартных библиотек, без дополнительных надстроек, не могут управлять запуском и остановкой какого-либо двигателя в силу отсутствия тех или иных функций.
В каждой из рассматриваемых сред есть свой алгоритм таймера, в некоторых даже не один.
Библиотека алгоритмов контроллера Ремиконт Р-130 имеет алгоритм таймер (ТМР), структура которого приведена на рис. 1.


Рис. 1. Структура алгоритма таймер ТМР

Данный алгоритм имеет входы для остановки и сброса таймера, а так же в его состав входит несколько нуль-органов, количество которых определяется модификатором.
Подробно данный алгоритм описан в [1,2]. Описание недостатков и пути их исправления описывается в [2]. Основным и главным недостатком данного таймера являет то, что он начинает работу сразу, как только программа загружается в ОЗУ контроллера, т.е. данный таймер не нужно запускать.
В среде Step 7 существует несколько видов таймеров: – импульсный таймер (риc. 2), таймер с продлённым импульсом, таймер задержки включения, таймер задержки включения с запоминанием, таймер задержки выключения.

Рис. 2. Внешний вид FBD блока «Импульсный таймер» в среде Step 7,
где S – вход запуска, TV – спецификация длительности времени, R – вход сброса, BI – текущее значение времени в двоичном представлении, BCD – текущее значение времени в BCD-представлении, Q – состояние таймера.

Все эти таймеры имеют одинаковый принцип работы, и их различие заключается лишь в дополнительных функциях. Их подробное описание изложено в [3,4,5], а так же в файле-справке, поставляемом вместе с программным обеспечением. Из описания и временных диаграмм, представленных в [3,4,5] видно, что данный алгоритм является одновибратором, и его главным недостатком является невозможность приостановить работу таймера, а лишь остановить, поэтому, например, нельзя будет приостановить работу двигателя, а лишь остановить его.
В среде Codesys существует три вида таймеров: таймер TP (рис. 3), таймер с задержкой включения TON, таймер с задержкой выключения TOF.

Рис. 3. Таймер TP в среде Codesys, где IN – вход запуска таймера, PT – задание длительности работы, Q – состояние таймера, ET – время работы.

Подробное описание блоков TP, TON и TOF представлно в [6,7], и справочном файле среды Codesys. Все эти таймеры являются одновибраторами и имеют ограниченный функционал, в результате чего так же могут вызывать проблемы при использовании их в программах.

В среде PC Worx так же присутствуют три таймера их подробное описание представлено в справочном файле, поставляемом вместе с программным обеспечением. Поскольку PCWorx и Codesys полностью придерживаются стандарта МЭК 61131-3 (IEC 61131-3)[8], то и таймеры в средстве PC Worx имеет те же недостатки.Возможным путём решение вышеописанных проблем может быть реализация модернизированного универсального алгоритма таймера, входящего в состав пользовательской библиотеки. Этот таймер имеет расширенный функционал, в частности функцию памяти, поэтому его работу можно приостановить и запустить с момента остановки, а так же сбросить значения, например, для процессов которые повторяются по циклу. Предлагаемый вариант таймера представлен на рис. 4.


Рис. 4. Пример пользовательского алгоритма таймер в виде функционального блока.

Данный алгоблок имеет три булевых входа и один вход для переменной типа TIME. Булевые входы соответственно SR: START – переменная запускающая и останавливающая действие таймера, ST: STOP – переменная приостанавливающая действия таймера, ставящая таймер на паузу, но не останавливающая его полностью, и RS: RESET – переменная отвечающая за сброс таймера. Вход TM – задание времени работы таймера в секундах. Таймер имеет три выхода: Q – сигнализирующий о его работе в виде переменной типа BOOL, nQ – НЕ Q, который является инверсией выхода Q для использования таймера в качестве таймера с задержкой включения и TT – демонстрирующий, текущее время работы таймера. Для наглядности алгоритм «Таймер» реализован на языке CFC и представлен на рис. 5.


Рис. 5. Внутренняя реализация алгоритма таймера на языке CFC.

Для запуска таймера, необходимо, чтобы переменная SR (запуск таймера) приняла значение TRUE. Сигнал от неё поступает на алгоблок 0 (логическая операция AND), на этот блок так же поступает инверсно сигнал c выхода Q счетчика click, алгоблок 7. Если этот сигнал имеет значение FALSE, то алгоблок 0 на выходе имеет сигнал TRUE, и этот сигнал поступает на блок 1 (логическая операция AND). Так же этот сигнал поступает на блок 3 (логическая операция AND), на который помимо этого поступает инверсированный сигнал с выхода Q таймера (TON) стандартной библиотеки, который используется здесь как одновибратор для управления блоком счётчика 7. Если этот сигнал имеет значение FALSE, то вход блока 3 принимает значение TRUE и поступает на вход блока 4 (логическая операция OR), сигнал с которого примет значение TRUE, если переменная SP имеет значение FALSE, т.е. таймер не остановлен. Этот сигнал запускает работу блока TON (алгоблок 5). Выход Q блока TON соединён с входом CU блока CTU, это запускает и приостанавливает работу счетчика 7. На вход PT этого блока регулирует длительность его работы, его можно регулировать и настраивать в соответствии с длительностью цикла используемой модели ПЛК.На инверсированный вход блока 1 поступает сигнал от переменной SP (приостановка таймера), если этот сигнал принимает значение FALSE, то сигнал с блока 1 принимает значение TRUE и поступает на следующий блок под номером 3 (логическая операция AND). На последнем блоке проверяется значением переменной RS (сброс таймера), если она принимает значение FALSE, то сигнал от этого блока передаётся в переменную Q, которая является выходом таймера и сигнализирует о том, что таймера запущен. Одновременно инверсированный сигнал поступает в переменную НЕ Q.Сигнал от переменной RS так же поступает на вход RESET счетчика 7, это реализует функцию сброса таймера.Для управления временем работы таймера используется переменная TM, сигнал с которой поступает на блок 6, который является блоком преобразования переменной типа TIME в переменную типа UINT, это преобразование необходимо для работы счетчика 7. После преобразования значения поступают на вход PV счётчика 7. Результат работы счётчика, с выхода CV поступает в блок 8, который является обратным блоку 6, в нём переменная типа UINT преобразуется в переменную типа TIME и уже с него значения поступают в выходную переменную TT, с помощью которой можно следить за тем, сколько времени проработал таймер.Поскольку в программном средстве Codesys не существует функции непосредственного преобразования переменной времени TIME в переменную типа INT или UINT для реализации алгоритма таймера так же были составлены блоки TIME_TO (листинг 1) и GET_TIME (листинг 2) для прямого и обратного преобразования. Эти блоки так же являются составными частями пользовательской библиотеки и могут быть использованы отдельно в других программах. Реализация функционального блока TIME_TO на языке ST:
Заголовок и объявление переменных:

FUNCTION_BLOCK TIME_TO
VAR_INPUT
TT: TIME;
END_VAR
VAR_OUTPUT
Q:UINT;
END_VAR
VAR
F:UINT;
END_VAR

Реализация функционального блока GET_TIME на языке ST:
Заголовок и объявление переменных:

FUNCTION_BLOCK GET_TIME
VAR_INPUT
ET: UINT;
END_VAR
VAR_OUTPUT
TT:TIME;
END_VAR
VAR
F: UINT;
END_VAR

К примеру, такой модифицированный алгоритм таймера может быть использован при создании систем автоматического управления описанных в [9,10].
Пользовательская библиотека может распространяться в свободном доступе, и дополняться любым пользователем, в этом и ценность данной библиотеки, она может впитывать опыт большого числа пользователей.

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

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

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

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

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

В однозадачной системе добиться видимой параллельности можно только очень быстрым последовательным сканированием параллельных состояний, не задерживаясь подолгу на каждом вызове функции или проверке условия. С физическими входами-выходами проблем нет, функции отрабатывают достаточно быстро, а вот 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.

В Arduino IDE:

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

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

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

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

TON — реализует функцию таймера на включение временной задержки.

Если входной параметр IN изменяется от False к True, включение задерживается на интервал времени указанный на входе PT. После истечения времени на входе PT, значение True отображается на выходе Q. Время, которое уже прошло указано на выходе ET.

Примечание: вход IN и выход OUT могут иметь отрицательные значения.

Таблица 3.2 Описание параметров функции TON

Параметр Тип данных Описание
IN BOOL Если на вход поступило True то элемент начинает работу.
PT TIME Текущий интервал для временной задержки
Q BOOL TRUE если IN = TRUE и ET >= PT FALSE если IN = FALSE и ET <PT
ET TIME Прошедший интервал времени

Временная диаграмма для блока TON изображена на рисунке 3.2.

Рис.3.2 Временная диаграмма TON

TOF — реализует функцию таймера на выключение временной задержки.

Если входной параметр IN изменяется от True к False, выключение задерживается на интервал времени указанный на входе PT. После того как время входа PT истекло, значение False отображается на выходе Q. Время, которое уже прошло указано на выходе ET.

Примечание: вход IN и выход OUT могут иметь отрицательные значения.

Таблица 3.3 Описание параметров функции TOF

Параметр Тип данных Описание
IN BOOL Если поступило True таймер РТ включается.
PT TIME Текущий интервал для временной задержки
Q BOOL TRUE если IN = TRUE и ET <PT FALSE если IN = FALSE и ET >= PT
ET TIME Прошедший интервал времени

Временная диаграмма для блока TOF изображена на рисунке 3.3.

Рис.3.3 Временная диаграмма TOF

Создание и использование аналоговых входов и выходов. Чтобы просмотреть значения аналогового модуля необходимо создать переменную. Задать переменной имя, а в поле I\O address указать адрес %IW0; тип данных переменной WORD. Ниже на рисунке показано соединение переменной аналогового входа и переменной аналогового выхода.

Рис. 3.4 Изображение аналоговых сигналов

Пример решения задачи с одним выходом показан на рисунке 3.5.

Рис 3.5 Пример индикации одного выхода

Запускаем PC WORX. Меню File – New Project… — ILC1xx – ILC130ETH.

Создаём функциональный блок (ФБ): правой кнопкой мыши щёлкаем на папке Logical POUs – Insert – Function Block (рис. 3.6).

Рис. 3.6 Вставка ФБ

Задаём ему имя и указываем какой язык будет использоваться — FBD (рис. 3.7).

В main ФБ решаем задание, указывая в таблице переменных входы и выходы. А в главном окне вызываем ФБ и подключаем входы и выходы.

Задание на лабораторную работу:

1. Создать свой функциональный блок, который будет осуществлять индикацию четырёх выходов. В главном окне МЭК программирования использовать 5 входных сигнала, подключаемых к своему функциональному блоку, с разными режимами индикации.

2. Используя потенциометр, подключённый к аналоговому модулю, задействовать выходную индикацию. Использовать значения потенциометра 1, 3, 5, 7, 9. Алгоритм индикации выходов (Q1, Q2, Q3, Q4) выбирается по номеру бригады. В таблице указаны единицей выходы, которые должны гореть.

Таблица 3.4 Выбор варианта

Значения потенциометра № вар 1 3 5 7 9
1 0001 0011 0101 1101 1001
2 1011 1000 0000 0010 0110
3 0111 1010 0100 1100 1110
4 1111 0000 0110 0010 1101
5 0100 0011 1011 1110 0001
6 0101 0111 1000 1010 1111
7 1100 0000 0111 1001 0010
8 0100 0011 1011 110 1110
9 1111 0001 0101 1101 0110
10 1000 0010 1001 0111 1010
11 0110 0100 1001 0111 1111
12 0101 1011 1110 0001 0110

Требования к содержанию протокола:

1. Титульный лист с указанным номером лабораторной работы и темой.

2. Задание к лабораторной работе.

3. Выбор варианта.

4. Описание хода выполнения работы, выбранных блоков и обоснование своего выбора.

5. Описание и иллюстрация правильно работающей программы.

1. Создание функционального блока?

2. Каково назначение элемента SEL?

3. В чём различие между элементами TOF и TON?

4. Какие параметры содержит элемент AND, OR? Таблицы истинности булевых функций.

5. Порядок загрузки программы в память контроллера?

6. Запуск и отладка программы?

7. Как работает аналоговый модуль?

ЛАБОРАТОРНАЯ РАБОТА №3

«РАБОТА В РЕЖИМЕ СИМУЛЯЦИИ»

Цель работы: Научиться работать в режиме off-line (режим симуляции)

Задание на лабораторную работу: Повторить лабораторную работу №2 в режиме симуляции.

1. Создаём новый проект. Выбираем ILC 430 и выше.

2. В Bus Configuration выбираем вкладку Communication, а в ней Simulation.

3. Из Device catalog выбрать Phoenix Contact -> IL -> Bus Coupler — > IBS IL 24 BK T\U. Далее выбрать нужно количество входов и выходов из папок I\O analog, I\O digital, аналоговые и цифровые соответственно.

4. Создаем проект в IEC Programming.

5. Всем созданным переменным в программе присваивается тип переменных – VAR_GLOBAL_PG и сохраняются в папке default по умолчанию.

6. В окне Process data присваиваем переменным входы и выходы с правого окошка.

7. Загружаем проект и стартуем. Внизу, в панели задач, появится программа EasySim. Открыв её можно включать и выключать входы и выходы.

ЛАБОРАТОРНАЯ РАБОТА №4

«СОЗДАНИЕ ФУНКЦИЙ»

Цель работы: Научиться создавать и использовать функции.

Задание на лабораторную работу: На основе минимизации булевых функций создать программу где, функции решаються в FU, а результат в главном окне main.

1. Открываем новый проект. (online или offline режимы).

2. Так же как и функциональный блок, создаём функцию. Созданная функция должна вернуть значение в main.

Выбор варианта задания:

№ вар Функция №1 Функция №2
1. Y = “1” (1, 3, 7, 9, 11, 12, 15). Y = “0” (0, 2, 8, 9, 10, 13, 15).
2. Y = “0” (0, 1, 5, 6, 10, 13, 14). Y = “1” (1, 2, 4, 6, 9, 13, 15).
3. Y = “1” (0, 3, 5, 7, 11, 12, 14). Y = “0” (1, 3, 4, 7, 11, 13, 15).
4. Y = “0” (0, 1, 2, 4, 10, 13, 15). Y = “1” (1, 2, 3, 9, 10, 11, 12).
5. Y = “1” (1, 2, 7, 8, 10, 11, 15). Y = “1” (1, 6, 7, 8, 10, 12, 13).
6. Y = “1” (0, 2, 3, 4, 6, 14, 15 ). Y = “0” (0, 3, 3, 5, 6, 13, 14 ).
7. Y = “0” (2, 5, 6, 8, 9, 10, 13). Y = “1” (2, 4, 7, 8, 9, 11, 14).
8. Y = “0” (4, 6, 7, 9, 11, 13, 15). Y = “0” (2, 3, 8, 10, 12, 13, 14).
9. Y = “1” (2, 3, 5, 6, 11, 13, 14). Y = “1” (0, 3, 4, 6, 9, 10, 15).
10. Y = “0” (4, 7, 8, 10, 12, 13, 15). Y = “0” (1, 2, 3, 6, 7, 9, 11).

ЛАБОРАТОРНАЯ РАБОТА №5

«ЗНАКОМСТВО С ЯЗЫКАМИ ПРОГРАММИРОВАНИЯ IEC 61131-3».

Цель работы: Научиться создавать и использовать функциональные блоки.

Краткие теоретические сведения:

В стандарт IEC 61131-3 входит 5 языков программирования: LD, FBD, IL, SFC, ST.

Рис. 1.1 IL — Список инструкций

Рис. 1.2 ST — Структурный текст

Рис. 1.3 FBD – Диаграммы функциональных блоков

Рис. 1.4 SFC — Язык последовательных функциональных схем

Рис. 1.5 LD – релейных диаграмм.

1.1 Язык программирования LD:

Базовые элементы языка LD: базовыми элементами являются катушки и контакты. Контакт передаёт состояние горизонтальной связи левой стороны горизонтальной связи правой стороны. Это состояние – результат булевой операции И. Контакты бывают нормально разомкнуты и нормально замкнутые.

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

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

Рис.1.1.1 Поле для редактирования элементов языка.

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

В инвертированных катушках состояние левой связи копируется к правой связи. Инвертированное состояние левой связи копируется к связанной булевой переменной. Если левая связь находится в состоянии OFF, правая связь будет также в состоянии OFF и связанная переменная будет в состоянии ON.

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

В катушках сброса состояние левой связи копируется к правой связи. Связанная булева переменная устанавливается в состоянии OFF, если левая связь находится в состоянии ON, иначе она остаётся неизменной. Связанная булева переменная может быть установлена с катушкой установленной.

Программу написанную на языке LD можно конвертировать в язык FBD. Также в языке LD используются переменные, функции и функциональные блоки. Пример использования показан на рисунке ниже.

Рис. 1.1.2 Применение функций и функциональных блоков в LD

1.2 Язык программирования IL.

Проведём аналогию между языками IL и FBD. Пример логического сложения и умножения показаны ниже.

Операторы языка IL

Для любых типов данных используются операторы:

Для любых числовых типов:

Для битовых типов данных – Логические операторы

Для числовых и битовых типов данных:

Для булевых типов данных:

А также могут использоваться в программе:

Примеры программирования на языке IL:

Синтаксис вызова функциональных блоков

Синтаксис операторов JUMP и RETURN

1.3 Язык программирования ST.

Базовые структуры языка ST представлены в таблице 1.3.1

Таблица 1.3.1 Элементы языка ST.

Объявления, присвоения, операторы Q_xAccess1 := False; Q_xAccess2 := I_xInput2 & Not I_xInput4;
Условия If I_xInput1 & I_xInput2 Then Q_xAccess1 := True; ElsIf I_xAccess2 & I_xAccess3 Then Q_xAccess2 := True; End_If;
Вызов функций и аргументы iCorrected := Limit(iMin, iBasis, iMax);
Вызов функциональных блоков и аргументы CTU_Access(CU := xPulse, PV := iMaxvalue, RESET := xStop); iDisplay := CTU_Access.QV; xFull := CTU_Access.Q;
Циклы Repeat iLoop := iLoop + 1; Until iLoop = 100 End_Repeat;

Присвоение значений и операторы. Логическое выражение на языке ST и FBD

ST FBD
Q_xOutput1 := I_xInput1 & Not I_xInput2 Or I_xInput3;

Вызов функций. Синтаксис: <Переменная> := <Имя функции (аргументы)>

Например: iCorrection := Limit(iMin,iMeasuredvalue,iMax);

Может использоваться функция как аргумент другой функции:

iCorrection := Limit(iMin,Word_To_Int(wRawsize),iMax);

Это выражение можно изобразить на языке FBD и выглядит оно следующим образом:

Рис. 1.3.1 Пример функции в функции

Вызов функционального блока. Приведём пример вызова функционального блока TON.

На языке ST можно вызвать двумя способами: Первый способ: TON_Signal(IN := I_xInput, PT := tDelay); Q_xOutput := TON_Signal.Q; tSequence := TON_Signal.ET; Второй способ: TON_Signal.IN := I_xInput,; TON_Signal.PT := tDelay; TON_Signal(); Q_xOutput := TON_Signal.Q; tSequence := TON_Signal.ET;

Язык ST имеет элементы высокоуровневого языка программирования:

1. Условия – конструкция IF расширенная и упрощенная

If I_xSensor1 & Not I_xSensor2 Then (* Instructions 1 *) ElsIf I_xSensor2 & Not I_xSensor1 Then (* Instructions 2 *) Else If iMeasuredvalue < 100 Then (* Instructions 3 *) ElsIf iMeasuredvalue > 100 Then (* Instructions 4 *) End_If; End_If; If (* Boolean condition *) Then (* Instructions *) End_If;

2.Оператор выбор – CASE

Case iProcesssize Of 7 : (* Instructions 1 *) -2..1 : (* Instructions 2 *) 2, 4 : (* Instructions 3 *) 8..16, 20..30 : (* Instructions 4 *) Else (* Instructions 5 *) End_Case; Case iProcessstep Of 0 : (* Initialize *) If xInit_completed Then iProcessstep := 10; End_If; 10 : (* Execute Prozess 1 *) If xProcess1_completed Then iProcessstep := 20; End_If; 20 : (* Execute Prozess 2 *) If xProcess2_completed Then iProcessstep := 30; End_If; (* etc. *) 500 : (* Exceptionalhandling *) iProcessstep := 0; End_Case;

3. Циклы – FOR, REPEAT, WHILE

Синтаксис цикла FOR:

For iIndex := 1 To 20 By 1 Do

(* The following instructions are executed with *)

(* the values 1 to 20 for the variable iIndex *)

If arrMachine[iIndex].iTemp >= iLimitvalue Then

arrMachine[iIndex].iBroken := True;

xAlarm := True;

Синтаксис циклов REPEAT/ WHILE

REPEAT WHILE
Repeat iIndex := iIndex + 10; Until iIndex >= iLimit End_Repeat; While iIndex >= iLimit Do iIndex := iIndex + 10; End_While;

Задание на лабораторную работу:

Выполнить задания указанные в таблице. Название задания должно совпадать с названием функции либо функционального блока.

Задания LD FBD IL ST
Fu_XOR 3 + +
Fu_Kod + +
Fu_light + +
Fb_TTrigger + +
Fb_TimeDelay + +
Pg_Lock +

1. Fu_XOR 3 – Создать функцию которая будет выполнять действия исключающего ИЛИ.

2. Fu_Kod — Создать функцию кодового замка из лабораторной работы №2.

3. Fu_light – Управление освещением в длинном коридоре.

4. Fb_TTrigger – Создать функциональный блок, который будет работать как Т триггер.

5. Fb_TimeDelay — Создать функциональный блок, который будет выводить индикацию 2х выходов в режиме мигания.

6. Pg_Lock – Сейфовый замок.

1. Создаём проект на 430 ПЛК, включаем симуляцию. Подключение устройств INTERBUS произвести тогда, когда будет окончательно определено количество входов и выходов.

2. В Logic POUs вставить группу с названием FB_Group.

2.1 Вставить функциональные блоки с названиями: Fb_TTrigger_XX, Fb_TimeDelay_XX, Fb_TrafficLight_XX. Где ХХ – название языка на котором написан блок. Например: Fb_TTrigger_LD, Fb_TrafficLight_SFC, Fb_TimeDelay_LD_FBD.

3. В Logic POUs вставить группу с названием FU_Group.

3.1 Вставить функции с названиями: Fu_XOR 3_ХХ, Fu_Kod_ХХ. Где ХХ – название языка на котором написана функция. Например: Fu_XOR 3_LD, Fu_Kod_IL.

4. В каждом функциональном блоке и функции есть таблица переменных. Именно с таблицы переменных начинаем писать программу.

4.1 Открыть таблицу переменных. Создать блоки входных и выходных переменных. Создать переменные, установить тип данных для каждой переменной как показано на рисунке ниже. И так далее для каждого ФБ и функции.

Рис.1.3.2 Таблица переменных

4.2 На рабочем поле набрать программу на требуемом языке, используя подготовленные переменные.

5. Открыв свойства Main, переименовать его и дать название CALL_FB_FU. Вынести на рабочее поле все функциональные блоки и функции.

Посчитать количество входных и выходных переменных. Подключить устройства INTERBUS.

Запустить режим симуляции.

Требования к содержанию протокола:

1.Титульный лист с указанным номером лабораторной работы и темой.

2.Задание к лабораторной работе.

4.Подробное описание хода выполнения работы, выбранных блоков и обоснование своего выбора.

5.Описание и иллюстрация правильно работающих программ.

ЛАБОРАТОРНАЯ РАБОТА №6

“ЗНАКОМСТВО С ЯЗЫКАМИ ПРОГРАММИРОВАНИЯ IEC 61131-3. ЯЗЫК ПРОГРАММИРОВАНИЯ SFC”

Цель работы: Ознакомиться с основами программирования на языке SFC.

Краткие теоретические сведения:

Базовые структуры языка – Шаг – Действие – Переход.

Рис. 1 Базовые структуры

В дереве проекта кроме основного рабочего пространства для программирования языка SFC есть ещё две папки: Transitions – переходы, папка где собраны каждая программа переходов в отдельности; Actions – действия, папка где расположены модули программ для выполняемых действий.

Пример дерева проекта показан на рисунке ниже.

Рис. 2 Дерево проекта

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

Рис. 3. Значения шага.

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

Действие. Блок действия может быть двух типов: Переменной и детальным действием. Если действие является переменной, т.е. булевым параметром – то оно изображается красным цветом. Если действие является детальным, то оно отображается зелёным цветом.

Рис.4. Действия двух типов

Детальное действие может быть написано на любом языке кроме SFC. Также действие может иметь свой идентификатор. По умолчанию стоит идентификатор N – не запоминаемое, т.е. действие активно столько сколько активен шаг. В иных случаях могут быть использованы и другие идентификаторы представленные в таблице 1.1:

Значение Описание
S Set This action is continued until it is explicitly reset (even if the corresponding step becomes inactive).
R reset Terminates the execution of action previously started with character S.
L time limited After activating the corresponding step, the action is executed for the set time or until step becomes inactive.
D time delayed Delay starts when step becomes active. After a set time has passed, the action is executed until step is deactivated. If the step becomes inactive, before the set time has passed, the action is not executed.
P pulse Starts when step becomes active/inactive and is executed once.
SD stored+ time delayed The action is executed until reset, but only starts after time delay has passed. Even if the step is active for less a time than the time delay.
DS time delayed+ stored The action is executed until reset, but only starts after time delay has passed. Unlike with the previous character, this does not happen if the step becomes inactive before time delay has passed.
SL stored+ time limited The action is executed for the set time, even if the step is active for a shorter time. The action can be reset with the character R.

Разветвления. В SFC используются разветвления двух типов: параллельные и альтернативные. Параллельные используются когда после перехода могут следовать несколько вариантов событий. Альтернативные используются тогда, когда после шага может быть несколько переходов.

Задание на лабораторную работу:

Написать программу на языке программирования SFC, которая будет показывать работу светофоров на перекрёстках. Варианты перекрёстков выбираются согласно номеру варианта.

1. Перекрёсток с мигающим (желтым) режимом. Автомобильный и пешеходный светофор.

2. Перекрёсток Т-образный. Автомобильный и пешеходный светофор.

3. Перекрёсток с трамвайными путями. Автомобильный и трамвайный светофор.

4. Перекрёсток с железнодорожным переездом. Автомобильный и Ж\Д светофор.

5. Перекрёсток с круговым движением. 3 съезда.

6. Перекрёсток с мигающим (желтым) режимом. Автомобильный светофор.

1. Создать Функциональный блок, который имеет 4 входных параметра и 3 выходных параметра.

Рис.5. Функциональный блок светофора

2. Таблица переменных выглядит следующем образом:

Рис. 1.2 Таблица переменных для светофора

3. Светофор на языке SFC показан ниже на рисунке.

Рис. 6. Светофор на языке SFC

4. Переходы представляют собой блок TON, где

— первый входной параметр это имя шага;

— второй входной параметр это имя входа ФБ;

— выходной параметр это имя перехода.

Рис. 7. Пример перехода

Требования к содержанию протокола:

1.Титульный лист с указанным номером лабораторной работы и темой.

2.Задание к лабораторной работе.

4.Подробное описание хода выполнения работы, выбранных блоков и обоснование своего выбора.

5.Описание и иллюстрация правильно работающих программ.

Дата добавления: 2018-08-06 ; просмотров: 2781 ; Мы поможем в написании вашей работы!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *