Вход

Просмотр полной версии : Контроль нескольких FBD с одним именем в CFC



Алексей Александрович
27.10.2014, 07:44
Здравствуйте. Помогите разобраться. Программа на CFC. Случайно создал два блока R_TRIG c одним и тем же именем (условно Т1). СОДЕСИС не обругал и не предупредил. Поэкспериментировал с переменными и ничего не понял. В документации тоже ничего не нашел как такие дубликаты работают. Два вопроса. Можно ли включить проверку на дублировании имени и как они взаимодействуют? Заранее благодарен.

lara197a
27.10.2014, 08:13
Они не будут правильно работать.
Проверка на вкладке Проект.
Сначала Проект-Компилировать
Потом Проект-Контроль.

Алексей Александрович
27.10.2014, 08:29
Там четыре контроля. Ни один не сказал что у меня в проекте дубликаты.

lara197a
27.10.2014, 08:46
А КДС не запрещает вызов одной переменной в нескольких местах.
Только на выходе у вас всегда будет значение последнего.

Yegor
27.10.2014, 08:46
Объявить два блока с одним именем компилятор вам не даст. Специально сейчас удостоверился, хоть и знал. Это одна из базовых проверок, которые делает любой вменяемый компилятор.
Error 3703: TEST1 (3): Several declarations with the same identifier 'R1'Обращаться же к блоку в самой программе (нижняя половина окна; в случае CFC — схема) вы можете хоть триста раз. Порядок вызова в случае неоднократного обращения указывается номерком в правом верхнем углу каждого блока (для отображения щёлкните правой на схеме и выберите Order > Show order).

melky
27.10.2014, 08:52
И вроде не скажет, тоже иногда при копировании блока забываю поменять имя, потом ищу косяк. CodeSys не отслеживает несколько блоков с одним именем.

Алексей Александрович
27.10.2014, 09:00
Да в том то и дело что эта ошибка не появляется. Компилятор спокойно проглатывает. Специально в подряд поставил триггеры с именем Т1. Скомпилировал и загрузил в ПЛК. С переменными полный бардак. Но КОДЕСИС меня не предупредил о дубликатах.

lara197a
27.10.2014, 09:01
Там четыре контроля. Ни один не сказал что у меня в проекте дубликаты.

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

melky
27.10.2014, 09:08
lara197a на самом деле это косяк Codesys, суть в том, что вызов того же R_Trig и так далее в программе обычно делается РАЗНЫМИ переменными, попробуйте от двух разных переменных соединить выходы - Codsys этого сделать не даст.
А тут - влегкую. потому что это вызов FB или FUN или программы. Могли бы сделать проверку по булевым переменным (из выходу).

Алексей Александрович
27.10.2014, 09:14
Большое всем спасибо. Понял что с этим косяком придется бороться в ручную.

Николаев Андрей
27.10.2014, 09:56
Господа, простите, но я и не понял в чем касяк?
CODESYS не запрещает Вам вызывать один и тот же экземпляр одного и того же блока в разных частях одной программы?
Например в середине программы вызвали и инициализировали таймер.
В конце вызываете этот же экземпляр этого же таймера и считываете значение выхода. В cfc для этого надо вставлять весь блок. Где здесь ошибка?

Или я что-то не так понял?

lara197a
27.10.2014, 09:59
Андрей, я про это же еще в 8 утра написал....

Николаев Андрей
27.10.2014, 10:00
Так то да :) но я пытаюсь понять почему человек по прежнему считает это БАГом...
Может мы чего то недопоняли...

capzap
27.10.2014, 10:02
Большое всем спасибо. Понял что с этим косяком придется бороться в ручную.

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

melky
27.10.2014, 10:30
Если правильно понял, то речь об этом.
При этом переменный a и b естесственно разные и можно было бы вести контроль по данному параметру. Но от подобного в Codesys нет никакого контроля.

Алексей Александрович
27.10.2014, 12:37
Совершенно верно. Если бы я специально вызывал один и тот же ФВ я бы это знал. Но я про то что нет контроля от случайного повторения имени.

amn
27.10.2014, 12:39
Это не косяк. Помимо триггера есть масса других ФБ, где бывает необходимость использовать одни экземпляр ФБ в одной программе с разными параметрами. Надо просто внимательно писать программу :)

melky
27.10.2014, 13:07
amn да нифига CDS не ругается, даже если не копируешь блок в CFC а создаешь новый и пишешь ему существующее имя.

Вольд
27.10.2014, 13:14
Извиняюсь, это не косяк. Я сам часто пользуюсь в программе одним экземпляром таймера. Просто надо следить за тем, чтобы один и тот же ФБ не вызывался одновременно в разных частях программы. Если это не возможно, то надо объявлять разные экземпляры ФБ. Если в ПЛК памяти программ много, то экономить ее нет смысла, и лучше объявлять разные экземпляры ФБ. У SIEMENS ПЛК дорогие, а памяти там с гулькин нос. Вот при работе с такими ПЛК, если программа большая, память приходится экономить. ПЛК "ОВЕН" дешевые, а памяти море (Да здравствует "ОВЕН" !!!) и беспокоится по поводу нехватки памяти нечего.

amn
27.10.2014, 14:37
amn да нифига CDS не ругается, даже если не копируешь блок в CFC а создаешь новый и пишешь ему существующее имя.

А почему он должен ругаться? Экземпляр ФБ может быть вызван сколько угодно раз с любыми параметрами.

melky
27.10.2014, 15:00
amn это да, только когда на вход одного и копию другого блока подаешь две разных булевых переменных, не происходит контроля при проверке и компиляции. Фактически если взять два таймера с одним именем, на входы которых подать две разных переменных на IN, то это равнозначно работе одного таймера с блоком И на входе и временем, соответствующем последней установленной копии.

amn
27.10.2014, 15:18
И это очень хорошо. Иначе в программе нельзя было бы вызвать один ФБ несколько раз с разными параметрами. А такое часто бывает нужно. Представьте себе ситуацию: включен таймер на определенное время. Произошло некое событие, по которому нужно только изменить время в таймере а весь остальной алгоритм оставить без изменения. Вызываем этот же таймер с новым временем и все. Очень удобно.

capzap
27.10.2014, 15:21
мелкий, уже понедельник
Вы более конкретнее излагайте, если Вы в окне объявлений вписали два фб с одинаковым имегем компилятор это не прлпустит, если один объявленный фб, используется в программе несколько раз, значит так нужно программисту, почему это должно беспокоить компилятор.

запомните одно из правил программирования: ошибке не всёравно кто её обнаружит

melky
27.10.2014, 16:11
В окне объявлений переменных в режиме CFC CDS объявляет две переменных с одним именем не ругаясь. И даже больше в любых комбинациях.

Если как в сообщении 15 поставить 2 таймера с одним именем, то таймер запустится только в том случае, если ОБЕ переменных будет true. То ест CDS дефакто между переменными a и b как бы молча ставит логическое И. Хотя его нет, и ни на что не ругается.
То есть не запускается таймер вовсе по одной переменной, так как вы запускается один таймер в разных местах ?
Без шагов. С шагами понятно.

amn
27.10.2014, 16:51
так как вы запускается один таймер в разных местах ?
Без шагов. С шагами понятно.
Запускаем в ST. С шагами :)

Что Вы сделали с компилятором? Как Вам это удается? :)

capzap
27.10.2014, 16:52
был бы я не в пути,сам бы посмотрел в кдс, а как себя ведет контроль поворяюшихся переменных?

зы только обратил внимание,спасибо белгородцам, окно компилятора то на Вашем скрине отсутствует

melky
27.10.2014, 16:58
amn да откуда ж я знаю как?, сижу вбиваю, а ошибок нет.
Сорри, да, если вводить имена в окно переменных, тогда ошибки отлавливает при компиляции, но если сделать копи-паст блока, то CDS не видит ошибок, как результат потом выискивать в программе, где забыл переименовать блок.

amn
27.10.2014, 17:14
Бывает еще такое: переменную объявил, задаешь имя блока, а тебе предлагают объявить переменную еще раз. Тогда появляется еще одна переменная в окне объявлений. Но тут компилятор уже ругается.

Валенок
27.10.2014, 21:47
сижу вбиваю, а ошибок нет.
руками ?

Бывает еще такое: переменную объявил, задаешь имя блока, а тебе предлагают объявить переменную еще раз.
Небывает. Каждый раз оказывается ошибка в объявлении при ручном забивании. Например
var
a ; int;

или
var
' a : int;

вбивая "a" в код только автообъявитель сделает
var
a ; int;
a : int;

Вообщем - фольклор

amn
27.10.2014, 22:23
Небывает. Каждый раз оказывается ошибка в объявлении при ручном забивании.

Не только при ручном. При объявлении переменной b в разделе объявления переменных ввел только имя, после чего нажал Ctrl+Enter. Все остальное ввелось автоматически. Тем не менее смотрите результат. Угадайте, что будет после нажатия кнопочки OK :)

Валенок
28.10.2014, 08:55
В ??? ввели 'c', включился автодекларатор, зачем то залезли в поле имени и вбили 'b'
Вывод - а не надо в автодеклараторе юзать поле имени. Тип и и др. св-ва - пож-ста, имя-то зачем коли обозначено именно то - что объявили ? Мне вот такая фигня в голову не приходит и я не мучаюсь такой фигней как ТС.
Вы встреваете в автообъявление, а среда пожимает плечами - жираф большой,ему видней

amn
28.10.2014, 09:52
Все гораздо проще. В поле имени не обязательно лезть. Такая фигня у меня получилась, когда я в окне объявлений переменных два раза объявил переменную а и один раз b. Можете сами попробовать.

Валенок
28.10.2014, 18:36
Такая фигня у меня получилась, когда я в окне объявлений переменных два раза объявил переменную а

Каждый раз оказывается ошибка в объявлении при ручном забивании. Автодекларатор невидит неправильно забитые переменые.
Еще раз : вмешиваетесь в хорошо работающую автоматику - сами разбирайтесь с последствиями. При чем тут КДС ?

Алексей Александрович
29.10.2014, 06:30
Автодекларатор невидит неправильно забитые переменые.
Еще раз : вмешиваетесь в хорошо работающую автоматику - сами разбирайтесь с последствиями. При чем тут КДС ?

НЕВИДИТ ХОРОШО РАБОТАЮЩАЯ АВТОМАТИКА Одно противоречит другому.

Но у меня другой вопрос.

14982

На кой черт мне еще где то вставлять Т1, когда мне достаточно A,B,C и D. Если они глобальные то вообще доступны во всех ПОУ.
Или чего то не понимаю?

capzap
29.10.2014, 06:52
может еще попробуете утверждать что залив 76-й бензин в любую немецкую машину и она не поедет, что их автопром из-за этого никудышный. Смысл был не в среде разработки, а в человеке который ей пользуется

Алексей Александрович
29.10.2014, 07:11
Но так и не объяснили зачем мне еще один Т1.

capzap
29.10.2014, 07:35
объяснение сейчас Вам всёравно ничего не даст, пока Вы не напишите достаточно крупный проект. например какой нибудь технологический процесс имеет несколько фаз, часть из них работают по времени, друга часть например по температуре, эти фазы можно разбить на отдельные блоки и в каждом будет свой таймер,занимая определенный ресурс, а можно всё это разместить в одном поу и по мере перехода из одной фазы в другую использовать один и тот же таймер. на cfc это трудно представить, но пример переходов в этом языке я выкладывал

Алексей Александрович
29.10.2014, 08:09
В CFC как раз с переходами все в порядке. (и с условными и безусловными). Но вот например надо управлять двумя электромагнитами №1 0.3-0.5сек №2 0.9-1.2 сек. Не синхронно. И как я эту фигню напишу на одном таймере. Нет конечно можно извратится и с помощью математики. Но не думаю что это сэкономит ресурсы. А сложные проекты я распределяю между несколькими ПЛК. А в очень сложных есть промышленные компьютеры. Но пока до этого не доходило.

amn
29.10.2014, 09:48
На кой мне еще где то вставлять Т1, когда мне достаточно A,B,C и D. Если они глобальные то вообще доступны во всех ПОУ.
Или чего то не понимаю?

Если Вы используете функциональный блок (FB), то у него может быть несколько экземпляров. Т1 как раз и обозначает имя объявленного экземпляра функционального блока TP. Не путайте с программой (PRG), которая является глобальной в единственном экземпляре с единственным именем, там как раз имя экземпляра указывать не надо.

Алексей Александрович
29.10.2014, 10:07
Я про A,B,C и D а не ТР (объявлены как глобальные)

capzap
29.10.2014, 11:25
Вы привели задачу, в которой не подразумевается использование одного таймера, в чем сложности то, спрашивали зачем один экземпляр несколько раз используют, Вам ответили, пример привели когда это может быть, кто Вас заставляет именно так поступать, добавте другой экземпляр того же блока только с другим именем

Валенок
29.10.2014, 21:21
Я про A,B,C и D а не ТР (объявлены как глобальные)
Да пофигу как и где объявлены Ваши ABCD. Здесь T1 - не функция (учим матчасть - классическое определение функции ?)
Коли вызвали T1 - код фб отработает с новой порцией данных, а т.к. фб может иметь "скелеты в шкафу" от предыдущих вызовов
- получаете то, что Вы считаете гимором, а те кто осознает работу фб - нормой.
Не хотите отработки кода - обращайтесь к полям. Хотите разное поведение для разных данных - делайте разные фб. Уже 100^500 раз сказали


НЕВИДИТ ХОРОШО РАБОТАЮЩАЯ АВТОМАТИКА Одно противоречит другомуНажмите Alt+F8, противоречия отвалятся. Данная автоматика не учитель младших классов:
"А теперь, дети, напишем букву 'A' Все написали ? Покажите ..."
Здесь по взрослому - написали, сдали, утром в кассу за результатом.