/*=============================================
Zielregelung
30.11.05 Helmut_von_der_Reparatur
Eingabevariablen:
TargetPos Ziel in incr
Reg_Speed Geschwindigkeit in Anwendereinheit
Ausgabe:
Position_erreicht
Lokale Variablen:
Timer_1
Reg_Differenz
Reg_Divisor_Rampe
Reg_Divisor_Rampe_min
Reg_Divisor_Rampe_max
Reg_Faktor_Rampe
Reg_Lose_fahren
Reg_Lose_gefahren
Reg_Fenster In Incrementen
Verwendung
Automatik Modus
Funktionsweise
Es wird wird die Differenz zwischen soll und Istposition ermittelt
Dieser Wert ist die Geschwindigkeit, die nach oben durch die
Feldbusgeschwindigkeit begrenzt wird. Damit sanft in das Ziel gefahren
werden kann wird dieser Wert über einen Faktor und Divisor bewertet.
Damit man nicht in das Ziel reinschleicht ist ein zweiter Divisor
vorhanden (Divisor_min). Dieser wird kurz vor dem Ziel aktiv. Die Stoprampe ist
keine Gerade.
Die Stoprampe wird verschliffen
===============================================*/
Funktion_Zielregelung()
{
//----- Ziel ohne Schleife -----
Reg_Schmier = TargetPos;
//----- Schleife ausrechnen -----
if(Reg_Lose_fahren && !Reg_Lose_gefahren)
Reg_Schmier = TargetPos + (Reg_Lose* Faktor_Position / Divisor_Position);
//----- Schleife überfahren, Fahrt wiederholen -----
if(TargetPos > ActPos_Mot + Reg_Fenster)
Reg_Lose_gefahren = 0;
//----- Differenz zwischen Soll und Ist ausrechnen -----
Reg_Differenz = Reg_Schmier - ActPos_Mot;
if(Reg_Differenz < 0)
Reg_Schmier = -Reg_Differenz;
else
Reg_Schmier = Reg_Differenz;
//----- Ziel-Regelung durchführen -----
Reg_Divisor_Rampe = Reg_Schmier / 5 + Reg_Divisor_Rampe_min;
if(Reg_Divisor_Rampe > Reg_Divisor_Rampe_max)
Reg_Divisor_Rampe = Reg_Divisor_Rampe_max;
Reg_Schmier = Reg_Differenz * Reg_Faktor_Rampe / Reg_Divisor_Rampe;
if(Reg_Differenz > 0 && Reg_Schmier < 0)
Reg_Schmier = Reg_Speed;
if(Reg_Differenz < 0 && Reg_Schmier > 0)
Reg_Schmier = -Reg_Speed;
if(Reg_Schmier > Reg_Speed)
Reg_Schmier = Reg_Speed;
if(Reg_Schmier < -Reg_Speed)
Reg_Schmier = -Reg_Speed;
if((Reg_Schmier > 0) && (Reg_Schmier < Reg_Mindestdrehzahl))
Reg_Schmier = Reg_Mindestdrehzahl;
if((Reg_Schmier < 0) && (Reg_Schmier > -Reg_Mindestdrehzahl))
Reg_Schmier = -Reg_Mindestdrehzahl;
//----- Geschwindigkeit berechnen -----
Soll_Speed = Reg_Schmier * 0x4000 / 3000 * (Faktor_Speed / Divisor_Speed);
//----- Zieleinlauf durchführen -----
if(Reg_Differenz > Reg_Fenster || Reg_Differenz < -Reg_Fenster)
Timer_1 = Verz_Ziel;
if(Timer_1 == 0 && (Reg_Lose_gefahren || !Reg_Lose_fahren))
Pos_erreicht_SET;
if(Timer_1 == 0 && Reg_Lose_fahren)
Reg_Lose_gefahren = 1;
if(TargetPos == ActPos_Mot)
Soll_Speed = 0;
//----- Geschwindigkeit herausgeben -----
mcd.PO2 = Soll_Speed;
}