PDA

Просмотр полной версии : Запаздывание



Petrozja
25.02.2011, 18:48
Здравствуйте! Стал вопрос реализации компенсатора перекрестной связи в виде реально - дифференцирующего звена с запаздыванием. РДЗ реализовано, никаких проблем нет. Как реализовать программно запаздывание?

Ельцов Андрей
26.02.2011, 10:47
а таймером не подходит TON или TOF?

Petrozja
26.02.2011, 22:22
Таймеры TON, TOF имеют булевский вход и выход! Не подходит! При расчете компенсатора нужно поделить передаточную функцию объекта на передаточную функцию возмущения. При разложении на простейшие дроби в итоге получаем сумму апериодического звена первого порядка и интегро-дифференцирующего. С этим проблем не возникло. Не могу ума приложить, как численными методами в CoDeSys реализовать деление запаздывания одной передаточной функции на другую

lara197a
26.02.2011, 23:21
Тяжело мне понять написанное, Но если я правильно понял, то Вам всеже нужно использовать таймер, по срабатыванию выхода таймера(к примеру TOF) вызывайте подрограмму(или функцию(ФБ)) для выполнения вычислений с запаздыванием.

Gans
27.02.2011, 10:03
Как реализовать программно запаздывание?
arrForDelay ARRAY [0..99] OF real; (*Массив для хранения измеренных/расчетных значений*)

arrForDelay[99]:=rlIzmerenoe;
а затем раз в секунду делаем вот это:
for wdCounetr=0 to 98 do
arrForDelay[wdCounetr]:= arrForDelay[wdCounetr+1];
end_for;

arrForDelay[0] -будет содержать значение rlIzmerenoe, 98 сек назад :-)

таким образом получаем запаздывание на 98 сек, с квантованием по времени в одну секунду. Конечно для дальнейшего дифференцирования и некоторых других хотелок эти данные использовать уже не удастся :-(

Малышев Олег
27.02.2011, 11:24
Ганс - это примерно то, но нужно сглаживание с помощью тау(временного)-фильтра. В понедельник выложу рабочий пример симулятор объекта с пид регулятором. (Пример будет с двумя звеньями запаздывания) одно можно выпилить.

Petrozja
27.02.2011, 12:29
arrForDelay ARRAY [0..99] OF real; (*Массив для хранения измеренных/расчетных значений*)

arrForDelay[99]:=rlIzmerenoe;
а затем раз в секунду делаем вот это:
for wdCounetr=0 to 98 do
arrForDelay[wdCounetr]:= arrForDelay[wdCounetr+1];
end_for;

arrForDelay[0] -будет содержать значение rlIzmerenoe, 98 сек назад :-)

таким образом получаем запаздывание на 98 сек, с квантованием по времени в одну секунду. Конечно для дальнейшего дифференцирования и некоторых других хотелок эти данные использовать уже не удастся :-(
Идея программной реализации запаздывания и заключается в том, что потом его можно юзать, как отдельный элемент и звенья, созданные в CoDeSys, засунуть в одну библиотеку и при тесте программного кода компоновать разные варианты структур управления объектом для отслеживания поведения. При этом стоит вопрос времени цикла обновления данных с целью получить систему управления в реальном времени.

Leonid
27.02.2011, 12:32
Мне кажется, лучше не данные во всем массиве перемещать, а менять указатель на текущий индекс массива. Если массив из 256 элементов, а переменная индекса байтовая, то даже за переполнением следить не надо.

Petrozja
02.03.2011, 01:13
А я от вас все жду и жду проекта с запаздыванием... Обещали ведь в понедельник выложить

Малышев Олег
02.03.2011, 12:31
Дико извиняюсь - закрутился немного...:)