регулятор?

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Russian to

Threaded View
Hello All!

Где бы подсмотреть исходник реализации ПИД-регулятора, желательно на Си, а не
на ассемблере? Или почитать статью о том, как их _правильно_ писать.
"кое-как" - я и сам умею, только что приятелю разжевывал. Хочется посмотреть
как Умные Люди пишут...

Zahar(@spbdept.rbc.ru)


RE:pегулятоp?
Hello, Zahar!

ZK> "кое-как" - я и сам умею, только что пpиятелю pазжевывал. Хочется
ZK> посмотpеть как Умные Люди пишут...

Для ПИД - умные не те, кто пишет, а кто паpаметpы контуpа выставляет...
Во где диссеpов наклепано...



Best regards,  //   Совесть - неотъемлемый компонент
Yurij.         //          знаний и опыта.

регулятор?
Hi Zahar, hope you are having a nice day!


24 Hоя 03, Zahar Kiselev wrote to All:

 ZK> Где бы подсмотреть исходник реализации ПИД-регулятора, желательно на
 ZK> Си,

Почти в любой книжке, например:

double Kp;
double Ti;
double Td;
double h;
double Tt;
double ref_value;
int n;

double PID(double value);
{
    static double I;
    static double D;
    static double old_value;
    double result;
    double out_error;
    double error;

    error = ref_value - value;
    D += Kp * n * (old_value - value);
    D *= Td / (Td + n * h);         // diff. filtering
    result = Kp * error + I + D;    // calculate output power
    I += Kp * error * h / Ti;       // calculate integral part
    if (result > MAXPOWER)          // check limits
    {
        out_error = MAXPOWER - result;
        result = MAXPOWER;
    }
    else
        if (result < 0)
        {
            out_error = -result;
            result = 0;
        }
        else
            out_error = 0;
    I += out_error * h / Tt;        // antiwindup (integral tracking)
    old_value = value;
    return result;
}

 ZK> а не на ассемблере?

Hа асме сложнее найти.

 ZK> Или почитать статью о том, как их _правильно_
 ZK> писать.

А как можно написать неправильно? Функция простая, как-то иначе написать ее
трудно.

 ZK> "кое-как" - я и сам умею, только что приятелю разжевывал.
 ZK> Хочется посмотреть как Умные Люди пишут...


WBR,
    AVB

ICQ# 43835774
mailto: avb<at>dialup.etr.ru

Re: регулятор?
Hello, Alexey!
You wrote to Zahar Kiselev on Tue, 25 Nov 2003 23:17:23 +0500:

 AV> Kp * error + I + D;    // calculate output power
 AV>     I += Kp * error * h / Ti;       // calculate integral part
 AV> if (result > MAXPOWER)          // check limits     {
 AV>         out_error = MAXPOWER - result;
 AV>         result = MAXPOWER;
 AV>     }
 AV>     else         if (result < 0)
 AV>         {
 AV>             out_error = -result;
 AV>             result = 0;
 AV>         }
 AV>         else             out_error = 0;
 AV>     I += out_error * h / Tt;        // antiwindup (integral
 AV> tracking)
 AV>     old_value = value;
 AV>     return result;

Hе расскажешь ли подробнее, как работает механизм антинасыщения, а то, что
то я не въеду никак?
По сути, вроде бы, должно было бы так: интегральная компонента перестает
накапливаться при выходе пропорциональной компоненты за допустимые пределы.
Т.е. если разица между уставкой и измеренной величиной такова, что выходная
мощность (без учета интегральной и дифференциальной компонент) выходит за
пределы 0..100%, то интегральная компонента перестает накапливаться.
Фактически, за пределами зоны пропорциональности ( 1/Ку) ПИД регулятор
превращается в двухпозиционный регулятор.

With best regards, Serge.



регулятор?
Hi Serge, hope you are having a nice day!


26 Hоя 03, Serge Eremenko wrote to Alexey V Bugrov:

 AV>> Kp * error + I + D;    // calculate output power
 AV>>     I += Kp * error * h / Ti;       // calculate integral part
 AV>> if (result > MAXPOWER)          // check limits     {
 AV>>         out_error = MAXPOWER - result;
 AV>>         result = MAXPOWER;
 AV>>     }
 AV>>     else         if (result < 0)
 AV>>         {
 AV>>             out_error = -result;
 AV>>             result = 0;
 AV>>         }
 AV>>         else             out_error = 0;
 AV>>     I += out_error * h / Tt;        // antiwindup (integral
 AV>> tracking)
 AV>>     old_value = value;
 AV>>     return result;

 SE> Hе расскажешь ли подробнее, как работает механизм антинасыщения, а то,
 SE> что то я не въеду никак? По сути, вроде бы, должно было бы так:
 SE> интегральная компонента перестает накапливаться при выходе
 SE> пропорциональной компоненты за допустимые пределы. Т.е. если разица
 SE> между уставкой и измеренной величиной такова, что выходная мощность
 SE> (без учета интегральной и дифференциальной компонент) выходит
 SE> за пределы 0..100%, то интегральная компонента перестает
 SE> накапливаться. Фактически, за пределами зоны пропорциональности (
 SE> 1/Ку) ПИД регулятор превращается в двухпозиционный регулятор.

Это один из вариантов антинасыщения. В данном случае при выходе мощности за
100% значение интеграла сбрасывается до
значения, которое обеспечит выходную мощность равную 100%. Если это делать
сразу (т.н. back calculate), то регулятор
становится чувствительным к шуму (который может сбрасывать интеграл больше чем
нужно). Поэтому коррекция производится с
некоторой постоянной времени Tt, которая выбирается из соображений Tt =
sqrt(Ti*Td).

WBR,
    AVB

ICQ# 43835774
mailto: avb<at>dialup.etr.ru

Re: регулятор?
Hello, Alexey!
You wrote to Serge Eremenko on Wed, 26 Nov 2003 18:30:28 +0500:

 AV> Это один из вариантов антинасыщения. В данном случае при выходе
 AV> мощности за 100% значение интеграла сбрасывается до значения,
 AV> которое обеспечит выходную мощность равную 100%. Если это делать
 AV> сразу (т.н. back calculate), то регулятор становится чувствительным
 AV> к шуму (который может сбрасывать интеграл больше чем нужно). Поэтому
 AV> коррекция производится с некоторой постоянной времени Tt, которая
 AV> выбирается из соображений Tt =
 AV> sqrt(Ti*Td).

А какое ни будь теоретическое обоснование для такого вольного обращения с
интегралом есть (хотя бы ссылочку)? Мне кажется, что качество регулирования
при таком способе сильно пострадает. Хотя, конечно, может быть я ошибаюсь.

With best regards, Serge.



регулятор?
Hi Serge, hope you are having a nice day!


27 Hоя 03, Serge Eremenko wrote to Alexey V Bugrov:

 AV>> Это один из вариантов антинасыщения. В данном случае при выходе
 AV>> мощности за 100% значение интеграла сбрасывается до значения,
 AV>> которое обеспечит выходную мощность равную 100%. Если это делать
 AV>> сразу (т.н. back calculate), то регулятор становится
 AV>> чувствительным к шуму (который может сбрасывать интеграл больше
 AV>> чем нужно). Поэтому коррекция производится с некоторой постоянной
 AV>> времени Tt, которая выбирается из соображений Tt = sqrt(Ti*Td).

 SE> А какое ни будь теоретическое обоснование для такого вольного
 SE> обращения с интегралом есть (хотя бы ссылочку)? Мне кажется, что
 SE> качество регулирования при таком способе сильно пострадает. Хотя,
 SE> конечно, может быть я ошибаюсь.

Именно _теоретическое_ обоснование я дать затруднюсь. Hиже несколько ссылок в
которых этот медот рассмотрен. Вообще в
литературе он встречается очень часто. С точки зрения здравого смысла это не
приводит к плохим результатам, т.к. влияет
только на переходной процесс и в устоявшемся режиме не влияет на процесс вообще
(а собственно здесь и работает
интеграл. Практические наблюдения показывают, что с такой схемой регулирования
регулятор себя ведет лучше, чем с
простой блокировкой интеграла, т.к. схема одинаково хорошо себя ведет при любых
значениях регулятора. Выбег
получается существенно меньше.

http://www.control.auc.dk/~hr/adapt/auto.pdf
http://www.cds.caltech.edu/~murray/courses/cds101/fa02/caltech/astrom-ch6.pdf

WBR,
    AVB

ICQ# 43835774
mailto: avb<at>dialup.etr.ru

Re: регулятор?
Hello, Alexey!
You wrote to Serge Eremenko on Thu, 27 Nov 2003 19:38:42 +0500:


 AV> встречается очень часто. С точки зрения здравого смысла это не
 AV> приводит к плохим результатам, т.к. влияет только на переходной
 AV> процесс и в устоявшемся режиме не влияет на процесс вообще (а
 AV> собственно здесь и работает интеграл. Практические наблюдения
 AV> показывают, что с такой схемой регулирования регулятор себя ведет
 AV> лучше, чем с простой блокировкой интеграла, т.к. схема одинаково
 AV> хорошо себя ведет при любых значениях регулятора. Выбег получается
 AV> существенно меньше.

IMHO, чаще всего интересует как раз переходный процесс. С точки зрения
установившегося процесса, достаточно выбрать поменьше коэффициент усиления и
побольше время интегрирования. При отсутствии возмущающих воздействий
регулятор всегда найдет необходимое значение выходной мощности, при котором
поддерживается заданная уставка, а при достаточно большом Ti и маленьком Ку
вообще не будет никакого выбега.

Спасибо за ссылочки, почитаю.

With best regards, Serge.



Re: регулятор?
Hello, Serge!
You wrote to Alexey V Bugrov on Fri, 28 Nov 2003 12:31:49 +0300:

 AV>> собственно здесь и работает интеграл. Практические наблюдения
 AV>> показывают, что с такой схемой регулирования регулятор себя ведет
 AV>> лучше, чем с простой блокировкой интеграла, т.к. схема одинаково
 AV>> хорошо себя ведет при любых значениях регулятора. Выбег получается
 AV>> существенно меньше.

 SE> IMHO, чаще всего интересует как раз переходный процесс. С точки зрения
 SE> установившегося процесса, достаточно выбрать поменьше коэффициент
 SE> усиления и побольше время интегрирования. При отсутствии возмущающих
 SE> воздействий регулятор всегда найдет необходимое значение выходной
 SE> мощности, при котором поддерживается заданная уставка, а при достаточно
 SE> большом Ti и маленьком Ку вообще не будет никакого выбега.

Если интеграл насытится, то выбег будет полюбому, а при малом Кp переходной
процесс затянется. Реализацию , похожую на приведенную здесь я применяю в
своих разработках, результатами вполне доволен. Кстати, astrom-ch6.pdf - это
глава 6 из книги K.J. Astrom'а, весьма интересная (хотя и достаточно
старая), советую скачать ее целиком (правда почему-то на том сайте нет
второй главы).

WBR,
        AVB



Site Timeline