Страница 4 из 5
Re: Алгоритм управления следящим приводом
Добавлено: 15 ноя 2016, 18:31
Михайло
Что-то мне не нравится последний график (с теоретической точки зрения). У тебя статическая ошибка не убралась. Как так? Ki надо увеличивать, Kp может быть уменьшать. И непонятно, почему в конце процесса, когда H_new уже константа, H_act не стремится к этой константе. Ошибка регулирования не равна нулю, но выход ПИ-регулятора (=задание скорости) почему-то стабилизировался. Либо Ki сильно занижено каким-то масштабированием, либо что-то еще, ошибка в алгоритме, например.
График H_new немного дрожит, можно слегка зафильтровать миллисекундным фильтром.
Кстати, настройка Kp в случае П-регулятора слабо коррелирует с правильной настройкой Kp в случае ПИ-регулятора, т.е. надо заново подбирать коэффициенты. И еще: рекомендации для ПИ-регулятора скорости в принципе справедливы для ПИ-регулятора положения.
Re: Алгоритм управления следящим приводом
Добавлено: 15 ноя 2016, 20:29
Автоматизатор
Михайло писал(а):Что-то мне не нравится последний график (с теоретической точки зрения).
Мне тоже не нравится.
Михайло писал(а):У тебя статическая ошибка не убралась.
Убралась в центральной части, но осталась по краям.
Я уже приводил теоретический график расчета задания положения
Вот более точный.
pict.jpg
Михайло писал(а):И непонятно, почему в конце процесса, когда H_new уже константа, H_act не стремится к этой константе. Ошибка регулирования не равна нулю, но выход ПИ-регулятора (=задание скорости) почему-то стабилизировался.
Может в ПЧ настроена минимально допустимая скорость?
Re: Алгоритм управления следящим приводом
Добавлено: 15 ноя 2016, 20:32
Автоматизатор
Михайло писал(а):ошибка в алгоритме, например
В алгоритме из википедии все просто. Могу выложить. Там три строчки.
Может сам подход корявый?
Re: Алгоритм управления следящим приводом
Добавлено: 16 ноя 2016, 04:54
Михайло
Автоматизатор писал(а):Может в ПЧ настроена минимально допустимая скорость?
Не похоже. Глянь еще раз вчерашний график: там скорость изменяется от -50, переходит через 0 и уходит до +250 без проблем и ограничений.
Автоматизатор писал(а):Может сам подход корявый?
Похоже он реализован не совсем правильно. Объясни мне, почему в момент времени 229 скорость перестает расти при наличии заметной ошибки (H_new-H_act)? Иначе бы красная линия догнала синюю. Что-то сдерживает регулятор.
Кстати, да. Я вспомнил один момент, который не упоминается ни в каких википедиях. На выходе ПИ-регулятора должен быть не просто ограничение (лимитер, сатуратор). Нужно ограничивать каждую из компонент ПИД-регулятора + еще ограничение суммы П+И+Д. Иначе получается И-составляющая может наинтегрировать довольно большое число (положительное или отрицательное), регулятор уходит в глубокое насыщение, из которого потом не может долго выйти, даже если ошибка регулирования стала нулевой и даже сменила знак. Ограничение интегральной составляющей должно работать так: если значение выхода регулятора очень большое по модулю, то приращение (интегрирование) должно обнулиться (прекратиться).
Может у тебя из-за этого проблемы? Очень похоже, но не совсем. Выведи график И-составляющей, он не должен зашкаливать, должен быть сопоставим с выходом регулятора (=скоростью).
Re: Алгоритм управления следящим приводом
Добавлено: 16 ноя 2016, 06:59
Автоматизатор
Михайло писал(а):Глянь еще раз вчерашний график: там скорость изменяется от -50, переходит через 0 и уходит до +250 без проблем и ограничений.
Ты не ту ось смотришь: там где 250 - это перемещение, а справа ось - это скорость. Она меняется от 0 до 60 мм/с . Максимальная скорость ограничена после регулятора значением 100 мм/с, но в процессе работы нигде не превышает значения 70-80 мм/с.
Почему то на приводе идет задержка отработки задания. Примерно на 0,1 с, что очень много. Это еще раньше замечали. Красная линяя - задание, синяя - фактическая скорость.
График.jpg
Re: Алгоритм управления следящим приводом
Добавлено: 16 ноя 2016, 10:37
Автоматизатор
Ограничение И в регуляторе привода выглядит так:
Регулятор скорости.jpg
Значения по умолчанию:
Кр = 20
Кi = 0.5
Ограничение И = 400 %
Интегрирующее звено стоит после пропорционального.
Как ограничение И сделать правильно?
Re: Алгоритм управления следящим приводом
Добавлено: 16 ноя 2016, 13:27
Михайло
Автоматизатор писал(а):Интегрирующее звено стоит после пропорционального.
Это нормально. Нужно рассматривать коэффициент интегральной части как Ki1 = Kp * Ki и все встает на свои места.
Автоматизатор писал(а):Значения по умолчанию:
Кр = 20
Кi = 0.5
Ограничение И = 400 %
Попробуй Ki = 0.1 для регулятора скорости.
Автоматизатор писал(а):Как ограничение И сделать правильно?
Как у КЕБа: если выход И-компоненты по модулю превышает лимит, то нужно перестать прибавлять И-прибавку в рекурсивной формуле. Для этого нужно по отдельности вычислять П, И и Д по отдельным формулам.
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. Тогда регулятор начинает регулировать в минус. Надо как то стыковать.
Re: Алгоритм управления следящим приводом
Добавлено: 16 ноя 2016, 17:24
Михайло
Автоматизатор писал(а):В начале работы: начинает вращаться оправка, скорость маленькая, регулятор ждет, пока накопится ошибка. Даже когда на преобразователь придет задание, двигатель начнет крутится только с 0,5 Гц. Отсюда большая (недопустимая!) ошибка на участке 0...0,1 об. Необходимо стартовать с минимальной скоростью V_PID_min. Тогда регулятор начинает регулировать в минус. Надо как то стыковать.
Может в начале просто быстрее крутить оправку?
Re: Алгоритм управления следящим приводом
Добавлено: 16 ноя 2016, 17:47
Автоматизатор
Как оказалось, именно к первому витку (и последнему) предъявляются высокие требования. Надо все делать точно, быстро можно не успеть.
Вопрос: как влияет период обсчета на точность? Мне попадалась информация, что Кр должен быть выше 10 для хорошей системы. А у меня колебания начинаются с Кр = 3...5. Если период уменьшить до 5 мс, то это улучшит процесс?
Re: Алгоритм управления следящим приводом
Добавлено: 16 ноя 2016, 17:54
Автоматизатор
Михайло писал(а):Попробуй Ki = 0.1 для регулятора скорости.
Изменили момент инерции ротора двигателя с 0.0026 (по умолчанию) до 0.0046 кг*м2 (по документам). Вроде получше стало.
Re: Алгоритм управления следящим приводом
Добавлено: 16 ноя 2016, 18:27
Михайло
Кстати, формулы из википедии работают правильно при условии, что постоянный период (10 мс) между пересчетами действительно соблюдается. Может 10 мс слишком мало и происходит отставание?
Взял за основу следующие данные из таблицы: Kp, Ki и столбец E. По этим данным рассчитал столбцы PID_P и PID_I, затем рассчитал столбец V_PPO_PID по формуле из твоей программы. Получил совершенно другой результат. Построил график, обнаружил, что причиной краха всех расчетов является принудительное обнуление выхода ПИ-регулятора в тот момент, когда высота H резко изменяется от 250 до 0. В итоге, когда отпускаешь ПИ-регулятор в свободный расчет, у него оказывается неправильное накопленное значение V_PPO_PID. Меньше на 18 попугаев от правильного значения и это отставание по скорости сохраняется все оставшееся время навивки!
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;
Нельзя регулятору запрещать отрицательные скорости, ведь вполне возможны небольшие допустимые перерегулирования, в этом случае регулятор должен командовать отъезжать назад. Это важно, например, в конце процесса навивки.
Re: Алгоритм управления следящим приводом
Добавлено: 16 ноя 2016, 19:00
Михайло
И до сих пор непонятно, почему Vppo не догоняет V_PID. Надо настраивать регулятор скорости. У тебя разве привод не с обратной связью по скорости? Скалярное управление U/f? Видно, что как будто бы под нагрузкой привод проваливается по оборотам.
Re: Алгоритм управления следящим приводом
Добавлено: 16 ноя 2016, 19:35
Автоматизатор
Михайло писал(а):есть претензия к строчке:
Это верно, из-за этого провал в скорости. Это еще правленный вариант, еще не испробованный. На графике виден результат обнуления, который был раньше.
Re: Алгоритм управления следящим приводом
Добавлено: 16 ноя 2016, 19:39
Автоматизатор
Михайло писал(а):когда высота H резко изменяется от 250 до 0.
В этот момент сбрасываются старые значения, оставшиеся с прошлого раза, и начинается процесс. Просто в протокол записываются
Re: Алгоритм управления следящим приводом
Добавлено: 16 ноя 2016, 19:42
Автоматизатор
Михайло писал(а):У тебя разве привод не с обратной связью по скорости
С ней, особо не настраивали, т.к. едет достаточно точно, на первый взгляд.
Re: Алгоритм управления следящим приводом
Добавлено: 17 ноя 2016, 05:10
Михайло
Ну настрой хотя бы бездатчиковое векторное управление (SLVC).
Re: Алгоритм управления следящим приводом
Добавлено: 17 ноя 2016, 05:39
Автоматизатор
Михайло писал(а):Ну настрой хотя бы бездатчиковое векторное управление (SLVC).
Ты не так понял: "с ней" - это с ОСС. Настроен привод на закрытый вектор CLV.
Я думаю, что из-за медленного старта интегратор накапливает погрешность, которая накладывается на переходный процесс. Думаю сделать ручной старт, а потом включать регулятор (с какого места еще не решил).
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;