Hi Freaks,
Ich habe hier im Forum gelesen, dass die Verwendung von 'goto'eher Pfui in C++ ist.
In einem Projekt muss ich nun zum Initialisieren ein Ventil motorisch zu/ Auf fahren, bis der Endschalter gekommen ist.
In der Referenz finde ich den Goto Befehl mit dem Besispiel zum Herausspringen aus einer Schleife. Alos denke ich mir das so, dass ich das Initialisieren anschubse, getaktet zu fahre, dann getaktet Auf fahre bis der jeweilige Enschalter angesprochen hat. Ich habe dies, lt. Besispiel mit einer For Schleife überlegt, wobei bei Erreichen des Endpunkts der Schleife ein alarm initiert werden kann, andernfalls wird das Programm beim Anfahren des jeweiligen Endschalters fortgesetzt.
Is es einfach/ sinnvoll NICHT mit der Goto Funktion an dieser Stelle zu arbeiten?
//Temepraturregelung über Adruino
// Gegeben: Drehventil mit Motorantrieb, ca. 30 auf/zu, Endlagenkontakte
// Temp Erfassung mit PTC/Spannungsteiler, Solltemperatur über Spindelpoti, Vergleich 2x analog in
// Ziel: Bei Temperaturanforderung Heizen oder Kühlen bis beide Analogsignale in der Hysterese sind
// Takten des Motors über Zeit/ PWM um breite Anpassung an Mechanik zu ermöglichen
// Später auch Einbindung von PID in einen Regler
// Variablen:
int PlusK = 200; // der Motor dreht für diese Zeit das Kühlventil AUF
int MinusK = 200; // der Motor dreht für diese Zeit das Kühlventil ZU
int K_ZU = 0; // Kühlventil ist ZU, Endlage, int. Pullup aktiviert
int K_AUF = 0; // Kühlventil ist AUF, Endlage, int Pullup aktiviert
int HysTemp = 20; // XXX Einheiten + - Abweichung ohne Reaktion auf Regelausgang.
int KuhlPlus = 5; // Treiber für Kühlventil Öffnen auf Pin5
int KuhlMinus = 6; // Treiber für Kühlventil Schleiessen auf Pin 6
int HeizSSR = 7; // Treiber für SSR, langzeit PWM, daher digital out, Pin 7
int Lampe = 13; // mit LEd 13 fahren/ Regeln anzeigen
int Kalib = 1; // Kalibrieren beim Starten. Zum direkten Regeln auf 0 setzten
int FahrenHi = 50; // LED ist an für XXX ms wenn Ventil fährt
int FahrenLo = 200;// LED ist aus für XXX ms wenn Ventil fährt
int RegelnHi = 20; // LED ist an für XXX ms, wenn System regelt
int RegelnLo = 500;// LED ist aus für xxx ms, wenn system regelt
int Fehler = 250; // LED blinkt mit Takt XXX Ein/ Aus
int TempFue = 1; // Temperaturfühler auf analog Pin
int TempPoti = 2; // Poti auf analog Pin
int KaliZ = 0; // Hilfsvariable Kalibrierung Zu
int KaliA = 0; // Hilfsvariable Kalibrierung Auf
int Kali = 0; // Hilfsvariable Kalibrierung Kalibrierung notwendig
int k1 = 0; // Zahlerschleife Hilfsvariable
int k2 = 0; // Zählerschleife Hilfsvariable
long time = 0; // Zeitpunkt erfassen zum takten
//später evtl Einlesen aus LCD, unrechnen in Realtemperaturen
void setup()
{
pinMode(KuhlPlus,OUTPUT);
pinMode(KuhlMinus,OUTPUT);
pinMode(HeizSSR,OUTPUT);
pinMode(Lampe,OUTPUT);
pinMode(K_ZU,INPUT);
digitalWrite(K_ZU,HIGH);
pinMode(K_AUF,INPUT);
digitalWrite(K_AUF,HIGH);
}
void loop()
{
// Initialisieren: Ventil fährt im takt nach AUF, dan auf ZU, Testen der Endlagen
// Hier passiert was
if(Kalib >= 0)
{
KaliBrieren();
}
}
// Definition der Funktionsgruppen Kallibrieren, Regeln,
void KaliBrieren()
// schließe Kühlventil bis zum Endtaster
{
for( k1 = 0; k1 < 501; k1++); // 500 steps nach Zu
if(k1 > 0 && K_ZU == HIGH) // Schleife UND Endlagenschlater offen
{
analogWrite(KuhlMinus,255); // Takt ZU
delay(MinusK);
analogWrite(KuhlMinus,0);
delay(500);
}
if (digitalRead(K_ZU) == 0) // Endlage erreicht
{
goto OPEN;
}
OPEN:
for(k2 = 0; k2= 500; k2++);
{
analogWrite(KuhlPlus,255);
delay(PlusK);
analogWrite(KuhlPlus,0);
delay(500);
}
if (digitalRead(K_AUF) == 0)
{
goto ReGeln;
}
ReGeln:
// zu Ende
delay(2); // Hier steht was
}
THX4Ur help
Greetz, Linpo