CODESYS форум

Добро пожаловать на официальный форум CODESYS
Deutsche Version English version russian version 
Текущее время: Вс июл 23, 2017 5:37 am

Часовой пояс: UTC+01:00




Начать новую тему  Ответить на тему  [ 7 сообщений ] 
Автор Сообщение
СообщениеДобавлено: Ср дек 02, 2009 11:38 am 
Не в сети

Зарегистрирован: Вт сен 15, 2009 7:48 am
Сообщения: 47
Для понимания материала необходимо: Установка CoDeSys v3.3 , общие представления об ООП.

История «Священной войны» сторонников процедурного подхода против сторонников объектно-ориентированного подхода насчитывает более 3-х с десятков лет. Объектно-ориентированное программирование, впервые появившись в 1967 году в языке Симула, резко набрало обороты, и уступала процедурному подходу только в области системного программирования. В программирования ПЛК в силу консервативности этой области до сих пор понятия ООП были не применимы. Стандарт МЭК предоставлял нам статический, надежный проверенный временем программный компонент – Функциональный блок (ФБ). ФБ формировал хорошую основу для развития его до классического понятия класса. Этот шаг был совершен в 3-тей версии CoDeSys, который предоставил программистам ПЛК новый инструмент - ООП, тем самым открыв новую площадку для “Holy War”. Но это все лирика. Давайте перейдем к практике и рассмотрим объектный подход на примерах.

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

Объектно-ориентированный подход решения:
Сначала мы создаем класс простых комнат и описываем логику работы (включение и выключение) с одной лампочкой. Затем класс простых комнат наследуем в новый класс –класс комнат полулюкс, где дополняем код описанием логики дополнительной лампочки, логика основной лампочки наследуется от предка, и описывать её уже не надо. И в конце класс комнат полулюкс наследуем в класс комнат люкс, где добавляем методы работы с климатической установкой, лампочки в последнем классе нам программировать не придется, они были описаны в классах-предках и в классе люкс мы их получаем по наследству.

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

Запускаем CoDeSys 3.3 и создаем новый Standard Project. Указываем Device: CoDeSys SP Win V3, язык ST. После этих действий получаем новый пустой проект (рис 1).
Изображение
Рис 1. Главное окно CoDeSys 3.3.

Первоначальная наша задача создать класс простых комнат.
Все комнаты обладают методами включения и выключения лампочки и методами, описывающими операции днем (выключение лампы) и ночью (включение лампы). Эти методы должны быть внешними для того, чтобы мы могли обращаться к ним вне объекта. Выведем эти методы в отдельные интерфейсы, которые реализуем в классах комнат.
Для этого создадим интерфейс ILight, который определит методы работы с лампочкой, и интерфейс IRoom, который определит операции дня и ночи в комнате.
В левой части окна рис 1. На ветке Application щелкаем Левой Клавишей Мышки (ниже сократим последние три слова этой фразы, как ЛКМ) и в выпадающем меню выбираем Add Object. Откроется окно добавления новых объектов к проекту (рис 2). На всякий случай отметим, что это объекты- элементы самой системы CoDeSys, и их не надо путать с объектами, которые мы описываем и создаем в проекте.
Изображение
Рис 2. Окно добавления объектов CoDeSys.

В левой части выбираем Interface, в правой части задаем Name ILight, нажимаем Open.
После этих действий в дереве вкладки Devices появиться новый элемент – интерфейс ILight (рис 3.)

Изображение
Рис 3. Интерфейс ILight.

Теперь нам требуется определить в этом интерфейсе методы, которые будут работать с лампочкой. Определим два метода – это SetLight, который будет включать, и выключать лампочку и метод GetLight будет сообщать нам текущее состояние лампочки. Последний метод нам нужен для соблюдения правил инкапсуляции («некрасиво» обращаться к переменным объекта напрямую не используя методы этого объекта, да и некоторые объекты этого не позволяют).
Добавим эти методы в интерфейс. Для этого щелкаем ЛКМ :) на этом интерфейсе и выбираем Add Object. Обращаем внимание на новое содержание уже знакомого нам окна добавления объектов (рис 4).
Изображение
Рис 4. Добавление методов в интерфейс.

Выбираем Method, задаем имя SetLight и устанавливаем возвращаемый тип bool (тут можно воспользоваться ассистентом ввода – кнопка правее Return Type). Вообще, в нашем примере нам возвращаемый тип понадобиться только в методах Get, но отдавая дань традициям ООП (внешние методы должны возвращать хотя бы код ошибки выполнения этого метода) мы введем bool и использовать будем по необходимости.
Нажимаем Open.
В дереве объектов главного окна в ветке интерфейса появляется метод, а в центре окна открывается текстовая часть описания метода на ST Рис 5.
Изображение
Рис 5.Метод в интерфейсе.
В тестовой части в секцию VAR_INPUT добавим переменную b:bool; , которая будет получать, и устанавливать состояние лампочки. Реализация методов всех интерфейсов будет происходить в классах.
Аналогично методу SetLight добавляем метод GetLight с возвращаемым типом bool (рис 6).
Изображение
Рис 6.Метод GetLight в интерфейсе ILight.

Следующим шагом сделаем интерфейс IRoom и добавим в него методы OperationDay и OperationNight (Рис 7.). Оба метода возвращают bool.

Изображение
Рис 7.Интерфейс IRoom.

Теперь у нас есть необходимые методы для описания первого класса простых комнат.
На ветке Application ЛКМ и в выпадающем меню выбираем Add Object. Тут выбираем POU, задаем имя, тип POU – Function Block, язык реализации ST. Ставим галочку Implements и в поле правее через запятую пишем названия интерфейсов, которые мы хотим реализовывать в данном классе (Рис 8.).

Изображение
Рис 8.Создание класса простых комнат RoomType1.

На рис 8 мы видим два поля выбора языка реализации. Первый Method implementation language задает язык реализации Методов класса. Второй Implementation language задает язык реализации функционального блока (ФБ), если этот ФБ будет использоваться как ФБ, а не как Класс.
Нажимаем Open и видим, что в дереве Devices появился ФБ с автоматически включенными методами вышеописанных интерфейсов. ФБ с методами представляет собой Класс. Обратим внимание входной параметр b:bool метода SetLight нового класса RoomType1 был также автоматически взят из описания интерфейса Рис 9.

Изображение
Рис 9.Класс простых комнат RoomType1.

Теперь нам нужна сама лампочка, введем переменную bLight, опишем ее работу, и пропишем работу этой лампочки в операциях дня и ночи. Двойным щелчком правой КМ на имени класса RoomType1 во вкладке Devices попадаем в окно редактора, где в верхней части опишем переменные (свойства), а нижнюю часть, предназначенную для реализации ФБ, трогать не будем.
Таким образом, в секцию VAR ведем нужную нам лампочку - переменную bLight типа bool.

Изображение
Рис 10.Свойства Класса RoomType1.

Переходим к реализации методов. Двойным щелчком по имени метода в классе (не в интерфейсе) переходим в редактор, где будем реализовывать методы. Начнем сверху вниз. Первым идет SetLight который получает входной параметр b b присваивает его bLight рис 11.
Изображение
Рис 11.Реализация метода SetLight в классе RoomType1.

Следующий метод GetLight – просто возвращает значение переменной bLight Рис 12.

Изображение
Рис 12.Реализация метода GetLight в классе RoomType1.

Метод OperationDay выключает лампочку Рис 13.
Изображение
Рис 13.Реализация метода OperationDay в классе RoomType1.

Метод OperationNight включает лампочку рис 14.
Изображение
Рис 14.Реализация метода OperationNight в классе RoomType1.

Все класс простых комнат готов. Можем приступать к созданию объектов и использованию оных.
Отредактируем PLC_PRG (аналогичным образом как редактировали методы) как показано на рис 15.

Изображение
Рис 15.Описание PLC_PRG.

В строке 3 верхней части окна мы создали экземпляр (объект) r1 класса RoomType1.
В строке 4 ввели переменную Day, которая будет объявлять время суток? Закат и восход солнца будет производиться вручную.
В нижней части окна реализована логика – если день, то выполняем операции дня этого объекта, если ночь - соответственно операции ночи.
Запускаем проект и проверяем работу!
Для запуска проекта надо поставить галочку в меню Online->Simulate Device, «отбилдить» проект (Build->Build Application). После этого убедиться в отсутствии ошибок по фразе « Compile complete -- 0 errors, 0 warnings» в окне сообщений. Подключаемся к устройству (в нашем случае к его симуляции) Online->Login to Application и запуск на исполнение Online-> Start Application.
Получаем окно как на рис 16.

Изображение
Рис 16.Окно PLC_PRG запущенного проекта.

Тут мы видим, что изначально у нас ночь (Day=FALSE) и лампочка горит (bLight=TRUE). Двойным щелчком мышки в поле Prepared value в строке переменной Day устанавливаем TRUE и производим запись этого значения в переменную нажав Ctrl+F7. Замечаем, что переменная bLight стала FALSE – свет выключился с восходом солнца.
Останавливаем проект Online->Stop Application и отключаемся от устройства.
На данный момент, мы сделали класс простых комнат и поработали с объектом этого класса.
Следующим действием будет создание класса комнат полулюкс путем наследования класса простых комнат и дополнением методов работой лампы дополнительного освещения. Это будет проще, чем то что мы уже делали.
Создаем новый класс (добавляем в дерево вкладки Devices новый ФБ как RoomType1) RoomType2 рис 17. Выбираем галочку Extend и указываем в поле правее наследуемый класс RoomType1.

Изображение
Рис 17.Добавление класса с наследованием.
После нажатия Open появится новый класс RoomType2 не содержащих (на первый взгляд) в своем составе методов. В действительности же этот класс имеет все свойства и методы родительского класса RoomType1, т.е. так же неявно имеет переменную bLight и может с ней работать теме же методами что и класс предок. Нам остается добавить только дополнительную лампочку. По аналогии добавления свойств (bLight) в классе RoomType1 добавим bAdditionalLight:bool; в RoomType2 (рис 18).
Изображение
Рис 18. Добавление дополнительного освещения.
За включение и выключение лампы отвечает метод SetLight. Нам требуется научить его включать дополнительное освещение. Для этого добавим этот метод, как новый в RoomType2, но с тем же названием, с тем же возвращаемым типом и с тем же входным параметром. В тело метода добавляем две строки как на Рис 19.
Изображение
Рис 19. Переписанный метод SetLight в классе RoomType2.
Первая строка в теле метода вызывает метод SetLight предка с параметром b. Метод предка включит основную лампочку. Вторая строка включает дополнительное освещение.
Таким образом, тот же самый метод SetLight в классе RoomType2 включает 2 лампочки.
Все, класс комнат полулюкс готов. Добавим объект этого класса в PLC_PRG и проведем те же эксперименты, переключая переменную Day (рис 20 и рис 21).

Изображение
Рис 20. Добавление объекта класса RoomType2.

Изображение
Рис 21. Работа объектов в исполняемом проекте.

Как хорошо видно на Рис 21 в комнате r2 синхронно зажигаются две лампочки. Одна лампочка доставшаяся по наследству bLight, вторая добавленная нами.
Итак, мы вышли на финишную прямую и приступаем к созданию самого сложного класса - комнат люкс. Мы создадим интерфейс ITemperature который будет содержать методы работы с климатической установкой. Метод SetTemperature с входным параметром типа INT будет устанавливать требуемую температуру. Метод GetTepmerature будет возвращать значение температуры типа INT. Так же сделаем это, как сделали до этого ILght и IRoom (рис 22). Только не забудем остановить работающий проект и отключиться от Симулируемого Девайса.

Изображение
Рис 22. Добавление интерфейса климатической установки.

При создании метода GetTemperature возвращаемый тип должен быть INT- незабываем про это.
Теперь у нас есть интерфейс Климатконтроля. Создаем Класс Люкс RoomType3 наследуя RoomType2 и реализуя интерфейс ITemperature (Рис 23)

Изображение
Рис 23. Добавление Класса комнат люкс.

После этого мы добавляем Метода OperationDay и OperationNight для включения в них логики работы климатической установки – аналогично добавлению дополнительного освещения в классе полулюкс. Точно так же как bAdditionalLight в RoomType2 добавляем iTemp:int; (потдерживаемая температура в комнате) в RoomType3 (рис 24).

Изображение
Рис 24. Класс RoomType3.

Опишем методы (рис 25-28).

Изображение
Рис 25. Метод SetTemperature класса RoomType3.

Изображение
Рис 26. Метод GetTemperature класса RoomType3.

Изображение
Рис 27. Метод OperationDay класса RoomType3.

Изображение
Рис 28. Метод OperationNight класса RoomType3.

В последних двух методах в первых строках происходит включение и выключение обоих ламп методами предка - RoomType2. Во вторых строках устанавливается предпочитаемая температура днем и ночью.
Класс комнат люкс готов.
Добавляем объект в PLC_PRG так же как мы это делали прежде, и запускаем проект (рис 29).

Изображение
Рис 29. Пример рабочего проекта со всеми классами.

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


Изображение
Рис 30. Объединение объектов по общему интерфейсу.

Можем объединить все объекты- комнаты в одном объекте – этаж и работать со всеми комнатами одними методами.
Наш пример показал некоторые приемы Объектно-ориентированного подхода. Многие моменты остались не раскрытыми, но это все можно узнать, задавая вопросы тут.
На этом закончим пример из которого видно, что основным преимуществом ООП легкая функциональная масштабируемость от простого решения к сложному. Описав какие-то моменты в старших классах, мы можем без переписывания кода использовать и модифицировать уже существующие решения под наши нужды. На примере нашего проекта лампочка, описанная в первом классе простых комнат больше нигде не меняла принцип своей работы, многократно наследуясь в младшие классы. При этом младшие классы обрастали все новым функционалом.
Вот инструмент, креатив за вами :)


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Пн фев 08, 2010 3:43 pm 
Не в сети

Зарегистрирован: Пт май 04, 2007 7:14 am
Сообщения: 0
Михаил, сюдя по текстовой части - всё замечательно...
Можете исправить отображение картинок?


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Вт фев 09, 2010 10:34 am 
Не в сети

Зарегистрирован: Вт сен 15, 2009 7:48 am
Сообщения: 47
agomonov писал(а):
Михаил, сюдя по текстовой части - всё замечательно...
Можете исправить отображение картинок?


А что с ними не так?


Вернуться к началу
СообщениеДобавлено: Вт июл 27, 2010 7:01 am 
Не в сети

Зарегистрирован: Ср июл 21, 2010 12:17 pm
Сообщения: 0
вопрос может показаться странным однако именно так и обстоит дело: после установки кодесис версии 3.4 в выпадающем меню нет интерфейсов, оно вообще раза в два короче чем на скриншоте(рис 2). Что где надо исправить чтобы заработало? уже пару раз переустановил.

вопрос снят: нашел где галочку поставить.


Вернуться к началу
СообщениеДобавлено: Ср окт 12, 2011 5:19 pm 
Не в сети

Зарегистрирован: Вт окт 11, 2011 5:31 pm
Сообщения: 0
Какие настройки необходимы, чтобы пункт меню "add interface" стал доступен ? Я пока не нахожу, где поставить заветную галочку.


Вернуться к началу
СообщениеДобавлено: Пт окт 21, 2011 10:29 am 
Не в сети

Зарегистрирован: Вт сен 15, 2009 7:48 am
Сообщения: 47
VladGer писал(а):
Какие настройки необходимы, чтобы пункт меню "add interface" стал доступен ? Я пока не нахожу, где поставить заветную галочку.


Tools->Options->Features-> Predefined feature sets
тут поменять со Standard на Professional


Вернуться к началу
СообщениеДобавлено: Чт май 29, 2014 7:02 pm 
Не в сети

Зарегистрирован: Пн фев 15, 2010 3:39 pm
Сообщения: 3
Давно уже хочу делать системы автоматизации в стиле ООП - надоели эти биты/байты.
Какой контроллер с поддержкой 3-й версии можете рекомендовать?
Крайне желательно, российского производства.


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 7 сообщений ] 

Часовой пояс: UTC+01:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB