Макрос хорош в том случае,есть готовая программа просто надо сделать компактнее, выделяешь кусок и упаковываешь в макрос.
Вид для печати
Макрос хорош в том случае,есть готовая программа просто надо сделать компактнее, выделяешь кусок и упаковываешь в макрос.
Здравствуйте, VaBo.
Для освоения на базовом уровне CDS Вам необходимо разобраться с: функциями, функциональными блоками и подпрограммами. В чем их отличия и особенности + освоить как минимум ST, SFC, CFC или FBD (мой выбор).
P. S. а макросы это для фанатиков CFC, я этим языком не пользуюсь по этому в первый раз от Вас и услышал - спасибо Вам за это :-)
Не все так запущено - на ASM и С для микроконтоллеров я писАл лет 13 (с 99 года). Со школы знаком с цифровой схемотехникой - FBD не проблема (тем более часто использую FBD с контр. другого производителя). На ST - TraceMoud - тоже лет 6.
Проблемы только с узнаванием тонкостей CDS. Вот сейчас соображаю - есть ли способ сказать мастеру, чтобы постоянно не "долбился" в слейв, если тот не отвечает. Например, как в Лектусе сделано - несколько раз не ответил - ушел в "запас" с периодической проверкой.
Есть способ?
Да есть)
Для конфигуратора такая возможность выглядит так:
В каждом мастере есть параметр Byte (*Start/Stop*). Если в программе постоянно присваивать значение 254 - то данный мастер опрашивать слейва не будет. Если перестать присваивать 254 или присвоить 255, то мастер продолжит опрос слейва.
Так же тут есть параметры (*Last Error*) и (*Last Adress*) с их помощью можно идентифицировать нештатные ситуации.
Спасибо, интересно...
Но таким образом я торможу весь мастер, а нужно затормозить только один юниверсал девайс, остальные ведь работают?
Как узнать, что только что произошло событие обмена по модбас и в переменных состояния появились обновленные данные?
И еще дилетанский вопрос - каким образом в CDS принято разделять задачи (по внешним событиям, по периодам выполнения)?
В микроконтроллерах, например, приходилось бить задачи на отдельные функции, создавать в глобальной зацикленной ветке счетчики-таймеры и флаги для задач (там же флаги от прерываний) и вызывать нужные ф-ии, при этом сбрасывая флаги.
Есть ли в CDS более продвинутый способ? Перемалывать все подряд с циклом 1 мС как-то не хочется.
У каждого "утеверсал модбас девайс" есть аналогичный параметр см. вложение работает аналогично.
Ну так есть же "Ласт еррор", если ошибок нет значит данные актуальны.
Можно реализовать как захочете, вот как нравиться так и делайте. Как-то стандартных подходов нет - каждый делает в соответствии со своим опытом и навыками.
В ПЛК_ПРГ всю программу делю на глобальный задачи (создаю отдельные подпрограммы) например:
1. Контур отопления.
2. Контур горячего водоснабжения.
3. Контур теплоносителя для системы вентиляции.
Дальше в данные программы реализую на SFC например:
1. Инициализация/проверка на достоверность переменных. и Ждем команды "пуск".
2. Пуск гидравлики.
3. Пуск регуляторов температуры.
После прихода команды "Стоп":
4. выключить насосы.
5. Закрыть регулирующий клапан.
6. Перейти в начало программы и ждать команды "пуск".
а вот внутри шагов прописываю саму логику работы.
Если куски текста программы повторяются выношу в виде функций и функциональных блоков.
Если логика шага сложная, опять разбиваю на подпрограммы и так далее.
Например: позиционирование в начальное положение исполнительных механизмов для станка ЧПУ необходимо и при включении станка и при сбросе аварии и при завершении цикла. Таким образом 100% это должна быть отдельная подпрограмма с входом "старт позиционирования" и выходом "все отпозиционированно", количество входных входных переменных может быть и больше, но не меньше.
После команды "старт позиционирования" ждем подтверждения, что все отпозиционированно и идем дальше работать)
А где вы взяли описание этих переменных - документацию вроде перешерстил, - не нашел...
И с ласт еррор мне непонятно следующее: обмен по сети идет асинхронно от основной задачи, а поллить эту переменную я могу только в самой задаче. Тогда большая вероятность что я либо пропущу ЛАСТ ЕРРОР, либо (небольшая вероятность) что я увижу ЛАСТ ЕРРОР, но при считывании адреса считаю уже следующий (валидный). Или при ошибке обмен останавливается до её сброса?