Алгоритм управления следящим приводом

Сервоприводы, шаговые двигатели, регуляторы скорости, частотные преобразователи

Re: Алгоритм управления следящим приводом

Сообщение Михайло » 15 ноя 2016, 18:31

Что-то мне не нравится последний график (с теоретической точки зрения). У тебя статическая ошибка не убралась. Как так? Ki надо увеличивать, Kp может быть уменьшать. И непонятно, почему в конце процесса, когда H_new уже константа, H_act не стремится к этой константе. Ошибка регулирования не равна нулю, но выход ПИ-регулятора (=задание скорости) почему-то стабилизировался. Либо Ki сильно занижено каким-то масштабированием, либо что-то еще, ошибка в алгоритме, например.

График H_new немного дрожит, можно слегка зафильтровать миллисекундным фильтром.

Кстати, настройка Kp в случае П-регулятора слабо коррелирует с правильной настройкой Kp в случае ПИ-регулятора, т.е. надо заново подбирать коэффициенты. И еще: рекомендации для ПИ-регулятора скорости в принципе справедливы для ПИ-регулятора положения.
Михайло
Администратор
 
Сообщения: 3864
Зарегистрирован: 19 сен 2012, 19:16

Re: Алгоритм управления следящим приводом

Сообщение Автоматизатор » 15 ноя 2016, 20:29

Михайло писал(а):Что-то мне не нравится последний график (с теоретической точки зрения).

Мне тоже не нравится.

Михайло писал(а):У тебя статическая ошибка не убралась.

Убралась в центральной части, но осталась по краям.

Я уже приводил теоретический график расчета задания положения
Изображение

Вот более точный.
pict.jpg


Михайло писал(а):И непонятно, почему в конце процесса, когда H_new уже константа, H_act не стремится к этой константе. Ошибка регулирования не равна нулю, но выход ПИ-регулятора (=задание скорости) почему-то стабилизировался.

Может в ПЧ настроена минимально допустимая скорость?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Автоматизатор
Профессионал
 
Сообщения: 959
Зарегистрирован: 09 окт 2012, 05:18

Re: Алгоритм управления следящим приводом

Сообщение Автоматизатор » 15 ноя 2016, 20:32

Михайло писал(а):ошибка в алгоритме, например

В алгоритме из википедии все просто. Могу выложить. Там три строчки.

Может сам подход корявый?
Аватара пользователя
Автоматизатор
Профессионал
 
Сообщения: 959
Зарегистрирован: 09 окт 2012, 05:18

Re: Алгоритм управления следящим приводом

Сообщение Михайло » 16 ноя 2016, 04:54

Автоматизатор писал(а):Может в ПЧ настроена минимально допустимая скорость?

Не похоже. Глянь еще раз вчерашний график: там скорость изменяется от -50, переходит через 0 и уходит до +250 без проблем и ограничений.

Автоматизатор писал(а):Может сам подход корявый?

Похоже он реализован не совсем правильно. Объясни мне, почему в момент времени 229 скорость перестает расти при наличии заметной ошибки (H_new-H_act)? Иначе бы красная линия догнала синюю. Что-то сдерживает регулятор.

Кстати, да. Я вспомнил один момент, который не упоминается ни в каких википедиях. На выходе ПИ-регулятора должен быть не просто ограничение (лимитер, сатуратор). Нужно ограничивать каждую из компонент ПИД-регулятора + еще ограничение суммы П+И+Д. Иначе получается И-составляющая может наинтегрировать довольно большое число (положительное или отрицательное), регулятор уходит в глубокое насыщение, из которого потом не может долго выйти, даже если ошибка регулирования стала нулевой и даже сменила знак. Ограничение интегральной составляющей должно работать так: если значение выхода регулятора очень большое по модулю, то приращение (интегрирование) должно обнулиться (прекратиться).

Может у тебя из-за этого проблемы? Очень похоже, но не совсем. Выведи график И-составляющей, он не должен зашкаливать, должен быть сопоставим с выходом регулятора (=скоростью).
Михайло
Администратор
 
Сообщения: 3864
Зарегистрирован: 19 сен 2012, 19:16

Re: Алгоритм управления следящим приводом

Сообщение Автоматизатор » 16 ноя 2016, 06:59

Михайло писал(а):Глянь еще раз вчерашний график: там скорость изменяется от -50, переходит через 0 и уходит до +250 без проблем и ограничений.


Ты не ту ось смотришь: там где 250 - это перемещение, а справа ось - это скорость. Она меняется от 0 до 60 мм/с . Максимальная скорость ограничена после регулятора значением 100 мм/с, но в процессе работы нигде не превышает значения 70-80 мм/с.

Почему то на приводе идет задержка отработки задания. Примерно на 0,1 с, что очень много. Это еще раньше замечали. Красная линяя - задание, синяя - фактическая скорость.

График.jpg
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Автоматизатор
Профессионал
 
Сообщения: 959
Зарегистрирован: 09 окт 2012, 05:18

Re: Алгоритм управления следящим приводом

Сообщение Автоматизатор » 16 ноя 2016, 10:37

Ограничение И в регуляторе привода выглядит так:

Регулятор скорости.jpg


Значения по умолчанию:
Кр = 20
Кi = 0.5
Ограничение И = 400 %

Интегрирующее звено стоит после пропорционального.

Как ограничение И сделать правильно?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Автоматизатор
Профессионал
 
Сообщения: 959
Зарегистрирован: 09 окт 2012, 05:18

Re: Алгоритм управления следящим приводом

Сообщение Михайло » 16 ноя 2016, 13:27

Автоматизатор писал(а):Интегрирующее звено стоит после пропорционального.

Это нормально. Нужно рассматривать коэффициент интегральной части как Ki1 = Kp * Ki и все встает на свои места.
Автоматизатор писал(а):Значения по умолчанию:
Кр = 20
Кi = 0.5
Ограничение И = 400 %

Попробуй Ki = 0.1 для регулятора скорости.

Автоматизатор писал(а):Как ограничение И сделать правильно?

Как у КЕБа: если выход И-компоненты по модулю превышает лимит, то нужно перестать прибавлять И-прибавку в рекурсивной формуле. Для этого нужно по отдельности вычислять П, И и Д по отдельным формулам.
Михайло
Администратор
 
Сообщения: 3864
Зарегистрирован: 19 сен 2012, 19:16

Re: Алгоритм управления следящим приводом

Сообщение Автоматизатор » 16 ноя 2016, 15:02

Вот сам код регулятора и полученные результаты.

"Регулятор в прерываниях с периодом 10 мс"
Код: Выделить всё
    //  Инициализация
    IF "SB21" OR "SQ1" THEN
        "PPO_INI" := "BB2_d";           // Положение ППО при включении цикла навивки, имп.
        "FB_POS_PPO_DB".V_Synh_r := 0;
        "V_PPO_PID" := 0;
        #E := 0;
        "E_1" := 0;
        "N_1_PVO_d" := 0;
        //"PVO_INI" := "C_PVO_d";         // Положение ПВО при включении цикла навивки, имп. (запоминается при включении навивки в FB_POS_PVO)
    END_IF;

// Расчет регулятора положения ППО
// При навивке пружины ППО должен работать синхронно  с ПВО в зависимости от параметров навивки (развертке пружины).
// Каждому углу поворота ПВО должно соответствовать перемещение ППО.
//  AND "debug_4" = FALSE
// Расчет выполняется только при включенной синхронизации приводов ПВО и ППО
IF NOT ( (( "FB_POS_PVO_DB".State_i >= 5 ) AND ( "FB_POS_PVO_DB".State_i <= 10 ) )
    AND ( "PVO_n_Spring_r" <> 0.0 )
    AND ( "PPO_c_Synh" = TRUE ) )
    AND "debug_4" = FALSE
THEN
    RETURN;
END_IF;

"N_PVO_d" := "C_PVO_d" - "PVO_INI";      // Положение ПВО для расчета регулятора, имп. (регулятор должен работать при начальном нулевом положении)

"dN_PVO_d" := "N_PVO_d" - "N_1_PVO_d";   // Изменение положения ПВО за период, имп.

"N_1_PVO_d" := "N_PVO_d";                // Сохранение текущего положения ПВО, имп.

"N_PVO_d" := "N_PVO_d" + 2*"dN_PVO_d";     // Расчет производим для следующей точки (прогноз, для устранения запаздывания)

// "N_PVO_r" - Текущее положение ПВО для расчета регулятора, об
"FC_C_PVO"(i_C_PVO_d:="N_PVO_d",                     // угол навивки, об 
            i_Dir:="s_Dir",                           // Направление навития (0 - лево, 1- право)
            o_C_PVO_r=>"N_PVO_r",                     // ПВО. Текущее положение, об
            o_Minus=>"FB_POS_PVO_DB".s_PVO_Minus);
 
 "H_ACT" := DINT_TO_REAL("BB2_d" - "PPO_INI")/1000.0;
 // "H_ACT" - Текущая высота пружины, мм
 // "BB2_d" - М2. Положение магнита на линейке, мкм
 // "FB_POS_PPO_DB".C_Ini_d - Исходное положение оправки для начала цикла навивки,
 // когда патрон соприкосается с оправкой и пруток лежащий на подающем ролике можно зажать прижимом.
 
 IF "debug_4" THEN
     "N_PVO_r" := "Debug1_r";
 END_IF;
 
// В массиве точек рецепта находим номер точки справа
 #y := 0;                                                   // инициализация
FOR #i := 1 TO 20 DO                                        // перебираем точки в массиве
    IF "N_PVO_r" <= "DB_Param_Spring".POINT[#i].N THEN
        #y := #i;                                           // номер правой точки массива N
        EXIT;                                               // выход из цикла перебора
    END_IF;

END_FOR;

IF #y = 0 THEN                                           // если выехали за пределы диапазона, то берем точку 20
    #y := 20;
END_IF;

// тогда находим положение ППО, соответствующему текущему углу навивки
"H_NEW" := ("N_PVO_r" - "DB_Param_Spring".POINT[#y - 1].N) *
("DB_Param_Spring".POINT[#y].H - "DB_Param_Spring".POINT[#y - 1].H) /
("DB_Param_Spring".POINT[#y].N - "DB_Param_Spring".POINT[#y - 1].N) +
"DB_Param_Spring".POINT[#y-1].H;

#E := "H_NEW" - "H_ACT";    // Текущая ошибка

// --------------ПИД-регулятор------------------------
// u(t) = u(t — 1) + P (t) + I (t) + D (t);
// P (t) = Kp * {e (t) — e (t — 1)};
// I (t) = I * e (t);
// D (t) = Kd * {e (t) — 2 * e (t — 1) + e (t — 2)};
//----------------------------------------------------

"PID_P" := "DB_MAIN".Kp * (#E - "E_1");              // Пропорциональная составляющая ПИД-регулятора
"PID_I" := "DB_MAIN".Ki * #E;                        // Интегральная составляющая ПИД-регулятора

// Требуемя скорость ППО для синхронизации с ПВО, мм/с [см. П-регулятор]
"V_PPO_PID" := "V_PPO_PID" + "PID_P" + "PID_I";

"FB_POS_PPO_DB".V_Synh_r := "V_PPO_PID";

// Ограничение скорости
IF "FB_POS_PPO_DB".V_Synh_r > "DB_MAIN".V_PID_max THEN
    // максимальная частота 150 Гц
    // при передаточном отношении редуктора 4,91 и шаге ШВП 10 мм
    // максимальная скорость 100 мм/сек
    "FB_POS_PPO_DB".V_Synh_r := "DB_MAIN".V_PID_max ;
END_IF;

IF "FB_POS_PPO_DB".V_Synh_r >0 AND "FB_POS_PPO_DB".V_Synh_r < "DB_MAIN".V_PID_min THEN
    // на малых скоростях нет вращения - привод существенно запаздывает
    // начало вращения примерно с 0,5 мм/с (0,7 Гц)
    "FB_POS_PPO_DB".V_Synh_r := "DB_MAIN".V_PID_min;
END_IF;

IF "FB_POS_PPO_DB".V_Synh_r < 0 THEN
    "FB_POS_PPO_DB".V_Synh_r := "DB_MAIN".V_PID_min;
END_IF;

// Сохранение текущего рассогласования для дальнейшего использования
"E_1" := #E;

// Авария, если рассогласование больше 0,15 мм
IF #E > 0.15 THEN
    "Warning_1" := true;
END_IF;

// Для увеличения быстродействия повторяем пересчеты задания, которые есть в основном блоке программы
// FC_PPO [FC7] Network 28 "PPO_v_r" - ППО. Заданная скорость перемещения , мм/с
IF "PPO_c_Synh" = TRUE THEN
    "PPO_v_r" := ABS("FB_POS_PPO_DB".V_Synh_r);
END_IF;
// 5_FC_OUT [FC5] Network 43: "DB_M2_UZ2".CW_Frequency_Reference - Заданная частота
IF "FB_Redukt_DB".o_Redukt_WORKING = FALSE THEN
    "M2_FC_V_to_F_Calc"(i_V_r := "PPO_v_r",
                        i_ShVP_r := "FB_POS_PPO_DB".ShVP_r,
                        i_Ratio_r := "FB_POS_PPO_DB".RATIO_r,
                        i_n_nom_r := "DB_MAIN".M2_In_n_nom_r,
                        i_F_Max_i := "DB_MAIN".M2_In_F_Max_i,
                        o_F_i => "DB_UZ2".CW_Frequency_Reference);
END_IF;

IF "PPO_c_Synh" = TRUE THEN
    "FC_UZ_PB_1"();                             // отправить задание в ПЧ
END_IF;


В начале работы: начинает вращаться оправка, скорость маленькая, регулятор ждет, пока накопится ошибка. Даже когда на преобразователь придет задание, двигатель начнет крутится только с 0,5 Гц. Отсюда большая (недопустимая!) ошибка на участке 0...0,1 об. Необходимо стартовать с минимальной скоростью V_PID_min. Тогда регулятор начинает регулировать в минус. Надо как то стыковать.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Автоматизатор
Профессионал
 
Сообщения: 959
Зарегистрирован: 09 окт 2012, 05:18

Re: Алгоритм управления следящим приводом

Сообщение Михайло » 16 ноя 2016, 17:24

Автоматизатор писал(а):В начале работы: начинает вращаться оправка, скорость маленькая, регулятор ждет, пока накопится ошибка. Даже когда на преобразователь придет задание, двигатель начнет крутится только с 0,5 Гц. Отсюда большая (недопустимая!) ошибка на участке 0...0,1 об. Необходимо стартовать с минимальной скоростью V_PID_min. Тогда регулятор начинает регулировать в минус. Надо как то стыковать.

Может в начале просто быстрее крутить оправку?
Михайло
Администратор
 
Сообщения: 3864
Зарегистрирован: 19 сен 2012, 19:16

Re: Алгоритм управления следящим приводом

Сообщение Автоматизатор » 16 ноя 2016, 17:47

Как оказалось, именно к первому витку (и последнему) предъявляются высокие требования. Надо все делать точно, быстро можно не успеть.

Вопрос: как влияет период обсчета на точность? Мне попадалась информация, что Кр должен быть выше 10 для хорошей системы. А у меня колебания начинаются с Кр = 3...5. Если период уменьшить до 5 мс, то это улучшит процесс?
Аватара пользователя
Автоматизатор
Профессионал
 
Сообщения: 959
Зарегистрирован: 09 окт 2012, 05:18

Re: Алгоритм управления следящим приводом

Сообщение Автоматизатор » 16 ноя 2016, 17:54

Михайло писал(а):Попробуй Ki = 0.1 для регулятора скорости.

Изменили момент инерции ротора двигателя с 0.0026 (по умолчанию) до 0.0046 кг*м2 (по документам). Вроде получше стало.
Аватара пользователя
Автоматизатор
Профессионал
 
Сообщения: 959
Зарегистрирован: 09 окт 2012, 05:18

Re: Алгоритм управления следящим приводом

Сообщение Михайло » 16 ноя 2016, 18:27

Кстати, формулы из википедии работают правильно при условии, что постоянный период (10 мс) между пересчетами действительно соблюдается. Может 10 мс слишком мало и происходит отставание?

Взял за основу следующие данные из таблицы: Kp, Ki и столбец E. По этим данным рассчитал столбцы PID_P и PID_I, затем рассчитал столбец V_PPO_PID по формуле из твоей программы. Получил совершенно другой результат. Построил график, обнаружил, что причиной краха всех расчетов является принудительное обнуление выхода ПИ-регулятора в тот момент, когда высота H резко изменяется от 250 до 0. В итоге, когда отпускаешь ПИ-регулятор в свободный расчет, у него оказывается неправильное накопленное значение V_PPO_PID. Меньше на 18 попугаев от правильного значения и это отставание по скорости сохраняется все оставшееся время навивки!
Михайло
Администратор
 
Сообщения: 3864
Зарегистрирован: 19 сен 2012, 19:16

Re: Алгоритм управления следящим приводом

Сообщение Михайло » 16 ноя 2016, 18:41

Еще есть претензия к строчке:
Автоматизатор писал(а):
Код: Выделить всё
IF "FB_POS_PPO_DB".V_Synh_r < 0 THEN
    "FB_POS_PPO_DB".V_Synh_r := "DB_MAIN".V_PID_min;
END_IF;


Нельзя регулятору запрещать отрицательные скорости, ведь вполне возможны небольшие допустимые перерегулирования, в этом случае регулятор должен командовать отъезжать назад. Это важно, например, в конце процесса навивки.
Михайло
Администратор
 
Сообщения: 3864
Зарегистрирован: 19 сен 2012, 19:16

Re: Алгоритм управления следящим приводом

Сообщение Михайло » 16 ноя 2016, 19:00

И до сих пор непонятно, почему Vppo не догоняет V_PID. Надо настраивать регулятор скорости. У тебя разве привод не с обратной связью по скорости? Скалярное управление U/f? Видно, что как будто бы под нагрузкой привод проваливается по оборотам.
Михайло
Администратор
 
Сообщения: 3864
Зарегистрирован: 19 сен 2012, 19:16

Re: Алгоритм управления следящим приводом

Сообщение Автоматизатор » 16 ноя 2016, 19:35

Михайло писал(а):есть претензия к строчке:

Это верно, из-за этого провал в скорости. Это еще правленный вариант, еще не испробованный. На графике виден результат обнуления, который был раньше.
Аватара пользователя
Автоматизатор
Профессионал
 
Сообщения: 959
Зарегистрирован: 09 окт 2012, 05:18

Re: Алгоритм управления следящим приводом

Сообщение Автоматизатор » 16 ноя 2016, 19:39

Михайло писал(а):когда высота H резко изменяется от 250 до 0.

В этот момент сбрасываются старые значения, оставшиеся с прошлого раза, и начинается процесс. Просто в протокол записываются
Аватара пользователя
Автоматизатор
Профессионал
 
Сообщения: 959
Зарегистрирован: 09 окт 2012, 05:18

Re: Алгоритм управления следящим приводом

Сообщение Автоматизатор » 16 ноя 2016, 19:42

Михайло писал(а):У тебя разве привод не с обратной связью по скорости

С ней, особо не настраивали, т.к. едет достаточно точно, на первый взгляд.
Аватара пользователя
Автоматизатор
Профессионал
 
Сообщения: 959
Зарегистрирован: 09 окт 2012, 05:18

Re: Алгоритм управления следящим приводом

Сообщение Михайло » 17 ноя 2016, 05:10

Ну настрой хотя бы бездатчиковое векторное управление (SLVC).
Михайло
Администратор
 
Сообщения: 3864
Зарегистрирован: 19 сен 2012, 19:16

Re: Алгоритм управления следящим приводом

Сообщение Автоматизатор » 17 ноя 2016, 05:39

Михайло писал(а):Ну настрой хотя бы бездатчиковое векторное управление (SLVC).

Ты не так понял: "с ней" - это с ОСС. Настроен привод на закрытый вектор CLV.

Я думаю, что из-за медленного старта интегратор накапливает погрешность, которая накладывается на переходный процесс. Думаю сделать ручной старт, а потом включать регулятор (с какого места еще не решил).
Аватара пользователя
Автоматизатор
Профессионал
 
Сообщения: 959
Зарегистрирован: 09 окт 2012, 05:18

Re: Алгоритм управления следящим приводом

Сообщение Автоматизатор » 17 ноя 2016, 07:20

Правильно ли выполнено ограничение:
- интегральной составляющей?
- рассчитанного регулятором значения (ограничение задания приводу, а не самого регулятора)?
- надо ли ограничивать диф. составляющую и как?

Код: Выделить всё
"PID_P" := "DB_MAIN".Kp * (#E - "E_1");              // Пропорциональная составляющая ПИД-регулятора

IF "V_PPO_PID" <= "DB_MAIN".V_PID_max THEN           // Интегрирование  только при отсутствии насыщения
    "PID_I" := "DB_MAIN".Ki * #E;                    // Интегральная составляющая ПИД-регулятора
END_IF;
   
"PID_D" := "DB_MAIN".Kd * (#E - 2 * "E_1" + "E_2");  // Дифференциальная составляющая ПИД-регулятора

// Требуемя скорость ППО для синхронизации с ПВО, мм/с [см. П-регулятор]
"V_PPO_PID" := "V_PPO_PID" + "PID_P" + "PID_I" + "PID_D";

"FB_POS_PPO_DB".V_Synh_r := "V_PPO_PID";              // Вычисленное ПИД-регулятором значение скорости присваивается заднию преобразователю

// Ограничение скорости
IF "FB_POS_PPO_DB".V_Synh_r > "DB_MAIN".V_PID_max THEN
    // максимальная частота 150 Гц
    // при передаточном отношении редуктора 4,91 и шаге ШВП 10 мм
    // максимальная скорость 100 мм/сек
    "FB_POS_PPO_DB".V_Synh_r := "DB_MAIN".V_PID_max ;
END_IF;
Аватара пользователя
Автоматизатор
Профессионал
 
Сообщения: 959
Зарегистрирован: 09 окт 2012, 05:18

Пред.След.

Вернуться в ЭЛЕКТРОПРИВОД

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1