# pid_regulator

### Funkce

Číslicový regulátor, který podle dvou vstupních numerických výrazů - žádaná a regulovaná hodnota - vypočítá akční zásah (výstup). Má tři způsoby výpočtu akčního zásahu, které lze volit i během samotné regulace.

### Syntax

      pid_regulator pid_regulator_name;
        rem = string;
        bubble = string;
        timer = timer_name;
        owner = owner_name;
        position = integer, integer, integer, integer;
        win_disable = [ identifier, . . . ];
        win_title = string;
        access = integer;
        tab_select = integer;
        send_same_data;
        condition = boolean_expression;
        wish_value = real_expression;
        expression = real_expression;
        output = real_dataelement;
        inverse;
        receivers = [ identifier, . . . ];
        manual = real_expression;
        parameters
          regulator_type = identifier;
          adaptive = boolean;
          refil = boolean;
          param_1 = real;
          param_2 = real;
          param_3 = real;
          file_name = file_name;
        end_parameters;
        show_description;
        wish_value_section
          BLOCK_SECTION
        end_wish_value_section;
        value_section
          BLOCK_SECTION
        end_value_section;
        output_section
          BLOCK_SECTION
        end_output_section;
        colors
          border_ink = color;
          border_paper = color;
          top_shadow = color;
          bottom_shadow = color;
          ink = color;
          paper = color;
          value = color;
          low_limit = color;
          high_limit = color;
          h_grid = color;
          v_grid = color;
        end_colors;
      end_pid_regulator;

      BLOCK_SECTION
        ratio = integer;
        view_position = integer;
        mode = identifier;
        content = identifier;
        range_from = real;
        range_to = real;
        low_limit = real;
        high_limit = real;
        history = integer;
        dec_places = integer;
        real_step = real;
        h_grid = integer;
        v_grid = integer;
        font = font_identifier, integer, style_identifier;
        mask = string;

### Specifické parametry přístroje

- condition
  Obsahuje podmínku spuštění regulace. Dokud není výraz condition = true, regulátor nenastavuje na výstup žádnou hodnotu.
- wish_value
  Číselný výraz určující žádanou hodnotu, které se regulátor bude snažit dosáhnout.
- expression
  Číselný výraz s hodnotou aktuálního stavu regulované veličiny, tuto veličinu regulátor reguluje.
- output
  Obsahuje datový element, proměnnou nebo kanál, na který bude regulátor posílat vypočtený regulační zásah. Velikost zásahu je určena mezemi definovanými v sekci output regulátoru. Akční zásah nepřesáhne hodnotu range_to a neklesne pod hodnotu range_from.
- inverse
  parametr určující smysl výstupu regulátoru. Je-li tato volba zvolena dochází ke změně smyslu výstupní veličiny tak, že maximální výstup regulátoru odpovídá minimální hodnotě rozsahu výstupní sekce a minimální výstup odpovídá hodnotě rozsahu výstupní sekce maximální.
- receivers
  Seznam přístrojů, kterým se budou posílat zprávy o akcích regulátoru. Podle nastavení parametru send_same_data se regulátor chová dvěma způsoby - buď volá přístroje uvedené v receivers jen při změně akční hodnoty (parametr send_same_data není nastaven), nebo (send_same_data nastaven je) v každém časovém kroku bez ohledu na stav nebo změnu stavu akční veličiny.
- manual
  Výraz definující akční zásah při nesplněné podmínce regulace. Pomocí tohoto výrazu je možné zaručit stálý korektní výstup regulátoru, i když je regulátor vypnut. Při opětovném zapnutí regulace pomocí výrazu condition bude první akční hodnotou hodnota výrazu tohoto parametru.
- regul_type
  Druh regulačního algoritmu použitého k regulaci. Regulátor poskytuje následujíci algoritmy:
    classical - PID regulátor, který počítá regulační zásah podle klasické rovnice diskretizovaného spojitého PID regulátoru.
    classicalDelay - jedná se o modifikaci předchozího regulátoru, která obsahuje navíc filtraci derivačního členu regulátoru.
    takahashi - PID regulátor, který počítá regulační zásah podle rovnice odvozený Takahashim. Tato rovnice obsahuje některé úpravy vedoucí v některých případech ke zkvalitnění regulace.
    takahashiDelay - opět modifikace regulátoru takahashi s filtrací derivačního členu regulátoru.
    Výše uvedené čtyři typy regulátorů počítají regulační zásah podle klasického schematu s pomocí parametrů r0, Ti a Td. Tyto konstanty je možné vypočítat z automaticky získaných parametrů regulované soustavy. Je potom lhostejno, zdali se tyto tři konstanty použijí fixní nebo automaticky vypočítané (viz níže parametr adaptive). Výše uvedené regulátory tedy mohou být adaptivní i neadaptivní.
    variable - tvarovatelný. U této modifikace regulátoru je možné pomocí dvou konstant - poměrného tlumení a kruhové frekvence - určit tvar průběhu regulované veličiny. Obě konstanty mohou nabývat hodnot (0; 1>, přičemž nižší hodnoty znamenají rychlejší regulaci s větší pravděpodobností překmitu a naopak. Z hlediska kvality regulace se doporučuje, aby součin obou konstant byl v intervalu <0.85; 0.95>. Konkrétní hodnoty je však nutno získat experimentálně na skutečné regulované soustavě. Regulátor variable počítá regulační zásah z automaticky získaných parametrů soustavy bez použití konstant r0, Ti a Td jiným algoritmem. Pro správnou funkci tedy tento regulátor musí být vždy autoadaptivní.
- adaptive
  Je-li hodnota tohoto parametru true, je zapnuta automatická identifikace a konstanty r0, Ti a Td jsou zjišťovány dynamicky během procesu regulování.
- refil
  Je-li hodnota parametru true, používá regulátor k identifikaci algoritmu číslicové odmocninové filtrace pomocí filtru Refil. V opačném případě se identifikuje soustava iterativní metodou nejmenších čtverců.
  UPOZORNĚNÍ:
  Více informací o použitých regulačních mechanismech a regulátorech samotných je možné nalézt v kapitole Regulátory a regulace manuálu.
- param_1
  U regulátoru classical zesílení, u regulátoru variable poměrné tlumení
- param_2
  U regulátoru classical integrační konstanta (v sekundách), u regulátoru variable kruhová frekvence
- param_3
  U regulátoru classical derivační konstanta (v sekundách)
- file_name
  Obsahuje název souboru s uloženými parametry regulátoru.
- show_description
  je klíčové slovo, které určuje, zda se má zobrazit popis jednotlivých sekcí regulátoru.
- section a end_section
  Jsou klíčová slova, mezi kterými jsou umístěny parametry ovlivňující vzhled vykreslování výstupní a dvou vstupních hodnot.
- ratio
  Vyjadřuje poměrnou část šířky plochy, která bude nastavena této sekci vzhledem k celkové šířce regulátoru.
- view_position
  Má hodnotu 1, 2, nebo 3, která udává pořadí sekce v regulátoru při zobrazování.
- mode
  Určuje grafickou podobu zobrazení uvedením jednoho z názvů módu:
    pointer - ručkový přístroj
    digital - digitální přístroj s celistvými číslicemi
    dot_digital - digitální přístroj s bodovými číslicemi
    vertical_bar - poměrná svislá barevná plocha
    horizontal_bar - poměrná vodorovná barevná plocha
    flow_graph - posunující se graf
    sweep_graph - stojící graf
    text_display - textový displej
- content
  Má rovněž vliv na grafickou podobu přístroje. Může nabývat tří hodnot : max, med a min. Pro všechny módy znamená nastavení content = max zobrazení kompletní podoby přístroje. Některé módy navíc umožňují schovat jednu ze svých částí, a to nastavením parametru content = med , popř. content = min.
- range_from a range_to
  Jsou parametry udávající rozsah přístroje. Bude-li hodnota vstupního výrazu přístroje menší, než je hodnota range_from, přístroj se nastaví právě na hodnotu uvedenou v range_from; stejně tak bude-li hodnota vstupního výrazu přesahovat range_to, přístroj se nastaví právě na hodnotu uvedenou v range_to.
- low_limit a high_limit
  Jsou parametry ovlivňující barevné zobrazení vykreslované hodnoty. Je–li hodnota menší než low_limit, vykresluje se barva uvedená v parametru colors–low_limit, přesáhne–li hodnota high_limit, pak je aktuální barva parametru colors–high_limit. V rozsahu mezi limitami se hodnota vykresluje barvou colors–value. Podle zvoleného módu se bude měnit např. barva pozadí přístroje, popř. se danými barvami vykreslí hodnoty obou limit v grafu.
- history
  Udává počet zobrazených hodnot v grafu. U jiných módů nemá význam.
- dec_places
  Je počet zobrazovaných desetinných míst pro módy s číselným vykreslováním hodnoty.
- real_step
  Je parametr důležitý pro nastavování limitů přístroje pomocí numerického řádku. Jeho numerická velikost udává přírůstek hodnoty při použití přičítacích a odečítacích šipek numerického řádku.
- h_grid a v_grid
  Jsou parametry určující zobrazení vodorovných a svislých čar do grafu jako jeho pomocné síťování. Velikost parametrů h_grih a v_grid udává počet zobrazených vodorovných a svislých čar.
- font
  Je parametr určující font při vykreslování hodnoty módem text_display. Má vždy tři části. První z nich font_identifier určuje typ písma (např. TIMES, SYSTEM, aj.), druhý určuje jeho velikost v tiskových bodech a třetí parametr style_identifier rozhoduje o tom, zda bude písmo normální (normal), tučné (bold) nebo skloněné (italic).
- mask
  Je šablona pro vypisování libovolného textu současně s numerické hodnotou přístroje. Parametr má význam při mode = text_display. V textovém režimu se zadává v uvozovkách, v inspektoru přístroje bez uvozovek. Může mít např. tvar mask = 'rychlost = ##.## m/s'; , kde znak # udává umístění a velikost zobrazované numerické hodnoty.

### Poznámky

- Více informací o použitých regulačních mechanismech a regulátorech samotných je možné nalézt v kapitole Regulátory a regulace manuálu.
- Implicitně jsou nastaveny parametry:
    position = 0, 0, 100, 80;
    access = 4294967295;
    tab_select = 4294967295;
    access = 65535;
    tab_select = 65535;
    regulator_type = quick;
    param_1 = 1;
    param_2 = 1;
    param_3 = 1;

### Příklad

Příklad nastavení parametrů přístroje pid_regulator:

      pid_regulator id_2;
        timer = 1;
        owner = background;
        position = 217, 29, 445, 208;
        wish_value = w;
        expression = vystup_ze_soustavy;
        output = r;
        condition = start;
        output_section
          mode = flow_graph;
        end_output_section;
        wish_value_section
          view_position = 1;
          font = TIMES, 10, normal;
          mask = 'input ##.#';
        end_wish_value_section;
        value_section
          mode = flow_graph;
          history = 50;
        end_value_section;
        colors
          paper = white;
          value = black;
        end_colors;
      end_pid_regulator;

### Nativní procedury přístroje

Podrobnější informace k nativním procedurám je možné nalézt v kapitole Regulátory a regulace.

    SetRegulatorType( type : number )
    GetRegulatorType( VAR type : real )

Metody sloužící k zjišťování a nastavování typů regulátorů. Parametr type může nabývat následujích hodnot:

  1 - classical
  2 - classicalDelay
  3 - takahashi
  4 - takahashiDelay
  5 - variable

    SetAdaptive( Adaptive : boolean );
    GetAdaptive( VAR Adaptive : boolean );

Metody pro zapínání a vypínání samočinné identifikace. Je-li parametr Active = true identifikace běží, případně bude běžet.

    SetParameters( t, omega : real );
    SetParameters( r0, tI, tD : real );
    GetParameters( VAR t, omega : real );
    GetParameters( VAR r0, tI, tD : real );

Metody slouží ke změně parametrů regulátorů za běhu regulace. Pro tvarovatelný regulátor má význam metoda se dvěma parametry - poměrným tlumením a kruhovou frekvencí; pro klasický regulátor je určena metoda se třemi parametry - zesílením, integrační a derivační konstantou. Volání metody s neodpovídajícím počtem parametrů vede na chybu překladu aplikační úlohy. Více informací je možné získat v referenční příručce PID regulátoru.

    SetDerivationDelay( k : real );
    GetDerivationDelay( VAR k : real );

Metody nastavují nebo zjišťují hodnotu parametru filtrace derivační složky regulátorů takahashiDelay a classicalDelay. Více viz kapitola Regulátory a regulace.

    RunIdentification();
    StopIdentification();
    IsIdentificationRunning( VAR running : boolean );

Metody pro řízení a zjišťování stavu identifikačního procesu. Metoda RunIdentification spustí identifikaci bez ohledu na její stav, metoda StopIdentification ji vypne. Následující časový krok ji však zase může zapnout. Více viz kapitola Regulátory a regulace.

    SetIdentification( type : number );
    GetIdentification( VAR type : real );

Metody pro nastavování způsobu identifikace soustavy. Povolené parametry jsou:

  1 - identifikace iterativní metodou nejmenších čtverců
  2 - identifikace metodou číslicové odmocninové filtrace

Více viz kapitola Regulátory a regulace.

    SetLastOutputValue( Value : real );

Metoda ovlivňuje vnitřní stav regulátoru a přestavuje poslední hodnotu akčního zásahu. Nový akční zásah je vypočítán jako součet hodnoty posledního zásahu a korekce vypočtené regulátorem. Pomocí této metody je tedy možné efektivně a rychle dosáhnout požadované počáteční hodnoty výstupu.
UPOZORNĚNÍ: U adaptivního regulátoru je možné tímto zásahem způsobit nefunkčnost regulační smyčky. Více viz kapitola Regulátory a regulace.

    SetOutputTrimming( OutputTrimming : boolean );

PID regulátor během regulace akumuluje ve své integrační části minulé akční zásahy a uchovává je ve svém vnitřním stavu. Tento vnitřní stav je kopírován na výstup regulátoru. Výstupní sekce (output_section) definuje meze, které výstup regulátoru nesmí překročit. Může tak nastat situace, kdy se vnitřní stav regulátoru liší od jeho skutečného výstupu -- výstup je ořezán. Předdefinované nastavení regulátoru tento stav vylučuje, dochází k degradaci vnitřního stavu podle definovaných výstupních mezí. Regulátor potom reaguje mnohem rychleji na změnu stavu soustavy. Ořezávání vnitřního stavu však má za následek, že regulátor v okamžiku dosažení meze výstupu přestává integrovat, nechová se tedy podle rovnic uvedených v kapitole Regulátory a regulace.

OCL metoda SetOutputTrimming vypíná (nebo zapíná) ořezávání výstupu. Pokud je ořezávání zapnuto (přednastavená hodnota), je vnitřní stav totožný s výstupem, naopak je vnitřní stav korektní podle definice regulátoru a výstup je jiný -- přizpůsobený výstupním mezím.

### Událostní procedury přístroje

Přístroj může volat standardní událostní procedury:

    OnActivate()
    OnShow()
    OnHide()
    OnNewPosition( RectX, RectY, RectW, RectD : integer )
    OnWindowMinimize()
    OnWindowMaximize()
    OnWindowRestore( WasMinimized, WasMaximized : boolean )
    OnWindowClose()

Podrobnější informace k těmto procedurám lze nalézt v kapitole Programování a procedury.

### Specifické událostní procedury přístroje

    OnOutput( &U : real )

Proceduru přístroj volá vždy při nastavení výstupu, ať již je jeho hodnota jakákoli. Procedura je proto volána v každém časovém kroku přístroje. Parametr U obsahuje aktuální hodnotu výstupu regulátoru, přičemž tato hodnota v okamžiku volání procedury ještě není zapsána do výstupního datového elementu. Procedura proto může výstup regulátoru ovlivnit upravením parametru U na libovolnou hodnotu. Teprve takto upravená (případně nezměněná) hodnota bude zapsána na výstup regulátoru.

    OnOutputChange( &U : real )

Proceduru přístroj volá vždy při nastavení výstupu, je-li jeho aktuální hodnota odlišná od hodnoty předchozí. Procedura proto nemusí být volána v každém časovém kroku přístroje. Parametr U obsahuje aktuální hodnotu výstupu regulátoru, přičemž tato hodnota v okamžiku volání procedury ještě není zapsána do výstupního datového elementu. Procedura proto může výstup regulátoru ovlivnit upravením parametru U na libovolnou hodnotu. Teprve takto upravená (případně nezměněná) hodnota bude zapsána na výstup regulátoru.