Bergvärme

Detaljer

Typ
Program
Upplaggd av
Ove Jansson, Abelko Innovation
Version
3
Uppdaterad
2013-09-03
Skapad
2013-08-28
Kategori
Allmän automation, Värme
Visningar
3088

Beskrivning

Responsmätning?

Bruksanvisning

Se kommentarerna i skriptet

Juridisk information

Alla skript tillhandahålls i befintligt skick och all användning sker på eget ansvar. Felaktig använding kan leda till skadad eller förstörd utrustning.

Skript kod

ROUTINE PIDCTRL_3
  ALIAS
    input = CHANNEL[149];
    y = CHANNEL[150];
    out = CHANNEL[151];
    Ivalue = CHANNEL[152];
    Dvalue = CHANNEL[153];
    yold = CHANNEL[154];
    cError = CHANNEL[155];
    K = PARAMETER[4];
    Ti = PARAMETER[5];
    Td = PARAMETER[6];
    Tt = PARAMETER[7];
    active = CHANNEL[148];
    filterCoef = PARAMETER[8];

    user_sv = PARAMETER[2]; %Önskatflöde
    
    man_auto = PARAMETER[3]; %Man/Auto
    pump_user = PARAMETER[9]; %
    patron_user = PARAMETER[12]; %Patronstatus vid manuell drift
    current_flow = CHANNEL[69]; %Volymflöde


    pump = CHANNEL[25]; %Tryckstyrning pump
    patron = CHANNEL[33]; %Elpatron

    run = PARAMETER[1]; %Kör processen
    patron_start_err = PARAMETER[10]; %Reglerfel för patron start
    patron_start_time = PARAMETER[11]; %Tid patron start
  VAR
    P;
    uc;
    h;
    v;
    firstRun;
    yFilt; yFiltPrev; N; b; ulow; uhigh; cnt;
    patron_cnt;
  BEGIN
    input <- user_sv;
    % convert m3/h to l/s
    y <- (current_flow*1000)/3600;

    IF run = 1 THEN
      % set some constants
      N:=10; b:=1; ulow:=0; uhigh:=100;
      % Set sample time, this is dependat of how often the
      % Kamstrupmeater can be read. 10 s is the fastest.
      h := 20;
  
      IF firstRun = 0 THEN
        yFilt := y;
      ELSE
        yFilt := filterCoef * yFiltPrev + (1-filterCoef) * y;
      ENDIF;
      yFiltPrev := yFilt;
    
      IF man_auto = 1 THEN
        IF cnt >= h THEN
          IF active > 0 THEN
          
            uc := input;
          
            P := K * ( b * uc - yFilt );
          
            IF (Td > 0) AND (N > 0) THEN
              Dvalue <- ( Td/(Td+N*h) ) * Dvalue - ( K*N*Td/(Td+N*h) ) * (yFilt - yold);
            ELSE
              Dvalue <- 0;
            ENDIF;
        
            v := P + Ivalue + Dvalue;
        
            IF v < ulow THEN 
              out <- ulow;
            ELSIF v > uhigh THEN
              out <- uhigh;
            ELSE
              out <- v;
            ENDIF;
            
            IF (Ti > 0) AND (Tt > 0) THEN
              Ivalue <- Ivalue + ( K*h/Ti ) * ( uc - yFilt ) + ( h/Tt ) * ( out - v );
            ELSIF (Ti > 0) AND (Tt <= 0) THEN
              Ivalue <- Ivalue + ( K*h/Ti ) * ( uc - yFilt );
            ELSE
              Ivalue <- 0;
            ENDIF;
          
            yold <- yFilt;
            
            cError <- yFilt - uc;

            IF ABS(cError) < patron_start_err THEN
              patron_cnt := patron_cnt + h;
            ELSE 
              patron_cnt := 0;
            ENDIF;

            IF patron_cnt > patron_start_time THEN
              patron <- 1;
            ENDIF;
            
          ELSE
            out <- 0; Ivalue <- 0; Dvalue <- 0; yold <- 0; cError <- 0;
            patron_cnt := 0;
          ENDIF;
          cnt := 0;
        ENDIF;
        
        IF firstRun = 0 THEN
          firstRun := 1;
        ENDIF;

        cnt := cnt+1;
      
        pump <- out;
      ELSE
        out <- 0; Ivalue <- 0; Dvalue <- 0; yold <- 0; cError <- 0;
        pump <- pump_user;
        patron <- patron_user;
        patron_cnt := 0;
      ENDIF;
    ELSE
      out <- 0; Ivalue <- 0; Dvalue <- 0; yold <- 0; cError <- 0;
      pump <- 0;
      patron <- 0;
      patron_cnt := 0;
    ENDIF;
END;

Användarnas noteringar

Du måste vara inloggad för att göra en notering. Bli medlem eller logga in. Vi använder en moderator som godkänner noteringarna innan de visas.