Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные работы ПЛК.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
649.46 Кб
Скачать

Лабораторная работа №3

Название: «Разбор таймера. Мигание диода через определенный интервал времени»

Цель работы: «Получить практические знания и навыки по программированию промышленных контроллеров. Изучить принцип работы таймера в контроллере. Ознакомиться со средой программирования контроллеров Owen»

Теоретическая часть:

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

Для правильно работы таймеров необходима аппаратная поддержка. Все экземпляры функциональных блоков таймеров «засекают» время (в CodeSys во внутренней локальной переменной StartTime), пользуясь общими часами. При проектировании ПЛК достаточно иметь один аппаратный таймер – счетчик, увеличивающийся с постоянной частотой. Аппаратный счетчик должен иметь достаточную разрядность, чтобы исключить возможность переполнения за одни рабочий цикл ПЛК.

Нельзя полагаться на то, что повторный вызов экземпляра функционально блока в одном рабочем цикле различные результаты. Значения программных таймеров могут обновляться при вызове экземпляра функционального блока или синхронно с обновлением входов. Это зависит от реализации системы исполнения. Не используйте в своих программах циклы (WHILE, REPEAT) с условием окончания итераций по таймеру.

Бывают несколько видов таймеров:

- ТР – генератор импульсов;

- TOF – таймер с задержкой выклечения;

- TON – таймер с задержкой включения;

- RTC – часы реального времени.

Для реализации наших задач нам нужен будет таймер ТР. Структура генератора импульсов представления в таблице 3.1.

Таблица 3.1. Структура таймера ТР.

Вход

Тип данных

Выход

Тип данных

IN

BOOL

Q

BOOL

PT

TIME

ET

TIME

Пока IN установлен в FALSE, ET будет 0 и Q будет FALSE. Как только IN переключится в TRUE, выход ET начнет отсчитывать время в миллисекундах. Когда ET достигнет значения заданного PT, счет будет остановлен. Тем временем выход Q равен TRUE, пока ET меньше PT. Как только ET достигнет значения PT, выход Q снова переключится в FALSE.

Временная диаграмма работы таймера представлена на рисунке 3.1.

Рис. 3.1. Временная диаграмма работы таймера ТР.

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

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

POU (Program Organization Unit)

К программным компонентам (POU) относятся функциональные блоки, функции и программы. Отдельные POU могут включать действия (подпрограммы).

Каждый программный компонент состоит из раздела объявлений и кода. Для написания всего кода POU используется только один из МЭК языков программирования (IL, ST, FBD, SFC, LD или CFC). CoDeSys поддерживает все описанные стандартом МЭК компоненты. Для их использования достаточно включить в свой проект библиотеку standard.lib.

POU могут вызывать другие POU, но рекурсии недопустимы.

Функция

Функция – это POU, который возвращает только единственное значение (которое может состоять из нескольких элементов, если это битовое поле или структура). В текстовых языках функция вызывается как оператор и может входить в выражения. При объявлении функции необходимо указать тип возвращаемого значения. Для этого после имени функции нужно написать двоеточие и тип.

Правильно объявленная функция выглядит следующим образом:

FUNCTION Fct: INT;

Рис. 3.2. Пример реализации функции.

Имя функции используется как выходная переменная, которой присваивается результат вычислений. Объявление функции должно начинаться с ключевого слова FUNCTION и заканчиваться ключевым словом END_FUNCTION. Рис. 3.2.

В языке ST вызов функции может присутствовать в выражениях как операнд.

В SFC функция вызывается только из шага или перехода.

Функция не имеет внутренней памяти. Это означает, что функция с одними и теми же значениями входных переменных всегда возвращает одно и то же значение.

Например:

На IL:

LD 7

Fct 2,4

ST Result

На ST:

Result : = Fct (7, 2, 4);

На FBD:

Функциональный блок

Функциональный блок - это POU, который принимает и возвращает произвольное число значений. В отличие от функции функциональный блок не формирует возвращаемое значение.

Объявление функционального блока начинается с ключевого слова FUNCTION_BLOCK и заканчивается ключевым словом END_FUNCTION_BLOCK.

Ниже приведен пример функционального блока, написанного на IL, который имеет две входных и две выходных переменных. Значение выходной переменной MULERG равно произведению значений двух входных переменных, а значение VERGL определяется в результате сравнения значений входных переменных.

Рис. 3.3. Пример программы функционального блока.

Экземпляры функционального блока

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

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

Пример объявления экземпляра с идентификатором INSTANCE функционального блока FUB:

INSTANCE: FUB;

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

Пример использования входных переменных: функциональный блок fb имеет входную переменную inl типа INT:

PROGRAM prog

VAR

inst1 : fb;

END_VAR

LD 17

ST inst1.in1

CAL inst1

END_PROGRAM

Экземпляры функционального блока могут быть объявлены в другом функциональном блоке или в программе. Объявлять экземпляр функционального блока в теле функции нельзя. Экземпляры функционального блока доступны в том POU, в котором они объявлены, если они не объявлены глобально.

Экземпляры функциональных блоков могут быть использованы в качестве входных переменных других функциональных блоков или функций.

Замечания

. После выполнения функционального блока все его переменные сохраняются до следующего выполнения. Следовательно, функциональный блок, вызываемый с одними и теми же входными параметрами, может производить различные выходные значения. Если хотя бы одна переменная функционального блока объявлена как RETAIN, то все данные экземпляров целиком помещаются в энергонезависимый сегмент.

Вызов функционального блока

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

<Имя экземпляра>.<Имя переменной >

В текстовых языках (IL, ST) задать актуальные параметры и считать значения выходов можно непосредственно при вызове экземпляра функционального блока. Для входных переменных применяется присваивание ":=", выходы считываются при помощи "=>". Этот процесс упрощается, если использовать ассистент ввода (<F2>) с включенной опцией вставки с аргументами (With arguments).

Программа

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

С примером программы мы уже сталкивались в лабораторной работе №2.

Нельзя вызывать программу из функции.

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

Объявление программы начинается ключевым словом PROGRAM и заканчивается ключевым словом END_PROGRAM.

Так же, как и для экземпляров функциональных блоков, в текстовых языках (IL, ST) задать актуальные параметры и считать значения выходов можно непосредственно при вызове программы. Для входных переменных применяется присваивание ":=", выходы считываются при помощи "=>".

Более подробно о редакторах и компонентах проекта вы может прочитать в фале CoDeSys_V23_RU.pdf, который находится на диске, прилагаемом к ПЛК.

Практическая часть:

Приступим к созданию программы.

а) Создадим POU.

Запустите CoDeSys и выбираем "File" "New".

В окне диалога определим первый POU. По умолчанию он получает наименование PLC_PRG. Не изменяйте его. Тип этого POU, безусловно, должен быть - программа. Каждый проект должен иметь программу с таким именем. В качестве языка программирования данного POU мы выберем язык Continuous Function Chart (CFC). В дальнейшем вы поймете, почему мы выбрали этот язык.

б) Создадим еще два объекта воспользовавшись командой "Project" "Object Add" в системном или в контекстном (нажмите правую кнопку мыши в окне Object Organizer) меню. Создадим: функциональный блок на языке Sequential Function Chart (SFC) с именем SIGNAL и функциональный блок на языке Function Block Diagram (FBD) с именем - TIMER, который мы будем описывать на языке Структурированного Текста (ST).

в) Двойным щелчком мыши откроем функциональный блок TIMER.

Как предполагалось, этот POU будет работать таймером. Наш POU должен иметь входную переменную TIME типа TIME и генерировать на выходе двоичную (Boolean) переменную, которую мы назовем OK. Данная переменная должна принимать значение TRUE, когда желательный период времени закончен. Предварительно мы устанавливаем эту переменную в FALSE в конце строки объявления (но до точки с запятой) " := FALSE ".

Теперь нам нужен генератор времени POU TP. Он имеет два входа (IN, PT) и два выхода (Q, ET). TP делает следующее: Пока IN установлен в FALSE, ET будет 0 и Q будет FALSE. Как только IN переключится в TRUE, выход ET начнет отсчитывать время в миллисекундах. Когда ET достигнет значения заданного PT, счет будет остановлен. Тем временем выход Q равен TRUE, пока ET меньше PT. Как только ET достигнет значения PT, выход Q снова переключится в FALSE.

Чтобы использовать TP в POU TIMER, мы должны создать его локальный экземпляр. Для этого мы объявляем локальную переменную ZAB (отсчитанное время) типа TP (между ключевыми словами VAR, END_VAR).

Раздел объявлений TIMER теперь должен выглядеть так:

FUNCTION_BLOCK TIMER

VAR_INPUT

TIME_IN:TIME;

END_VAR

VAR_OUTPUT

OK:BOOL;

END_VAR

VAR

ZAB:TP;

END_VAR

Теперь напишем код программы.

IF ZAB.Q=FALSE

THEN

ZAB(IN:=FALSE);

ZAB.PT:=TIME_IN;

ZAB(IN:=TRUE);

ELSE

ZAB;

END_IF;

IF ZAB.Q=TRUE

THEN OK:=FALSE;

ELSE OK:=TRUE;

END_IF

Код программы таймера вы можете сравнить с временной диаграммой работы и таймера. Таким образом все таки можно проследить и понять логику ее работы.

г) Двойным щелчком мыши откроем функциональный блок SIGNAL. Редактор будет иметь следующий вид представленный на рис. 3.4.

Рис. 3.4. Редактор SFC.

д) Приступим к редактированию и написанию программы. Для начала объявим входные и выходные переменные:

FUNCTIONAL_BLOCK SIGNAL

VAR_INPUT

END_VAR

VAR_OUTPUT

STATUS:BOOL;

END_VAR

VAR

TIM:TIMER;

END_VAR

Переменная STATUS служит для подачи сигнала на диод лабораторного стенда.

Переменная TIM наследует все значения функционального блока TIMER.

е) Далее создадим SFC диаграмму.

Первоначально SFC граф всегда состоит из этапа "Init" перехода "Trans0" и возврата назад к Init, естественно, нам придется несколько дополнить его.

Прежде чем программировать конкретные этапы и переходы, выстроим структуру графа. Сначала нам понадобятся этапы для каждой стадии SmenaSignala. Вставим их, отмечая Trans0 и выбирая команды "Insert" "Step transition (after)". Повторите эту процедуру еще раз.

Для редактирования названия перехода или этапа нужно просто щелкнуть мышкой на нужном тексте.

Первому переходу после Init присвоим значение "TRUE", а все прочие переходы "TIM.OK".

Первый переход у нас TRUE, т.е. разрешается, а все же прочие - когда TIM в OK станет TRUE, т.е. когда заданный период закончится.

Этапы (сверху вниз) получают имена Step2, Step3, ну и Init, конечно, сохранит своё имя. Диаграмма показана на рис 3.5. .

Теперь мы должны запрограммировать этапы. Для этого надо дважды щелкнуть на изображение этапа. Мы будем использовать язык ST.

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

Код будет выглядеть следующим образом:

Этап Init:

STATUS:=TRUE;

Этап Step2:

STATUS:=TRUE;

TIM(TIME_IN:=t#1s);

Этап Step3:

STATUS:=FALSE;

TIM(TIME_IN:=t#1s);

В конце укажем переход на этап Step2, чтобы выполнялся цикл.

Теперь перейдем к главной программе PLC_PRG.

Рис. 3.5. SFC диаграмма.

ж) Для начала объявим все переменные:

PROGRAM PLC_PRG

VAR

DIOD AT %QX1.3:BOOL;

SIGNAL:SIGNAL;

END_VAR

з) Перейдем в окно редактора. Мы выбрали редактор Continuous Function Chart, и, следовательно нам доступна соответствующая панель инструментов.

Щелкните правой клавишей мыши в окне редактора и выберите элемент Box. Щелкните на тексте AND и напишите «SIGNAL». Над элементом появиться симовлы «???». Введем в это поле «SIGNAL». Наш элемент автоматически распознает выходные переменные.

и) Вставьте далее элемент «Output». Введите вместо знаков вопроса переменную DIOD. Теперь соедените выход элемента SIGNAL со входом элемента DIOD. Для этого щелкнем мышью на короткой линии выхода и тянем ее (не отпуская клавишу мыши) к входу нужного элемента.

Наша программа должна принять следующий вид:

Рис. 3.6. Окно главной программы PLC_PRG.

к) Откомпилируете проект и запустите его.

Задание

1) Напишите программу, которая позволит включать диод на 3 секунды через каждые 5 секунд.

2) Напишите программ, которая позволит включать пару диодов на 2 секунды через каждую 1 секунду.