В ролике разбираются методы в объектно-ориентированном программировании на CODESYS 3.5. На примере функционального блока создаются методы для арифметических операций, показывается доступ к переменным родительского класса, вызов методов через экземпляр, передача входных параметров и ограничения доступа к внутренним переменным метода.
- 00:00 Введение в ООП и понятие методов
- 04:10 Создание функционального блока и метода в CODESYS
- 11:49 Доступ к переменным родительского класса внутри метода
- 13:35 Вызов методов экземпляра функционального блока
- 23:48 Входные переменные методов и вызов с параметрами
- 28:04 Доступ к переменным экземпляра и методам функционального блока
- CODESYS
- ООП
Кому полезно: Инженерам АСУ ТП, изучающим объектно-ориентированное программирование в CODESYS
Описание составлено автоматически по расшифровке речи в ролике.
Расшифровка видео
0:00 Всем привет, меня зовут Андрей, и на этом уроке мы с вами начнем. Цикл из по изучению ООП объектно ориентированного программирования в Кудесисы я немножко приболел. Поэтому у меня голос такой немножко осипший. Я сейчас сам занимаюсь как бы изучением этой темы обучением. Вот ну и как бы потихоньку буду разбираться и что то записывать.
0:32 Ну, на этом уроке я, наверное, не буду рассказывать, зачем нужно Лупа, ну в 2 словах. О п. это объектно ориентированное программирование и принцип его в том, что создаются так называемые объекты, у которых могут быть какие либо. Методы и свойства, так называемые свойства, это его описание, а методы это то, что он может. Ну как аналогия, допустим, если мы создадим класс машина, ну. Так, условно говоря, класс, машина или объект, машина, то эта машина имеет свойство. Цвет, допустим, мощности автоматическая или ручная коробка передач там.
1:26 Количество дверей, тип кузова и так далее, а методы это то, что она может делать, она может, допустим, разгоняться. Она может тормозить, она может ехать, она может перевозить их, а в точку б и так далее, вот и. По сути, объектно ориентированное программирование, оно позволяет создавать некие объекты, которые могут иметь. Как я уже говорил, свойства и методы. Вот и мы сегодня с вами рассмотрим методы, те создадим с вами объект некий, который еще по другому называется. Класс на самом деле в разных языках она в принципе и так и так называется. Бывает, объектом называют бывает классом, и, допустим, такой подход, то он используется во многих языках программирования. Наверное, во всех си подобных языках, ну начиная с СИП +. + + Пайтон Джава и так далее, то есть там везде создаются так называемые классы, то есть это тоже объекты и, соответственно, у этих классов может могут быть либо свойствами, либо методы и так далее. Вот ну давайте, я думаю, перейдем к практике и на практике. Будет более, я думаю, понятно, вот ну 1 что хочется сказать. Это можно открыть справку, вот она у меня уже открыта, загружена и вот здесь. Вот руководство по интерфейсу объекты Полу методы вот здесь можно прочитать в принципе про методы, что это такое и.
2:58 И как их создавать, как их вызывать и так далее, то есть синтаксис и так далее. Вот ну давайте с вами вот можно даже прочитать, что. Сейчас секундочку. То есть? Ну, давайте почитаем методы. Является расширением стандарта Майк является инструментом объектами ориентированного программирования, которые используются для инкапсуляции данных. Это этот момент мы чуть позже разберем. Метод содержит объявление и реализацию, однако отличие от функции метод не является независимым по, а задается функциональному блоку или программе. Вот это вот важный момент то, что.
3:49 Метод может создаваться как бы для функционального блока или для программы, вот то есть в принципе. Вот у нас есть программа полоса Перги, и мы можем в принципе создать метод для этой программы. Вот видите, вот вот так же мы можем создать функциональный блок.
4:10 Полуфункциональный блок, допустим, он будет называться Маев б 1 так секундочку. Маев бы, 1 вот и ну вот здесь, вот мы видим, есть всякие расширенные настройки. Это Имплемент абстрактный и так далее, это вот как раз всякие настройки, касающиеся ОП. Но пока не будем разбираться, просто создадим какой то функциональный блок. Вот и сразу давайте все будем вызывать в Пэлси Перге и сразу давайте создадим. Экземпляр этого функционального блока, чтобы просто не забыть это сделать потом.
4:53 Просто чтобы он работал, ну и в принципе можно даже и вызвать сразу этот экземпляр, вот. То есть вот мы создали, вызвали и сразу у нас никаких нету ошибок, вот и. Значит, вот этот функциональный блок, он же его можно назвать объектом или классом? У этого объекта или класса могут быть методы, то есть можно, грубо говоря, создать какие то под программки или функции, которые будут выполнять какие то действия вообще метод. Это в принципе есть функция, но только отличие в том, что функция она.
5:38 Функция она. Она не принадлежит никакому другому объекту, она она как бы общая. То есть мы создаем какую то функцию, вот там делаем тип, возвращаемый буль, вот и она, вот существует отдельно. Как в функциональный блок или как программа, то есть полноценная функция, и мы можем ее вызывать. В общем, то из любой программы и никаких проблем нету, вот пол, допустим, вот вот.
6:13 Наша наша функция, вот мы ее вызвали. Для нее даже экземпляры не нужны. Насколько я помню, для функции не нужны, так вот у методов может, то есть метод, это тоже что то типа функции и. Ну, допустим, создадим какой то метод, но он уже принадлежит функциональному блоку. Вот это как бы важное отличие, вот и просто так. Вот мы создали метод, допустим, да мы не можем просто так вызвать. Насколько вот я понимаю, мед вот для того, чтобы его вызвать нужно. Сначала обратиться к объекту вот это важное отличие. То есть мы должны сначала обратиться к объекту в данном случае в качестве объекта у нас экземпляр функционального блока, то есть ФБ 1. Мы должны ФБ 1 и затем вызвать его метод, вот это уже будет корректно.
7:08 То есть вот как бы корневое отличие то, что как бы метод это функция, которая спрятана, грубо говоря, обвернута в некий фуксальный блок. Ну или по другому сказать инкапсулирована, то есть принципе свойственен капсюляции, оно и есть. То есть мы как бы что такое инкапсуляция? Это как бы обертка в некую оболочку или капсулу, то есть капсуляции, то есть есть некая капсула, и внутри нее существуют методы, так вот. От этой капсулы является наш функциональный блок. То, что все внутри, она как бы можно к нему обратиться, только сначала обратившись к.
7:48 Классу или к объекту, или к экземпляру функционального блока? Вот давайте с вами решим такую задачу, допустим, мы хотим сложить. Допустим, мы хотим сложить 2 числа умножить 2 числа и разделить 2 числа для этого, давайте создадим в. В функциональном блоке 3 Перемены. Допустим, и НТВ это будет у нас, а Б. ИИ це. Хотя нам достаточно, мы же 2 часа складываем, поэтому, а и б нам достаточно. Давайте це сделаем, мы просто рассмотрим, как это можно сделать разными способами. Вот 1 мы можем сделать вот так, вот смотрите, мы можем просто написать с равно, а + б вот.
8:46 Ну соответственно дальше, ну нам еще придется 2 перемены создать, чтобы умножение сделать и деление. То есть есть, нам нужно для этого, ну давайте. Д и е. Хотя давайте сразу напишем вот так вот сум. Потом. Мульт, по моему муль этого умножения мультипликейшен и див див это отделение. Ну давайте, Див, нельзя, потому что это ключевое слово дивадин пусть будет. То есть, допустим, давайте сам ка + б, допустим, муль.
9:46 Да умножить на Б. И дивадин. Это А делить на Б. Так давайте сразу выровняем вот так, вот вот и еще давайте. Инициализируем перемены, допустим, 100 там. И, 10 к примеру. Вот. Соответственно, вот у нас есть некие переменные, и вот у нас можно прям в функциональном блоке сделать. Грубо говоря, вот эти все 3 арифметические действия, но они не доступны в извне. Вот то есть нам нужно, допустим, для того, чтобы сделать доступным извне, нужно их засунуть. Допустим, в ВАР аутпут вот сюда, вот и тогда мы можем здесь.
10:56 Как бы сделать доступ извне, но мы не будем сейчас подробно останавливаться на функциональном блоке. Мы сейчас рассматриваем методы, а можно сделать вот так. Вот мы, допустим, создадим метод сам. Возвращаемое значение Инты напоминаю, что метод это в принципе функция, а у функции может быть возвращаемое значение. Вот и дальше создадим, допустим, метод муль. Винтовой винтовой. И давайте создадим метод дивадин. Так секундочку. Диладин тоже винтовый.
11:41 Вот значит, 1 что очень важно в методе. Внутри метода. Переменные доступны перемены класса родительского класса так называемого. Давайте даже то есть у у нас родительский класс, это маев бы 1 и. У него здесь есть переменная, допустим, а и Б, и допустим, для того, чтобы нам в методе там сложить. Ой, умножить или сложить 2 числа мы можем?
12:18 Мы можем просто использовать перемены родительского класс, то есть они здесь доступны. Вот для для того, чтобы нам этот метод возвратил значение, нам нужно как бы понять, куда у него возвращает. Так вот, наименование метода это в принципе. Пользовательский тип, как функция, только метод и, соответственно, имя этого метода, это имя перемены пользовательского типа в данном случае пользовательский тип. Но он интеровый, то есть мы пишем вот так. Вот, Инт, равно ой сам равно, а + б.
12:59 Вот то есть смотрите, ошибок нет, хотя у нас здесь, а и бы не объявлены, то есть переменной, а и б они объявлены в родительском классе. Вот здесь, вот и они доступны в методе в методе, то есть мы можем напрямую обращаться. К переменным родительского класса вот также мы вот эта переменная, самая она тоже не объявлена, но переменная сам это переменная пользовательского типа, который называется метод и соответственно эта переменная имеет.
13:35 Возвращает значение Инд типа Инд. Что это значит, это значит, что мы можем? Допустим, в вот здесь вот в полосе ПРГ давайте функцию уже удалим, она нам уже не нужна вот эту. Вот это вот, вот и мы можем. Вызвать, допустим, метод, сам обратившись к. экземпляру функционального блока, вот ФБ 1 Точка, и вот видно, что у нас здесь доступны 3 метода. Вот у нас сам и, но просто так это. Сделать нельзя, почему потому, что метод он возвращает значение? Мы должны создать здесь какие то переменные, допустим, создадим переменную.
14:26 Ну допустим так, пусть и будет сам. Винтовой. И мы должны присвоить этой переменной. Результат выполнения метода, по сути, результат выполнения функции, но это результат выполнения метода. То есть вот это справа это выполнение метода класса ФБ 1. Классом является экземпляр функционального блока, и этот метод возвращает значение. Чтобы путаницы не было, допустим, там. Сумма 1 сделаем. Что здесь что то, что разные наименования, и вот мы записываем в переменную сам 1 Интовый?
15:13 Результат выполнения метода, надеюсь, я не запутал вас, так давайте теперь муль. Значит, то есть мульт, что такое мульт? Это метод, который имеет значение наименование муль, то есть этот метод. Грубо говоря, существует переменная муль инкового типа, и мы в нее можем записать некое значение, а? В нее будем результат умножения 2 чисел переменных, а и б которые находятся в родительском классе. Май ФБ, 1 и мы можем, так как этот метод принадлежит этому классу, мы можем напрямую обращаться к этим переменным.
15:59 Хотя они здесь не объявлены, вот ну и давайте, ну и давайте диф сразу запишем то, что диф 1 деление. Значит, мы запишем, значит, а делить на? А делить на Б. Ну и давайте вот здесь вот запишем, что. Муль. Да это очень равно, ФБ 1 Точка, моль окей и да, но мы не объявили переменную. Давайте у нас это будет муль 1. И сейчас. Ну, Дивадин, у нас есть, пусть будет диф 1 1. Так диф, 1 1 это очень равно, ФБ 1 Точка Дивадин. Вот и в принципе мы можем запустить уже в онлайн и посмотреть.
17:11 Будет ли это у нас работать, мы видим, что здесь функциональный блок есть 2 переменные 100 и 10, вот 10 и 100. Давайте даже вот эти вот переменные. Вот это вот уже удалим, чтобы она нам не мешала и не отвлекала. Так скажем вот, то есть у нас просто есть некий родительский класс с 2 переменами, а и б. И у этого класса есть 3 метода, так у нас есть ошибка, давайте посмотрим почему.
17:49 Так 3 ошибки. Невозможно конвертировать тип сам в тип Инд. Да вот еще момент то, что вот я неправильно сделал. Надо еще вот так сделать важный момент. То есть мы же метод, это как то же самое, что и функция, а функция она всегда ну как бы в нее передают. Какие то параметры если параметров нету, то. Все равно нужно сделать вот такие скобки. То есть как бы мы говорим, что мы хотим передать параметры, но их просто нету, поэтому такие пустые скобки.
18:36 То же самое и метод также вызывается, вот и вот мы видим, что вот. Функциальный блок 2 переменные, а и б 110. И вот есть у нас 3 метода Мальдив сам, причем обратим внимание, что вот здесь вот есть вопросики. Это что означает, это означает, что здесь вот справки написано то, что переменные? Где то вот здесь написано? Что переменные они существуют только при в момент вызова выполнение методов, а затем они стираются. То есть вот это результат у нас?
19:15 Здесь не сохраняется, его нужно куда то перезаписать, потому что перемены существуют только в момент выполнения, и этот момент как бы здесь вот. Его не поймать, вот и вот здесь, вот у нас соответственно. Вот сам это 100 + 10 значит 100 умножить на 10 это 1000 и 100 делить на 10 это 10.
19:39 Вот. Ну вот так вот можно использовать, то есть можно какие то, допустим, действия арифметические, так далее выносить в методы, и они будут как бы упакованы грубо. Говоря как функции внутри внутри функционального блока, и, ну и в принципе, это достаточно удобно, потому что они в дереве вот так вот хранятся, то есть и они. Эти методы, они как бы инкапсулированы именно к этому объекту и к этому классу они, то есть извне. Мы не можем обратиться просто к дивадин, сумадин муль 1 нам. Нужно обязательно обратиться сначала классу, и я сейчас покажу вам разницу. То есть, допустим, я просто покажу, что мы, допустим, копируем функциональный блок?
20:29 И давайте рефакторе, пусть будет это маев б 2 вот и. И у него будут так секундочку. У него будут такие же вот такие же методы. В общем, все то же самое, то есть я вообще ничего не буду менять, единственное, что я здесь. Тоже вот добавлю, она здесь уже есть принципе. Вот, а и б давайте сделаем, допустим, не 100 и 10, а, допустим, 16, ну или давайте там 8 и 2.
21:14 Так 8 и 2. Ну и соответственно. Так еще единственное. Давайте смотрите вот. Создадим еще 3 переменные для. Соответственно, для 2 Для 2 Класса или экземпляра, ну и сделаем экземпляр функционального блока для 2. Блока или класса, вот и соответственно вот здесь. Вот мы так вот скопируем и сделаем здесь. Дива 1 2 и вот здесь, вот 2. Ой! Так ну в принципе вроде как все, да и. И что я хотел показать этим примером то, что вот у нас соответственно все также работает? Вот ФБ 2 есть перемены, а и б здесь сумма, это будет 2 + 8 10 умножение. И деление, ну, в общем, понятно, и обратим внимание, что и здесь есть перемены. Айба и здесь есть перемены Айба, и здесь есть методы сумма 1 муль 1 и в 1 точнее.
22:43 Точнее, здесь их не видно, вот они с дивадин моль 1 сум, и здесь они одинаково называются. То есть методы одинаково называются, но при этом никаких конфликтов нету. Почему потому, что они инкапсулированы в рамках объекта или класса, то есть вот эти? Вот 3 метода инкапсулированы в Маев бы, 1 а вот эти 3 метода инкапсулированы. В мае б 2 если я правильно говорю, инкапсулированный, наоборот, капсулированы. Вот ну можете меня поправить, если я в чем то ошибаюсь, потому что я тоже только. Поверить в этой теме, ну и последнее, что я хотел показать, хотя на самом деле с методами здесь много чего есть. Но в общем, я думаю, будем двигаться постепенно.
23:26 Давайте создадим, точнее, скопируем. Еще Так еще раз скопируем. Вот. Рефакторинг сделаем маев б 3 окей. И последнее, смотрите, у методов есть еще входные переменные в орын. Тут то, то есть я уже говорил, что переменные родительского класса доступны в методе, но мы можем напрямую. Ну, то есть задать некие входные переменные и, допустим, давайте сделаем и на 1.
24:09 Интовый и им, 2 то есть мы сделаем такой метод, который, на который нужно отправить какие то значения. Вот ну и, соответственно, это будет и на 1 делить на. Ин 2. Ну и давайте везде добавим. Так и на 1 умножить на ин 2. И последнее, и Надин. + 7 2 Вот а Тогда вот здесь, вот у нас уже, а и б нам не нужны то. То есть у нас родительский класс вообще пустой? Но у него есть какие то методы, и у этих методов на входах есть входные переменные. Так вот откуда взять эти числа, а их можно взять непосредственно, отправив при вызове. То есть мы, допустим, создаем еще 1 экземпляр функционального блока в б 3?
25:28 Допустим, так мая в 3 вот создаем также 3 переменных сумм 3 муль. 3 И разница будет в том, что, ну, соответственно, вот здесь вот записываем туда, что то и разница будет в том, что.
25:49 Вот просто вот если так сделать, то будут ошибки, почему ошибки. Ну, давайте посмотрим даже, что за ошибки, что он будет писать. Смотрите! Виде для функции требуется ровно 2 входа. Кстати, он даже пишет, что это функция, то есть компилятор, внутренний компилятор, куда сис определяет. Метод как функцию это чисто, то есть метод, это чисто абстракция Кудесиса, то есть компиляторы, он все равно воспринимает это как функцию он. Но он говорит, что у этой функции должно быть 2 входа. Почему потому, что они вот здесь, вот они заданы эти входа и, соответственно, если есть входа, мы обязательно должны. Как бы на эти входа что то записать, то есть отправить, то есть мы должны прям прописать, что и Надин. Допустим, это у нас будет там, 9 а это ам, 2 допустим, это у нас будет 3.
26:43 Вот. И соответственно, это нужно сделать вот так каждый раз. И вот в таком случае ошибок уже не будет онлайн логин, давайте запишем. Вот и мы видим, что нас работает сумма, 9 +312-39-27 и тогда и 9 делить на. 3 3 Но разница как бы в том между 1 случаем, что здесь у нас.
27:21 Здесь у нас нет никаких переменных, не задано просто в пустой функциональный блок. Но это просто как родительский такой некий класс, в котором ничего нету. Но есть методы у него, вот и эти методы содержат эти универсальные методы, в которых есть входные. Переменные интовые 2 входа, ну и какое то действие, данном случае там математическая операция деления, умножения и сумма, и эти входа мы можем до. Мы должны задать непосредственно при вызове этой функции, точнее этого метода и, ну и в общем, то вот она как бы 3 разница.
28:04 Ну и последнее, что я хотел сказать, что во 1 переменные переменные. Функционального блока экземпляра доступны. Ну давайте вот здесь, вот создадим какой то перемен, допустим. Что сделано, а а б а, а б б ц ц, ну так чисто условно. Вот а ББТЦ и, допустим, а, а мы можем записать? Мы хотим обратиться к переменной экземпляра функционального блока ФБ 1. То есть мы ФБ 1 Точка и по идее как бы в обычном виде здесь, когда точку жмешь? Есть доступ к переменным, но здесь так как есть методы, то. К переменным нет доступа, но мы можем все равно обратиться к переменной. Вот так вот, а переменная у нас вот здесь, вот у нас, а вот и, соответственно, соответственно, ошибок нету соответственно в А. А у нас сейчас запишется 100 по моему, на сколько я помню?
29:21 Давайте посмотрим да 100. Ну, соответственно, также можно к переменной бы обратиться и так далее. Интересно другое, вот это я еще, кстати, сейчас вот непосредственно проверю. Вот экземпляры функционального блока ФБ, 3 можно ли обратиться к переменной метода? Вот это я не знаю, давайте с вами попробуем. Допустим, мы хотим в переменную, допустим, ББ записать. Значит, класс ФБ, 3 как экземпляр функционал блока, допустим, муль?
30:00 Не знаю, можно так сделать, кстати, вроде можно, да? Ага, ошибка все таки какая то ошибка, давайте посмотрим, что за ошибка. К выходу, а к выходу нельзя обратиться из за пределов вызова и не является входом муль. Да вот все таки вот так вот делать нельзя, вот. То есть к переменным класса, то есть экземпляров блока обращаться можно, а к переменным, к переменным метода, по всей видимости, обращаться нельзя. Единственное, давайте еще проверим в Варден Вар, допустим, сделаем вот так вот, а?
30:50 Просто есть, можно ли обратиться к не входной переменной, а просто к некой внутренней переменной. Допустим, это у нас ФБ, а? Секундочку. Давайте, ФБ 3 Точка, допустим, где это у нас было сейчас секундочку. В делении Дивадин. Точка. А по моему. А же здесь еще секунды дела, 1 а да? Скорее всего тоже так делать нельзя, да не не является ходом дивадин. То есть, но это тоже вот как раз свойство некой не капсуляции, то есть. Грубо говоря, доступ к внутренним переменным метода он закрыт извне. Вот, но на самом деле, возможно, это можно сделать как то открыть этот доступ при помощи так называемых модификаторов доступа, допустим. При создании метода вот здесь, вот здесь не не туда. Ну ладно, я это пока еще с этим не разобрался, поэтому давайте это с вами не будем пока что рассматривать. Ну, в общем, я думаю, что на этом урок.
32:13 Закончен и Пишите комментарии, задавайте вопросы, подписывайтесь на канал и переходите в телеграм чат. Специалистов кода СИЗ там можно задать любые вопросы, обсудить какие то темы, но также у меня есть курс по программированию среди куда сиз. И курс по обработке аналоговый сигналов ссылочка будет в описании до встречи в следующих уроках всем пока.
Расшифровка сделана автоматически (Yandex SpeechKit) и может содержать ошибки в терминах.