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 |