Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- FUNCTION_BLOCK "fb_D-Regler_V5.6.5"
- TITLE = D-Regler
- AUTHOR : sf
- VAR_INPUT
- ir_SollstwertDiverenz { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL; // SollstwertDiverenz
- ir_DifferenzialVerstärkung { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL := 1.0e+0; // Differenzial-Verstärkung
- itime_HaltezeitDifferezia { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : TIME; // Differenzial-Haltezeit
- ib_Reset { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : BOOL := FALSE; // Reset
- END_VAR
- VAR_OUTPUT
- or_Reglerantwort { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL; // Reglerantwort
- END_VAR
- VAR
- Zwischenwert { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL;
- VergangeneZeit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL; // in s
- StaticZyklusZeit_Aux { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : LReal;
- END_VAR
- VAR_TEMP
- Haltezeit : REAL; // in s
- END_VAR
- BEGIN
- // read system Time
- #VergangeneZeit := LREAL_TO_REAL(RUNTIME(#StaticZyklusZeit_Aux));
- // calc derivative time
- #Haltezeit := DINT_TO_REAL(TIME_TO_DINT(#itime_HaltezeitDifferezia)) * 0.001;
- // Startup initialisation
- IF #itime_HaltezeitDifferezia = t#0s OR #ib_Reset THEN
- #Zwischenwert := 0;
- #or_Reglerantwort := 0;
- ELSE
- //only do differential calc if time makes sens
- IF #VergangeneZeit > 0 AND #VergangeneZeit < 0.1 THEN
- #Zwischenwert += (#ir_SollstwertDiverenz - #Zwischenwert) * #VergangeneZeit / #Haltezeit;
- END_IF;
- #or_Reglerantwort := (#ir_SollstwertDiverenz - #Zwischenwert) * #ir_DifferenzialVerstärkung * -1;
- END_IF;
- END_FUNCTION_BLOCK
- FUNCTION_BLOCK "fb_PI-Regler_V5.6.5"
- VERSION : 0.1
- VAR_INPUT
- ir_Istwert { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL; // Istwert
- ir_Sollwert { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL; // Sollwert
- ir_ProportionalVerstärkung { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL := 20.0; // Proportional-Verstärkung
- ir_IntegralVerstärkung { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL := 5.0; // Integral-Verstärkung
- ir_UnteresLimit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL := 0.0; // unteres Limit
- ir_OberesLimit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL := 100.0; // oberes Limit
- ib_Reset { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : BOOL := FALSE; // Reset
- END_VAR
- VAR_OUTPUT
- or_Reglerantwort { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL; // Regler Ausgang
- END_VAR
- VAR
- StaticZyklusZeit_Aux { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : LReal;
- Reglerantwort_Integral { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL;
- Reglerantwort_Proportional { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL;
- VergangeneZeit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL; // in s
- END_VAR
- BEGIN
- //read elpsed Time in s since last Time*)
- #VergangeneZeit := LREAL_TO_REAL(RUNTIME(#StaticZyklusZeit_Aux));
- //initialize at power_up
- IF #ib_Reset THEN
- #Reglerantwort_Integral := 0.0;
- #or_Reglerantwort := 0.0;
- ELSE
- // calculate proportional part
- #Reglerantwort_Proportional := #ir_ProportionalVerstärkung * (#ir_Sollwert - #ir_Istwert);
- //run integrator only IF Time makes sens
- IF #VergangeneZeit > 0 AND #VergangeneZeit < 0.1 THEN
- #Reglerantwort_Integral += #ir_IntegralVerstärkung * (#ir_Sollwert - #ir_Istwert) * #VergangeneZeit;
- END_IF;
- // calculate output
- #or_Reglerantwort := #Reglerantwort_Proportional + #Reglerantwort_Integral;
- // check output FOR limits
- IF #or_Reglerantwort >= #ir_OberesLimit THEN
- #or_Reglerantwort := #ir_OberesLimit;
- #Reglerantwort_Integral := #ir_OberesLimit - #Reglerantwort_Proportional;
- ELSIF #or_Reglerantwort <= #ir_UnteresLimit THEN
- #or_Reglerantwort := #ir_UnteresLimit;
- #Reglerantwort_Integral := #ir_UnteresLimit - #Reglerantwort_Proportional;
- END_IF;
- END_IF;
- END_FUNCTION_BLOCK
- FUNCTION_BLOCK "fb_PID-Regler_V5.6.5"
- VERSION : 0.1
- VAR_INPUT
- ir_Istwert { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL; // Istwert
- ir_Sollwert { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL; // Sollwert
- ir_ProportionalVerstärkung { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL := 20.0; // Proportional-Verstärkung
- ir_IntegralVerstärkung { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL := 5.0; // Integral-Verstärkung
- ir_DifferenzialVerstärkung { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL := 1.0; // Differenzial-Verstärkung
- itime_HaltezeitDifferezial { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : TIME; // Differenzial-Haltezeit
- ir_UnteresLimit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL := 0.0; // unteres Limit
- ir_OberesLimit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL := 100.0; // oberes Limit
- ib_Reset { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : BOOL := FALSE; // Reset
- END_VAR
- VAR_OUTPUT
- or_Reglerantwort { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL; // Regler Ausgang
- END_VAR
- VAR
- "idb_PI-Regler" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : "fb_PI-Regler_V5.6.5";
- "idb_D-Regler" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : "fb_D-Regler_V5.6.5";
- Reglerantwort_Integral { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL;
- Reglerantwort_Differenzial { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : REAL;
- END_VAR
- BEGIN
- #"idb_PI-Regler"(ir_Istwert := #ir_Istwert,
- ir_Sollwert := #ir_Sollwert,
- ir_ProportionalVerstärkung := #ir_ProportionalVerstärkung,
- ir_IntegralVerstärkung := #ir_IntegralVerstärkung,
- ir_UnteresLimit := #ir_UnteresLimit,
- ir_OberesLimit := #ir_OberesLimit,
- ib_Reset := #ib_Reset,
- or_Reglerantwort => #Reglerantwort_Integral);
- #"idb_D-Regler"(ir_SollstwertDiverenz:=#ir_Sollwert - #ir_Istwert,
- ir_DifferenzialVerstärkung:=#ir_DifferenzialVerstärkung,
- itime_HaltezeitDifferezia:=#itime_HaltezeitDifferezial,
- ib_Reset:=#ib_Reset,
- or_Reglerantwort=>#Reglerantwort_Differenzial);
- #or_Reglerantwort := LIMIT(MN:= #ir_UnteresLimit,
- IN:=#Reglerantwort_Integral + #Reglerantwort_Differenzial,
- MX:=#ir_OberesLimit);
- END_FUNCTION_BLOCK
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement