PDA

Просмотр полной версии : Как создать макрос?



VaBo
08.12.2016, 19:31
Собственно, второй день пытаюсь разобраться с CDS2 (ПЛК110), ну до этого еще видеоуроки посмотрел ;)
Нужно обединить несколько FBD блоков, пытаюсь создать макрос вот из этого.
При компиляции ругается "необходимо выражение на входе CLK_TRIG". Да, при сворачивании макроса присутствует вход in-4 (на поляне развернутого макроса его нет).
Как говорится, ЧЯДНТ и где почитать, как надо. Слово "макрос" настолько заезжено, что поиском по форуму не получается.

Gans
08.12.2016, 20:13
Здравствуйте, VaBo.
Подскажите, а где объявлены переменные "in-1", "in-2" и тд.?
Выложите саму программу?

VaBo
08.12.2016, 20:30
А что там выкладывать-то? Ну, выложил...
А разве входы макроса должны быть переменными? Переменные мы подключим позже, так ведь?

Gans
08.12.2016, 21:01
К большому сожалению макросами не разу не пользовался(
Но думаю Вашу задачу можно решить и по другому.
Вы, собираетесь написать кусок программы, который хочите многократно использовать в свое программе?
Если да, то во вложении мой вариант)
Я создал свой функциональный блок, реализующий Вашу логику. И теперь его можно использовать многократно)

P. S. В документации с макросами действительно не очень. Есть создание своих кнопок в меню CoDeSys, а вот для написания логики работы контроллера слабовато. За десять лет использования CoDeSys ни разу не сталкивался с макросами:rolleyes:

VaBo
08.12.2016, 21:09
Спасибо вам. Т.е. создание ФБ описано лучше? Посмотрю обязательно...

Gans
08.12.2016, 21:12
Расскажите, а что Вы хотели сделать?
Может удастся Вас направить в нужную сторону)

P. S. Как я понял MACRO - это сильно упрощенный вариант создания функционального блока именно для языка CFC.

Игорюня
08.12.2016, 22:22
А что вы хотели на входе получить? in-1, это переменная IN минус 1 ит.д. Вместо тире используйте знак подчеркивания, т.е. IN_1. И тип in_1 должен быть BOOL.

VaBo
09.12.2016, 00:01
Расскажите, а что Вы хотели сделать?

Освоить хотя бы на базовом уровне CDS (с перспективой на будущее) и поднять на этом совсем немного денег;)
Или вы об алгоритме?

жекон
09.12.2016, 07:48
Да и с макросами все нормально было просто входа привязать надо, и компилятор перестанет ругатся

VaBo
09.12.2016, 08:14
Да и с макросами все нормально было просто входа привязать надо, и компилятор перестанет ругатся
Да, в общем-то.
Но вариант с ФБ кажется более правильным.

жекон
09.12.2016, 11:16
Макрос хорош в том случае,есть готовая программа просто надо сделать компактнее, выделяешь кусок и упаковываешь в макрос.

Gans
10.12.2016, 11:20
Здравствуйте, VaBo.

Освоить хотя бы на базовом уровне CDS (с перспективой на будущее) и поднять на этом совсем немного денег;)
Или вы об алгоритме?

Для освоения на базовом уровне CDS Вам необходимо разобраться с: функциями, функциональными блоками и подпрограммами. В чем их отличия и особенности + освоить как минимум ST, SFC, CFC или FBD (мой выбор).

P. S. а макросы это для фанатиков CFC, я этим языком не пользуюсь по этому в первый раз от Вас и услышал - спасибо Вам за это :-)

VaBo
10.12.2016, 11:49
Не все так запущено - на ASM и С для микроконтоллеров я писАл лет 13 (с 99 года). Со школы знаком с цифровой схемотехникой - FBD не проблема (тем более часто использую FBD с контр. другого производителя). На ST - TraceMoud - тоже лет 6.
Проблемы только с узнаванием тонкостей CDS. Вот сейчас соображаю - есть ли способ сказать мастеру, чтобы постоянно не "долбился" в слейв, если тот не отвечает. Например, как в Лектусе сделано - несколько раз не ответил - ушел в "запас" с периодической проверкой.

Есть способ?

Gans
10.12.2016, 16:55
Да есть)

Для конфигуратора такая возможность выглядит так:
В каждом мастере есть параметр Byte (*Start/Stop*). Если в программе постоянно присваивать значение 254 - то данный мастер опрашивать слейва не будет. Если перестать присваивать 254 или присвоить 255, то мастер продолжит опрос слейва.

Так же тут есть параметры (*Last Error*) и (*Last Adress*) с их помощью можно идентифицировать нештатные ситуации.

VaBo
10.12.2016, 20:52
Спасибо, интересно...

Но таким образом я торможу весь мастер, а нужно затормозить только один юниверсал девайс, остальные ведь работают?

Как узнать, что только что произошло событие обмена по модбас и в переменных состояния появились обновленные данные?

И еще дилетанский вопрос - каким образом в CDS принято разделять задачи (по внешним событиям, по периодам выполнения)?
В микроконтроллерах, например, приходилось бить задачи на отдельные функции, создавать в глобальной зацикленной ветке счетчики-таймеры и флаги для задач (там же флаги от прерываний) и вызывать нужные ф-ии, при этом сбрасывая флаги.
Есть ли в CDS более продвинутый способ? Перемалывать все подряд с циклом 1 мС как-то не хочется.

Gans
10.12.2016, 22:58
У каждого "утеверсал модбас девайс" есть аналогичный параметр см. вложение работает аналогично.

Gans
10.12.2016, 23:22
Как узнать, что только что произошло событие обмена по модбас и в переменных состояния появились обновленные данные?
Ну так есть же "Ласт еррор", если ошибок нет значит данные актуальны.

И еще дилетанский вопрос - каким образом в CDS принято разделять задачи (по внешним событиям, по периодам выполнения)?
Можно реализовать как захочете, вот как нравиться так и делайте. Как-то стандартных подходов нет - каждый делает в соответствии со своим опытом и навыками.

В ПЛК_ПРГ всю программу делю на глобальный задачи (создаю отдельные подпрограммы) например:
1. Контур отопления.
2. Контур горячего водоснабжения.
3. Контур теплоносителя для системы вентиляции.

Дальше в данные программы реализую на SFC например:

1. Инициализация/проверка на достоверность переменных. и Ждем команды "пуск".
2. Пуск гидравлики.
3. Пуск регуляторов температуры.

После прихода команды "Стоп":
4. выключить насосы.
5. Закрыть регулирующий клапан.
6. Перейти в начало программы и ждать команды "пуск".

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

Например: позиционирование в начальное положение исполнительных механизмов для станка ЧПУ необходимо и при включении станка и при сбросе аварии и при завершении цикла. Таким образом 100% это должна быть отдельная подпрограмма с входом "старт позиционирования" и выходом "все отпозиционированно", количество входных входных переменных может быть и больше, но не меньше.
После команды "старт позиционирования" ждем подтверждения, что все отпозиционированно и идем дальше работать)

VaBo
12.12.2016, 11:17
У каждого "утеверсал модбас девайс" есть аналогичный параметр см. вложение работает аналогично.
А где вы взяли описание этих переменных - документацию вроде перешерстил, - не нашел...
И с ласт еррор мне непонятно следующее: обмен по сети идет асинхронно от основной задачи, а поллить эту переменную я могу только в самой задаче. Тогда большая вероятность что я либо пропущу ЛАСТ ЕРРОР, либо (небольшая вероятность) что я увижу ЛАСТ ЕРРОР, но при считывании адреса считаю уже следующий (валидный). Или при ошибке обмен останавливается до её сброса?

VaBo
12.12.2016, 11:19
И еще дилетанский вопрос - каким образом в CDS принято разделять задачи (по внешним событиям, по периодам выполнения)?
Можно реализовать как захочете, вот как нравиться так и делайте. Как-то стандартных подходов нет - каждый делает в соответствии со своим опытом и навыками.

Вроде нашел в мануале то, про что спрашивал - "конфигуратор задач", единственное - оперировать может только ПРОГРАММАМИ.
Не пользовались?