PDA

Просмотр полной версии : Програмные компоненты



zendo057
11.08.2013, 14:23
На LD написана большая по объему но простая (все вх/вых BOOL) программа все в одном PLC_PRG(PRG). Читается не удобно. Хочу разбить на несколько компонентов.Главная понятна PLC_PRG(PRG),а остальные что выбрать функц блок,функц или программа.Например создать hod,povorot...и тд. Или нет разницы. Но ведь для чего то это надо.

Sergey666
11.08.2013, 14:41
Функциональный блок и функцию надо использовать при вызове по условию кода , т.е не постоянно .
Программа организуется при необходимости "крутить" код всегда , для программы можно организовывать подпрограммы (Action).(Очень удобно)

zendo057
11.08.2013, 15:19
Ни чего не понял. Я еще совсем ,,зеленый,, объясните по подробнее,так сказать разжеванно.Особенно про (Action) как его создать.

amn
11.08.2013, 15:23
Основное отличие программы от функционального блока.
Программа имеет имя и она может быть использована в главной программе один раз.

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

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

С уважением, Михаил.

zendo057
11.08.2013, 17:16
Я так понял,что я могу создать PLC_PRG(PRG) и остальные,(PRG). А как создать(Action)?.И еще, вычитал что можно обойтись без PLC_PRG(PRG) одними(PRG),только нужно создать конфигурацию задач. Это так?.

amn
11.08.2013, 17:51
В списке POUs кликаете правой кнопкой мыши по объекту, для которого хотите создать действие (Action).
Выбираете Add Action.

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

Amko
11.08.2013, 18:10
Не нужны вам Actions. Вам надо разбить всю логику на несколько PRG и вызывать их последовательно в PLC_PRG.

zendo057
11.08.2013, 18:57
То есть так?
PLC_PRG(PRG)
povorot (PRG)
hod naz (PRG)
zajim (PRG)
hod vpered (PRG)
и так далее?
Tо есть PLC_PRG(PRG) это часть программы, остальные (PRG) остальная часть?.

Amko
11.08.2013, 19:32
Знаете, все что мы пишем - рекомендации. Как вы будете структурировать вашу логику - сугубо ваше решение.
Например, я сторонник разведения ВСЕЙ логики и всех операций по разным POU и FB. В PLC_PRG я лишь последовательно вызываю нужные POU в определенном порядке:


(*------*)
GetInputs();
Helps();
Povorot();
Hod_naz();
Nachalo();
SetOutputs();
(*------*)
Как будете делать вы - решать вам и только вам. Я в какой-то теме советовал вам выделить логику в несколько частей, потому что 280 строк в одном блоке я считаю перебором. Будете ли вы частично выделять блоки, или резать все на куски - думайте сами.

zendo057
11.08.2013, 20:31
То есть так?
PLC_PRG(PRG)
povorot (PRG)
hod naz (PRG)
zajim (PRG)
hod vpered (PRG)
и так далее?
Tо есть PLC_PRG(PRG) это часть программы, остальные (PRG) остальная часть?.

Amko ,большое ВАМ спасибо за рекомендации. Но так пойдет?

PS Языков програмирования кроме LD я не знаю.по этому и разобраться в вышеуказанном коде не могу. Отсюда такие как бы и глупые вопросы.

Sergey666
11.08.2013, 22:01
Тута товарищи забыли напомнить , что программа не только имя имеет , но и работает со СВОИми переменными или глобальными и вызывается откуда угодно.
Подпрограмма использует переменные программы или глобальные и вызывается из СВОЕЙ программы .
Поэтому самый простой способ структурирования , особенно на ЛД - создание подпрограмм(представляет собой код , выполняющий какую-либо задачу (любую)).

А для того чтобы понять надо пробовать разные способы и стили и читать руководство по программированию КДС , ЛД в КДС немного "круче" , чем в других системах.

amn
11.08.2013, 22:35
То есть так?
PLC_PRG(PRG)
povorot (PRG)
hod naz (PRG)
zajim (PRG)
hod vpered (PRG)
и так далее?
Tо есть PLC_PRG(PRG) это часть программы, остальные (PRG) остальная часть?.

Попробуйте сделать так, как Вам Amko рекомендует. Тогда у Вас получится PLC_PRG - основная программа, из которой будете вызывать все остальные программы (подпрограммы).

zendo057
11.08.2013, 22:57
Что бы все понять создал пример. Запускаю на симуляторе,включаю вход с1, реагирует только PLC_PRG.Может поправите на примере, как обратится к другим PRG.

amn
12.08.2013, 01:10
Выкладываю пример. Вызывать программы лучше на языке ST. Это просто. Я написал коментарии в примере. На всякий случай там есть вызов на LD в функциональном блоке main, но я на LD не работаю.

Yegor
12.08.2013, 07:53
С. Макконнелл, Совершенный код

Amko
12.08.2013, 08:14
Что бы все понять создал пример. Запускаю на симуляторе,включаю вход с1, реагирует только PLC_PRG.Может поправите на примере, как обратится к другим PRG.
В вашем примере PLC_PRG будет иметь следующий вид:
9562
Как я выше писал: в PLC_PRG производится вызов всех остальных программ. Логика работы установки разбита на отдельные программы.

capzap
12.08.2013, 08:34
Что бы все понять создал пример. Запускаю на симуляторе,включаю вход с1, реагирует только PLC_PRG.Может поправите на примере, как обратится к другим PRG.

неплохо бы еще воспользоваться меню КДС: Проект->Контроль->Неиспользуемые переменные чтоб убрать ненужный мусор

zendo057
13.08.2013, 20:52
Ура! Вроде все получилось. Все работает. Только вот компилятор говорит- Предупреждение 1503:POU не имеет выходов. Результату присвоено значение TRUE. Так и должно быть? Теперь буду учиться создавать FB.

amn
13.08.2013, 23:10
Ура! Вроде все получилось. Все работает. Только вот компилятор говорит- Предупреждение 1503:POU не имеет выходов. Результату присвоено значение TRUE. Так и должно быть? Теперь буду учиться создавать FB.

Наверное в вашем ФБ есть входы и нет выходов. Если так и было задумано, то нормально. Но обычно ФБ выполняет какую-то отдельую задачу. И для этого ему нужды входные параметры. После выполнения он должен выдать результат, вызвавшей его программе, для этого нужны выходные параметры. Если нет выходных параметров, то очевидно, что ФБ использует глобальные переменные, которые доступты везде. Старайтесь не использовать глобальные переменные, только в крайнем случае, если это оправдано. Это избавит вас от ошибок, которые трудно будет найти.

Sergey666
13.08.2013, 23:45
Наверное в вашем ФБ есть входы и нет выходов. Если так и было задумано, то нормально. Но обычно ФБ выполняет какую-то отдельую задачу. И для этого ему нужды входные параметры. После выполнения он должен выдать результат, вызвавшей его программе, для этого нужны выходные параметры. Если нет выходных параметров, то очевидно, что ФБ использует глобальные переменные, которые доступты везде. Старайтесь не использовать глобальные переменные, только в крайнем случае, если это оправдано. Это избавит вас от ошибок, которые трудно будет найти.

А , чё это ?????????
Если нет выходных параметров то очевидно головотяпство , но на выполнение программы это не влияет .
Причем здесь глобальные переменные ???? В чем они виноваты???? Если вы претендуете на роль учителя и благодетеля своими примерами - корректно выражайтесь. Человеку , не желающему разбиратся , "глобальная переменная" ни о чем не говорит.
Например в моих проектах 90% переменных глобальные и все работает .

Мож книгу написать . Так её читать не будут или начнут и бросят , ведь может быть на форуме найдется добрячёк , который весь код напишет.

zendo057
14.08.2013, 19:42
Уважаемый Sergey666. Я еще совсем новичек и если знаете-подскажите, как это делает amn идругие учасники. Но нравоучения,да еще в такой форме,поменьшей мере даже в чем то оскарбительны.Теперь по теме.Я пытаюсь создать не FB a POU Вкратце еще раз. большая программа с входами и выходами все работает. Хочу разбить ни подпраграммы .Делаю следующее:1.Создаю новые POU с названиями

2 В PLC_PRG в новой строке создаю напр. TON переименовую его в название POU
3.Принимает такой вид(во вложении)
4.компилирую-выдает предупреждения по каждому POU. Это нормально?

Amko
14.08.2013, 20:04
:D Что-то новое) Скрин из Codesys'a нарисовать в PPoint :D.
Скиньте проект, глянем.

zendo057
14.08.2013, 20:17
Вот пример

amn
14.08.2013, 20:36
А , чё это ?????????
Если нет выходных параметров то очевидно головотяпство , но на выполнение программы это не влияет .
Причем здесь глобальные переменные ???? В чем они виноваты???? Если вы претендуете на роль учителя и благодетеля своими примерами - корректно выражайтесь. Человеку , не желающему разбиратся , "глобальная переменная" ни о чем не говорит.
Например в моих проектах 90% переменных глобальные и все работает .

Мож книгу написать . Так её читать не будут или начнут и бросят , ведь может быть на форуме найдется добрячёк , который весь код напишет.

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

На роль учителя мне еще рано претендовать. Мне нравится этот форум за то, что тут "живут" отзывчивые люди. Мне помогают, и я стараюсь помочь, чем могу. Заодно и учусь в процессе.

С уважением, Михаил.

zendo057
14.08.2013, 21:20
Но если одни и те же переменные в разных POU то как без глобальных. Локальные ведь не будут видны . И вы мне скажите предупреждения которые выдает компилятор. ЭЭЭто нормально. Или должно быть 0 ошибок 0 предупреждений. проект в LD.

amn
14.08.2013, 22:01
Но если одни и те же переменные в разных POU то как без глобальных. Локальные ведь не будут видны . И вы мне скажите предупреждения которые выдает компилятор. ЭЭЭто нормально. Или должно быть 0 ошибок 0 предупреждений. проект в LD.

В основной программе (PLC_PRG) у вас есть какие-то переменные. Чтобы они стали доступны POU надо их передать ему в качестве параметров. Чтобы такая возможность появилась, в POU объявляете переменные следующим образом:

VAR_INPUT
var1: BOOL; (*первый входной параметр блока*)
var2: BOOL; (*второй входной параметр блока*)
END_VAR
VAR_OUTPUT
q1: BOOL; (*первый выходной параметр блока*)
q2: BOOL; (*второй выходной параметр блока*)
END_VAR
VAR
var3: BOOL; (*первая локальная переменная блока*)
var4: BOOL; (*вторая локальная переменная блока*)
END_VAR

В этом случае в блоке POU появятся дополнительные входы и выходы. Обратите внимание, у вас в примере у блоков нет параметров и поэтому они выглядят пустыми квадратиками.

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

Если сделаете все правильно будет 0 ошибок и 0 предупреждений.

zendo057
14.08.2013, 22:25
Михаил.Вы очень многое мне подсказываете, я очень Вам благодарен.Я даже не подозревал, что я такой тупой.Но в Вашем коде я ни ни.Вы можете на моем примере все это объяснить?

amn
14.08.2013, 23:11
Я вам показал как объявлять переменные. Откройте POU re. Видите окошко для объявления переменных, где у вас написано
PROGRAM re

дальше ниже у вас объявлена локальная переменная a7.

VAR
a7: BOOL;
END_VAR

Локальная переменная не видна из основной программы. Она доступна только в вашем POU. Если поместить ее между словами

"VAR_OUTPUT" и "END_VAR", то ее значение уже будет доступно в основной программе, вызывающей POU.
Например так

VAR_OUTPUT
a7: BOOL;
END_VAR

В этом же POU у вас есть еще две переменные a1 и c2. Чтобы они были доступны из основной программы, поместим их между словами "VAR_INPUT" и END_VAR". В этом случае они будут входными параметрами вашего POU.
Например так:

VAR_INPUT
a1: BOOL;
c2: BOOL;
END_VAR

Текст расположенный между "(*" и "*)" является комментарием и в компиляции не участвует.
Например:

(*комментарий*)

zendo057
14.08.2013, 23:44
Вся моя тупизна заключалась в том,что объявление переменных было таблицей,а там не видно этих VAR END и тд. Когда перевел в другой формат то сразу стал понятен весь код. Спасибо Михаил Вам.

zendo057
16.08.2013, 18:36
Добрый всем день.Большая просьба подскажите пожалуйста где я туплю.Как мне подсказал уважаемый amn-теоретически я все понял.Создал проект(в приложении) но всеравно при компиляции выдает сообщение.
Тема такова:Входная переменная с1 включает а1,значение которой передается в POUre,а1 включаясь включает а2 значение которой передается в PLC_PRG,а2 включаясь включает а3.
Бъюсь уже три дня а толку нет.Преречитал РП вроде все делаю правильно.Может исправите в моем примере?

capzap
16.08.2013, 19:10
Добрый всем день.Большая просьба подскажите пожалуйста где я туплю.Как мне подсказал уважаемый amn-теоретически я все понял.Создал проект(в приложении) но всеравно при компиляции выдает сообщение.
Тема такова:Входная переменная с1 включает а1,значение которой передается в POUre,а1 включаясь включает а2 значение которой передается в PLC_PRG,а2 включаясь включает а3.
Бъюсь уже три дня а толку нет.Преречитал РП вроде все делаю правильно.Может исправите в моем примере?


специально для начинающих выложены всевозможные примеры http://www.owen.ru/forum/forumdisplay.php?f=49
Почему не воспользоваться бы?

zendo057
16.08.2013, 19:47
Я все это уже читал и по образцу и по совету в роде,как мне кажется ,я все делаю правильно. Пожалуйста очень прошу исправте в моем примере и отправте.А может это в LD невозможно?

Василий Кашуба
16.08.2013, 20:08
Я все это уже читал и по образцу и по совету в роде,как мне кажется ,я все делаю правильно. Пожалуйста очень прошу исправте в моем примере и отправте.А может это в LD невозможно?
Напишите подробное ТЗ, что должна делать программа на реальном объекте.

capzap
16.08.2013, 20:19
Я все это уже читал и по образцу и по совету в роде,как мне кажется ,я все делаю правильно. Пожалуйста очень прошу исправте в моем примере и отправте.А может это в LD невозможно?

если, как Вы пишите, прочитали все инструкции, то должны знать как любое ПОУ написанное на любом языке преобразовать в LD

следовательно, что можно исправить в одном, то исправляется и в другом

zendo057
16.08.2013, 21:07
Уважаемый Василий Кашуба.Я создал большой по объему проект 280 строк все в одном PLC_PRG.Все работает все устраевает. Но в будущих проектах хочу делить программу на отдельные части создавая POU. Поэтому и прошу помощи как правильно это сделать. Для зтого создал проект из трех строк(во вложении) Тема:Вход контроллера c1 включает переменную а1,которая передает значение в POUre,там она включает переменную а2,которая передает значение обратно в PLC_PRG включая там выход а3. Все вроде делаю как и написано,как я понимаю,Но при компиляции выводятся предупреждения-код не будет сгенерирован.

zendo057
16.08.2013, 21:28
Спасибо отдельное capzap конвертировав проект я сразу нашел свою ошибку.Если что будет не понятно опять буду обращаться.С уважением Владимир.

amn
16.08.2013, 21:36
Владимир, попробуйте язык CFC. Мне кажется вам будет проще в нем работать. Вот скрин вашей задачки на CFC.

Василий Кашуба
16.08.2013, 21:54
Уважаемый Василий Кашуба.Я создал большой по объему проект 280 строк все в одном PLC_PRG.Все работает все устраевает. Но в будущих проектах хочу делить программу на отдельные части создавая POU. Поэтому и прошу помощи как правильно это сделать. Для зтого создал проект из трех строк(во вложении) Тема:Вход контроллера c1 включает переменную а1,которая передает значение в POUre,там она включает переменную а2,которая передает значение обратно в PLC_PRG включая там выход а3. Все вроде делаю как и написано,как я понимаю,Но при компиляции выводятся предупреждения-код не будет сгенерирован.
Для того, чтобы правильно поделить программу на блоки, мне как раз и нужно ТЗ. Мои программы выглядят примерно так.

zendo057
19.08.2013, 21:26
Всем большое спасибо за помощь. С POU я разобрался с FB не очень.Подскажите такое дело.(Правой мышкой на PLC_PRG--действие).Оно(действие)находится в самой программе и как мне кажется для простой LD программы самый нормальный вариант,разбитие программы на действия.Само это действие я создал,а вот как сделать чтобы работало-не знаю.По аналогии с POU -ничего не выходит.Может где какой пример посмотреть.Прошу извинить может быть за наивность,сам я не програмист,но стараюсь грести на этой лодке изо всех сил чтобы не отстать.И еще вопрос,Зачем в автообъявлении VAR_IN_OUT.

Amko
19.08.2013, 21:35
и как мне кажется для простой LD программы самый нормальный вариант,разбитие программы на действия.
Нет) Для простой программы самый простой вариант разбивать ее на меньшие программы (PRG). С действиями вы только запутаетесь.
IN_OUT - тип вход/выход. То есть можно эту переменную со входа прочитать, подумать, изменить ее и записать на выход.

zendo057
19.08.2013, 22:18
А если мне нужно обратиться с гл прогр.в прогр1,с прог1 в прог2,тутже с гл в прог2 и тд. Токак? Можно конечно через главную но это больше программа.Как я понял поу можно объявить только в одном месте и только один раз.

amn
19.08.2013, 22:25
С POU я разобрался с FB не очень.

FB это тот же POU. В разделе объявления переменных задаете переменную, в качестве типа задаете имя функционального блока. Все. Экземпляр функционального блока описан. Теперь можете его использовать как POU. И таких переменных может быть много.
Например, у Вас есть FB с именем PR. В PLC_PRG в разделе объявления переменных описываете переменную

var1:PR;

После чего в программе вызываете

var1();

amn
19.08.2013, 23:22
А если мне нужно обратиться с гл прогр.в прогр1,с прог1 в прог2,тутже с гл в прог2 и тд. Токак? Можно конечно через главную но это больше программа.Как я понял поу можно объявить только в одном месте и только один раз.

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

Если вам надо использовать повторяющийся код, но использовать его независимо, то используйте ФБ, для каждого независимого повторяющегося фрагмента свой экземпляр. Код будет один и тот же, а данные разные.

zendo057
19.08.2013, 23:40
При открытии ФБ вываливается ассистент ввода и два варианта:экземпляры и реализация.При нажатии одного и второго все работает, но при наж. реализация цепочка как бы не активна, хотя она включена.А это для чего?

zendo057
20.08.2013, 00:13
[QUOTE=amn;117064]Что значит обратиться к какой-либо программе?

A если так.Есть поу1,поу2 и тд.В поу2 пишу програмку.Переменная вход контроллера-перем с поу1-перем с гл прогр-выход.Ведь перем с поу1 не видна в поу2.А с гл прогр поу1 тоже вызывается.А поу объявляется только в одном месте.

Василий Кашуба
20.08.2013, 08:46
[QUOTE=amn;117064]Что значит обратиться к какой-либо программе?

A если так.Есть поу1,поу2 и тд.В поу2 пишу програмку.Переменная вход контроллера-перем с поу1-перем с гл прогр-выход.Ведь перем с поу1 не видна в поу2.А с гл прогр поу1 тоже вызывается.А поу объявляется только в одном месте.
Если переменные глобальные, то их видят все ПОУ, в которых они объявлены.

amn
20.08.2013, 21:52
Переменная вход контроллера-перем с поу1-перем с гл прогр-выход.Ведь перем с поу1 не видна в поу2.А с гл прогр поу1 тоже вызывается.А поу объявляется только в одном месте.

Что-то я не совсем осознал вопрос. Можно его задать по-другому? Лучше на конкретном задании, чтобы было понятно о чем идет речь. Когда задаете имя входу или выходу контроллера то эти переменные уже глобальные и доступны везде. Когда вызываете программу, доступны только входные и выходные переменные этой программы. В нее (в программу) передаете в качестве параметров те переменные, которые хотите использовать внутри программы.

Sergey666
20.08.2013, 22:47
Что значит обратиться к какой-либо программе? Тут могут быть разные варианты. Можно программе на вход послать какое-то значение или наоборот, с выхода прочитать результат. При вызове программа, используя входные параметры, выполняется и выдает результат с помощью выходных параметров. Если вы еще раз вызвали POU в этом же цикле ПЛК, с другими значениями, то выходные значения также изменятся. Если выходные значения POU, к примеру, меняют состояние дискретных выходов ПЛК, то они будут соотвествовать результату после последнего вызова POU.

Если вам надо использовать повторяющийся код, но использовать его независимо, то используйте ФБ, для каждого независимого повторяющегося фрагмента свой экземпляр. Код будет один и тот же, а данные разные.
Можно использовать по всякому (разному) , но ЗНАЧЕНИЯ ВЫХОДАМ ДОЛЖНЫ БЫТЬ ПРИСВОЕНЫ В ПОСЛЕДНЕМ ВЫЗОВЕ ( кроме прерываний) и в таком случае будет работать актуальный . Он по любому будет работать (актуальный - последний в цепочке вызовов) , это надо понять и принять ( и простить) , так работает программа на любом контроллере .
Все промежуточные вычисления(и действия) имеют смысл если они остаются актуальными на момент ПОСЛЕДНЕГО ВЫЗОВА ,но результаты этих действий присвоенные промежуточным переменным будут актуальными. Например можно вызывать одну функцию с разными входными и результаты присваивать разным переменным , но с функциональным блоком это может не пройти , т.к будут рекурсии ( вернее псевдорекурсии) .
ВООБЩЕ к чему это все???? Чего хотите конкретно , есть множество способов запуска программ "через цикл" (в разных циклах контроллера) с целью равномерной нагрузки на процессор.

zendo057
20.08.2013, 22:52
Благодарю amn и Василий Кашуба.Все так просто,глобальные переменные видны везде,а я не додул. Это сказывается отсутствие опыта.Но про ,,действие,,вы расскажите.Пожалуйста.

Sergey666
20.08.2013, 23:05
Благодарю amn и Василий Кашуба.Все так просто,глобальные переменные видны везде,а я не додул. Это сказывается отсутствие опыта.Но про ,,действие,,вы расскажите.Пожалуйста.

"Действие" или Action есть подпрограмма , вызываемая из "своей" программы и исползует переменные своей программы или глобальные , результаты могут быть любыми.

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

Василий Кашуба
21.08.2013, 06:57
"Действие" или Action есть подпрограмма , вызываемая из "своей" программы и исползует переменные своей программы или глобальные , результаты могут быть любыми.

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

zendo057
22.08.2013, 22:41
Уважаемые коллеги.Ваши консультации мне пошли на пользу,у меня все срослось и все получилось.Теперь ответте только по проще,какое в плк минцкл выставить.Статистик показывает 5мс.Ставил 6 вроде нет глюков 10 то же нет.Конфигурация:плк110-60р.3 входных 3 выходных модуля по 32 разряда.входы сухие контакты выходы реле. rs485.прот. ОВЕН.