Advertisement
Guest User

SLC Tia-Portal TIA Portal PID PI Regler Controller

a guest
Jul 17th, 2018
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. FUNCTION_BLOCK "fb_D-Regler_V5.6.5"
  2. TITLE = D-Regler
  3. AUTHOR : sf
  4.    VAR_INPUT
  5.       ir_SollstwertDiverenz { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL;   // SollstwertDiverenz
  6.       ir_DifferenzialVerstärkung { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL := 1.0e+0;   // Differenzial-Verstärkung
  7.       itime_HaltezeitDifferezia { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : TIME;   // Differenzial-Haltezeit
  8.       ib_Reset { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : BOOL := FALSE;   // Reset
  9.    END_VAR
  10.  
  11.    VAR_OUTPUT
  12.       or_Reglerantwort { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL;   // Reglerantwort
  13.    END_VAR
  14.  
  15.    VAR
  16.       Zwischenwert { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL;
  17.       VergangeneZeit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL;   // in s
  18.       StaticZyklusZeit_Aux { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : LReal;
  19.    END_VAR
  20.  
  21.    VAR_TEMP
  22.       Haltezeit : REAL;   // in s
  23.    END_VAR
  24.  
  25.  
  26. BEGIN
  27.     // read system Time
  28.     #VergangeneZeit := LREAL_TO_REAL(RUNTIME(#StaticZyklusZeit_Aux));
  29.     // calc derivative time
  30.     #Haltezeit := DINT_TO_REAL(TIME_TO_DINT(#itime_HaltezeitDifferezia)) * 0.001;
  31.     // Startup initialisation
  32.     IF #itime_HaltezeitDifferezia = t#0s  OR #ib_Reset THEN
  33.        #Zwischenwert := 0;
  34.        #or_Reglerantwort := 0;
  35.     ELSE
  36.         //only do differential calc if time makes sens
  37.         IF #VergangeneZeit > 0 AND #VergangeneZeit < 0.1 THEN
  38.             #Zwischenwert += (#ir_SollstwertDiverenz - #Zwischenwert) * #VergangeneZeit / #Haltezeit;
  39.         END_IF;
  40.         #or_Reglerantwort := (#ir_SollstwertDiverenz - #Zwischenwert) * #ir_DifferenzialVerstärkung * -1;
  41.     END_IF;
  42. END_FUNCTION_BLOCK
  43.  
  44. FUNCTION_BLOCK "fb_PI-Regler_V5.6.5"
  45. VERSION : 0.1
  46.    VAR_INPUT
  47.       ir_Istwert { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL;   // Istwert
  48.       ir_Sollwert { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL;   // Sollwert
  49.       ir_ProportionalVerstärkung { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL := 20.0;   // Proportional-Verstärkung
  50.       ir_IntegralVerstärkung { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL := 5.0;   // Integral-Verstärkung
  51.       ir_UnteresLimit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL := 0.0;   // unteres Limit
  52.       ir_OberesLimit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL := 100.0;   // oberes Limit
  53.       ib_Reset { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : BOOL := FALSE;   // Reset
  54.    END_VAR
  55.  
  56.    VAR_OUTPUT
  57.       or_Reglerantwort { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL;   // Regler Ausgang
  58.    END_VAR
  59.  
  60.    VAR
  61.       StaticZyklusZeit_Aux { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : LReal;
  62.       Reglerantwort_Integral { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL;
  63.       Reglerantwort_Proportional { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL;
  64.       VergangeneZeit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL;   // in s
  65.    END_VAR
  66.  
  67.  
  68. BEGIN
  69.     //read elpsed Time in s since last Time*)
  70.     #VergangeneZeit := LREAL_TO_REAL(RUNTIME(#StaticZyklusZeit_Aux));
  71.     //initialize at power_up
  72.     IF #ib_Reset THEN
  73.         #Reglerantwort_Integral := 0.0;
  74.         #or_Reglerantwort := 0.0;
  75.     ELSE
  76.          // calculate proportional part
  77.          #Reglerantwort_Proportional := #ir_ProportionalVerstärkung * (#ir_Sollwert - #ir_Istwert);
  78.          //run integrator only IF Time makes sens
  79.          IF #VergangeneZeit > 0 AND #VergangeneZeit < 0.1 THEN
  80.              #Reglerantwort_Integral += #ir_IntegralVerstärkung * (#ir_Sollwert - #ir_Istwert) * #VergangeneZeit;
  81.          END_IF;
  82.          // calculate output  
  83.          #or_Reglerantwort := #Reglerantwort_Proportional + #Reglerantwort_Integral;
  84.          // check output FOR limits
  85.          IF #or_Reglerantwort >= #ir_OberesLimit THEN
  86.              #or_Reglerantwort := #ir_OberesLimit;
  87.              #Reglerantwort_Integral := #ir_OberesLimit - #Reglerantwort_Proportional;
  88.          ELSIF #or_Reglerantwort <= #ir_UnteresLimit THEN
  89.              #or_Reglerantwort := #ir_UnteresLimit;
  90.              #Reglerantwort_Integral := #ir_UnteresLimit - #Reglerantwort_Proportional;
  91.             END_IF;
  92.         END_IF;
  93.        
  94.        
  95. END_FUNCTION_BLOCK
  96.  
  97. FUNCTION_BLOCK "fb_PID-Regler_V5.6.5"
  98. VERSION : 0.1
  99.    VAR_INPUT
  100.       ir_Istwert { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL;   // Istwert
  101.       ir_Sollwert { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL;   // Sollwert
  102.       ir_ProportionalVerstärkung { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL := 20.0;   // Proportional-Verstärkung
  103.       ir_IntegralVerstärkung { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL := 5.0;   // Integral-Verstärkung
  104.       ir_DifferenzialVerstärkung { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL := 1.0;   // Differenzial-Verstärkung
  105.       itime_HaltezeitDifferezial { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : TIME;   // Differenzial-Haltezeit
  106.       ir_UnteresLimit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL := 0.0;   // unteres Limit
  107.       ir_OberesLimit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL := 100.0;   // oberes Limit
  108.       ib_Reset { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : BOOL := FALSE;   // Reset
  109.    END_VAR
  110.  
  111.    VAR_OUTPUT
  112.       or_Reglerantwort { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL;   // Regler Ausgang
  113.    END_VAR
  114.  
  115.    VAR
  116.       "idb_PI-Regler" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : "fb_PI-Regler_V5.6.5";
  117.       "idb_D-Regler" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : "fb_D-Regler_V5.6.5";
  118.       Reglerantwort_Integral { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL;
  119.       Reglerantwort_Differenzial { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL;
  120.    END_VAR
  121.  
  122.  
  123. BEGIN
  124.     #"idb_PI-Regler"(ir_Istwert := #ir_Istwert,
  125.                      ir_Sollwert := #ir_Sollwert,
  126.                      ir_ProportionalVerstärkung := #ir_ProportionalVerstärkung,
  127.                      ir_IntegralVerstärkung := #ir_IntegralVerstärkung,
  128.                      ir_UnteresLimit := #ir_UnteresLimit,
  129.                      ir_OberesLimit := #ir_OberesLimit,
  130.                      ib_Reset := #ib_Reset,
  131.                      or_Reglerantwort => #Reglerantwort_Integral);
  132.     #"idb_D-Regler"(ir_SollstwertDiverenz:=#ir_Sollwert - #ir_Istwert,
  133.                       ir_DifferenzialVerstärkung:=#ir_DifferenzialVerstärkung,
  134.                       itime_HaltezeitDifferezia:=#itime_HaltezeitDifferezial,
  135.                       ib_Reset:=#ib_Reset,
  136.                       or_Reglerantwort=>#Reglerantwort_Differenzial);
  137.     #or_Reglerantwort := LIMIT(MN:= #ir_UnteresLimit,
  138.                                IN:=#Reglerantwort_Integral + #Reglerantwort_Differenzial,
  139.                                MX:=#ir_OberesLimit);
  140. END_FUNCTION_BLOCK
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement