SHOW:
|
|
- or go back to the newest paste.
| 1 | FUNCTION_BLOCK "fb_D-Regler_V5.6.5" | |
| 2 | TITLE = D-Regler | |
| 3 | - | { S7_Optimized_Access := 'TRUE' }
|
| 3 | + | |
| 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 | - | { S7_Optimized_Access := 'TRUE' }
|
| 46 | + | |
| 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 | - | { S7_Optimized_Access := 'TRUE' }
|
| 100 | + | |
| 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 |