Вход

Просмотр полной версии : дискретизация



Киналь
17.11.2009, 14:18
Здравствуйте.

Решил-таки более-менее освоить CoDeSys и начал с самого простого - сложил в FBD две синусоиды (вроде как сигнал и помехи). Потом добавил отрицательную обратную связь, сначала подобрав её коэффициент в привычном Симулинке.

И тут появились две проблемы.
Первая - это дискретизация. Поскольку сигналы не непрерывные, то с увеличением частоты он всё больше превращаются из синусоиды в "пилу".
Вторая - после введения обратно связи (схема во вложении) сигнал на выходе "сошёл с ума" - скачет как бешеный, доходя до ограничений, заданных типом переменной. Экспериментально подобрал, что такое начинается со значения коэффициента ОС, равного примерно 0,9; если меньше, то ещё более-менее похоже на правду.

Как быть с этим всем? Как уменьшить шаг дискретизации, и что не нравится в обратной связи?

PS Ещё один мелкий вопрос - как связаны "сэмплы" в трассировке с реальным временем?

Игорь Петров
23.11.2009, 16:05
Сэмплы в трассировке по умолчанию идут в каждом рабочем цикле ПЛК. Можно задать по времени. Но тут надо не выпускать из головы теорему Котельникова. Иначе замеры пойдут относительно редко и после сплайн интерполяции в трассировке будет бред. Чаще чем раз в цикл мерить ничего в ПЛК нельзя вообще. По-хорошему частота цикла ПЛК должна быть раз в 10 выше чем частоты обрабатываемых сигналов, тогда вообще никаких проблем. В режиме встроенного эмулятора CoDeSys лучше не рулить параметры трассировки, а подзатянуть время модели. Т.е. делайте приращение аргумента синусоиды с меньшим раз в 10 шагом.
Встроенный эмулятор CoDeSys удобен в работе, но тут надо думать в рабочих циклах, а не в миллисекундах предполагая что реальные времена мы получим только в реальном ПЛК. Эмулятор шагает по тикам таймера Windows, очень примерно раз в 55 мс и время цикла тут может сильно плавать. Просто считаем в циклах ПЛК: пусть период синусоиды N циклов, трассировка в N раз чаще, интегратор столько то циклов и т.д. Это стандартная практика при программировании ПЛК. На трассировке все будет красиво. В ПЛК затем выставим какое надо время цикла и тоже все будет красиво и синхронно.
Если же вдруг надо сразу с реальным временим (большие многозадачные системы, со сложной взаимосвязью задач) то вырубаем встроенный эмулятор и запускаем CoDeSys SP RTE. Все будет четко стабильно в микросекундах. Но тут уже надо разбираться с конфигуратором задач, его настройкой и наукой программирования систем с вытесняющей многозадачностью . Это штуки для очень продвинутых программистов.

Киналь
23.11.2009, 21:40
Большое спасибо, очень доходчиво.

Очень хотелось бы попросить вас ещё кое-что разъяснить. Дело в том, что мне нужно построить алгоритм управления тиристорным выпрямителем-регулятором. Это не такая простая система, как кажется: у неё около десяти контролируемых параметров - и почти все из них электрические. Соответственно, меняются они с частотой 50 Гц (это минимум, в переходных процессах в разы больше). Сами тиристоры, нагрузку и сеть смоделировать непосредственно в CoDeSys представляется задачей весьма непростой, а главное, излишней - их функция чисто отладочная. Эти модели уже существуют в среде Матлаб-Симулинк; связать CoDeSys и Simulink можно, как мне уже здесь любезно подсказали, с помощью PLC Link.
Для совместной работы можно было бы задать в Симулинке такой же шаг по времени, как в CoDeSys, но получится бессмыслица - за 55 мс пройдёт два периода сигнала. Искусственно снижать частоту напряжения в модели нельзя - она станет совершенно неадекватной.

Есть ли какой-то выход, кроме описанного вами "для очень продвинутых программистов"?

Игорь Петров
24.11.2009, 12:52
Для меня это тоже вопрос, но с обратной стороны. Со стороны CoDeSys нет никакой проблемы сделать реальное время (РВ). Можно запустить SP RTE на компьютере, задать ему время цикла 1 мс и все будет четко. Можно подключить ПЛК Овен и тоже будет РВ. Но Симулинк то в РВ считать не умеет. В нем есть искусственное (не РВ) модельное время. Шаг может быть и 1 мс, но это совсем не означает, что компьютер выполнит все вычисления за 1 мс. Он может считать 5 минут, затем нарисует красивые картинки с шагом 1 мс. Графики на осциллографах Симулинка ползут медленно, хотя на шкале и могут стоять микросекунды. Это не РВ. В ПЛК все иначе. Если мы ему задали цикл 1 мс, то он реально будет считать за 1 мс. Поэтому, PLC Link должен исхитряться запуливать данные в ПЛК, затем тормозить, чтобы синхронизировать это с Симулинком. Либо, не использовать РВ в ПЛК, а просто брать его рабочий цикл и считать его равным шагу модели. Не знаю, как это реально сделано внутри PLC Link. Можно разработчиков попытать. Попробуйте с SP RTE, возможно все будет как надо. Из CoDeSys не надо связываться Симулинком. Наоборот, запускаем SP RTE, затем настраиваем PLC Link и он далее сам все делает. Но, не уверен, что это работает в демо версии.

Киналь
24.11.2009, 13:14
Так-так-так, а можно чуть поподробнее?


Можно запустить SP RTE на компьютере, задать ему время цикла 1 мс

Как это сделать? В CoDeSys в настройках целевой платформы поставил SP RTE, но при попытке подключения выдаёт "Ошибка подключения (#0)". И как задать время цикла?


запускаем SP RTE, затем настраиваем PLC Link и он далее сам все делает. Но, не уверен, что это работает в демо версии.
У демо-версии ограничение только по времени (месяц), так что всё нормально. С настройками PLC Link тоже разобрался, но в хелпе к нему есть строчка:
Download your controller to the PLC and run it.
Вот с "run" и проблема.

Игорь Петров
24.11.2009, 14:45
Правильно CoDeSys дает ошибку, поскольку контроллера то и нет. С реальным ПЛК надо включить его в розетку и подключить кабелем к PC.
С SP RTE так: в меню Пуск Windows, в папке CoDeSys, находим и жмем Start CoDeSys SP RTE. На панели задач Windows (справа внизу) появляется иконка с молнией. Сервис запущен. Щелкаем по ней. В выпадающем меню даем команду Start System. Выскочит диалог с предупреждением о демо и нужде перезапустить через час. Жмем ОК. Контроллер запущен. Можно с ним связываться из CoDeSys. В нем задаем SP RTE в настройках целевой программы, в параметрах связи локалхост (если все на одном PC). Ну и все. Теперь попробуйте в CoDeSys с нуля написать простейшую программу на ST типа X := X +1; и запустить ее в SP RTE.

Далее надо будет почитать в хелпе CoDeSys на тему конфигурация задач, циклические задачи. Еще подробнее тут (http://www.prolog-plc.ru/docs/iecdeb09.pdf) и совсем уж в недра тут (http://www.prolog-plc.ru/docs/iecdeb10.pdf)

Киналь
24.11.2009, 15:49
Большое спасибо, всё получилось! Программу в SP RTE благополучно загрузил, она запустилась, трассировка с хорошей дискретизацией - всё прекрасно)

Проблема теперь с PLC Link'ом, который не желает запускать уже свой собственный Gateway, но это уже другой вопрос.

Киналь
26.11.2009, 10:58
нет, всё оказалось не так уж хорошо; так и не нашёл, как в Sp Rte задать время цикла 1 мс; есть только выбор между 50, 100 и 200 мкс (не мс), который ничего не меняет. или там не напрямую это задаётся?

Игорь Петров
26.11.2009, 14:14
Затрудняюсь сказать где в CoDeSys есть такой выбор, но уж точно не в конфигураторе задач. Там простой ввод, никакого выбора. В хелпе это детально есть + выше давал ссылку на статью (http://www.prolog-plc.ru/docs/iecdeb09.pdf) с детальными примерами. См. рис. 4.

Киналь
26.11.2009, 16:06
Ещё раз спасибо - нашёл. оказалось, нужно в конфигурации задач создать новую циклическую задачу с интервалом 1 мс и добавить туда Plc_prg(); настройки самого Sp Rte ни при чём.

Хотя 1 мс всё равно много - хороший результат, по опыту симулинка, даёт шаг в 5 мкс. Можно ли этого как-то добиться?

Во Вик
26.11.2009, 16:49
дело в том, что мне нужно построить алгоритм управления тиристорным выпрямителем-регулятором. это не такая простая система, как кажется: у неё около десяти контролируемых параметров - и почти все из них электрические.

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

Киналь
26.11.2009, 20:23
нет, спасибо, но это невозможно - как раз ради передачи разработанного алгоритма управления всё и затевается.

Игорь Петров
27.11.2009, 11:18
Хелп в CoDeSys есть? Он читается? Цитата из него:
Интервал (для задач типа 'циклическая'): период времени, после которого задача должна быть вызвана в очередной раз. Справа от поля ввода значения задаются единицы измерения. Это могут быть миллисекунды [ms] либо микросекунды [µs]. При установке миллисекунд значение должно быть дано в формате TIME (например, "t#200ms"). При вводе микросекунд используется числовая форма представления (например, "300").

Вопрос можно ли добиться микросекунд скорее к изготовителям процессоров. Учитывайте, что SP RTE очень жестко держит время цикла, узурпируя ресурсы ПК. Может он и успеет, но на работу с экраном и клавиатурой процессору времени не будет. Все что Симулинк медленно считает и затем отображает в микросекундах, в SP RTE должно реально быть просчитано в РВ за микросекунды, причем постоянно в цикле!!! Это реально? Можно попробовать добиться таких времен при хитрой ручной оптимизации программы. Не надо делать меньше 1 мс. Зачем мс для моделирования? Уменьшите частоты генераторов раз в 1000 с соответствующим увеличением постоянных времени, а в результатах просто учитывайте масштаб. Этого достаточно при эмуляции. Это линейное преобразование. Симулинк так и делает. Удобно рассматривать глазами. Зачем проводить моделирование на частотах выше, чем человек способен увидеть?