Nach Beendigung der jeweiligen Programmschleife soll es in die Hauptschleife zurückkehren.Eine Kleinigkeit ist noch das Goto am Ende von Programm1, das soll sicher zu Loop gehen.
Manfred
Hallo!
Ich habe mir dein Listing mal angesehen und eine Auffälligkeit entdeckt:
#Programm1
Pumpe2 = off
Pumpe1 = on
for Minuten = 1 to Anzeit
next Minuten
Pause 45000 ' 15 min Auszeit
return
Hier läuft eine Schleife (for Minuten...) genau 30 mal (Anzeit = 30),
aber sie führt nichts aus (Die schleife benötigt sicher weniger als eine Sekunde um vollständig durchzulaufen) dann kommt erst eine richtige Verzögerung von 15Minuten
Um das zu erreichen was zu vorhast, würde ich die Schleife gegen folgendes ersetzen:
-------------------------------------
#Programm1
Pumpe2 = off
Pumpe1 = on
Pause 90000 ' 30 min An Zeit
Pumpe1 = off
Pause 45000 ' 15 min Auszeit
goto Programm1
-------------------------------------
Also im gesamten Listing:
Code:' ---------- Definitionen ---------- ' 'Ausgänge define Pumpe1 port[1] 'ohne Pullup-Widerstand define Pumpe2 port[2] 'ohne Pullup-Widerstand ' 'Eingänge define Taster1 port[3] 'mit Pullup-Widerstand define Taster2 port[4] 'mit Pullup-Widerstand define Taster3 port[5] 'mit Pullup-Widerstand define Taster4 port[6] 'mit Pullup-Widerstand ' ' define Minuten Word define Anzeit 30 ' 30 min ' ' ---------- Programmoperationen ---------- Pumpe1 = off Pumpe2 = off Taster1 = on Taster2 = on Taster3 = on Taster4 = on 'Manfs Code: #Loop - if Taster1 = off then goto Programm1 'Achtung: jetzt goto Befehle! if Taster2 = off then goto Programm2 if Taster3 = off then goto Programm3 if Taster4 = off then goto Programm4 - goto Loop 'Code von oben #Programm1 Pumpe2 = off Pumpe1 = on Pause 90000 ' 30 min An Zeit Pumpe1 = off Pause 45000 ' 15 min Auszeit goto Programm1
Die anderen Programmblöcke würde dann ähnlich dem ersten sein.
Wie Manf allerdings schon geschrieben hat, gibt es keine Möglichkeit, das Program nach einem Start zu ändern, ohne nicht vorher die Unit zu resetten.
Um einen Programmwechsel zu ermöglichen, muss der Code erweitert werden, und da musst du dann auch von langen Pause-Befehlen absehen
Man kann führ Zeit-Aufgaben die Uhr verwenden, die im Hintergrund der Unit läuft
Wenn du möchtest, kann ich dir noch ein paar Ideen über diese Methode geben
Gruß
Jörn Arne
Nach Beendigung der jeweiligen Programmschleife soll es in die Hauptschleife zurückkehren.Eine Kleinigkeit ist noch das Goto am Ende von Programm1, das soll sicher zu Loop gehen.
Manfred
"Taster1 = on
Taster2 = on
Taster3 = on
Taster4 = on
"
Du weist hier einem Eingang einen Wert zu ! Weg damit.
Über die Pullups sind die Eingänge doch high und werden bei Betätigung des Tasters auf Masse gezogen.
Über eine Widerstandskette kann man alle Taster an einem AD Port betreiben, falls Deine Ports knapp werden.
mfg
Stefan
DANKE @ all,
ich habe jetzt sämtliche Verbesserungsvorschläge und Ideen in meinen neuen Code gebracht. Das Programm läuft jetzt. Wichtig war wirklich, das ich auch die ON-Zustände der Taster ausgeklmammert habe, es war sonst kein Starten der einzelnen Programme möglich. Aber es wurde auch schon bemerkt, das man nicht so einfach einen Programmwechsel vornehmen kann, es muss tatsächlich jeweils vorher resettet werden. Ich könnte zwar mit diesem kleinen Schönheitsfehler leben, würde mich aber freuen, wenn wir diese Funktion hier auch noch lösen könnten.
Grüße Michael
Hier noch der aktuelle Code:
'************************************************* *******************************
'
' C-Control Basic pumpe.bas
' Aufgabe:
'
' Taste 1 steuert Pumpe 1 für 30 min - dann 15 min Pause
'
' Taste 2 steuert Pumpe 2 für 30 min - dann 15 min Pause
'
' Taste 3 steuert Pumpe 1 dann Pumpe 2 mit den gleichen Zeiten
'
' Taste 4 steuert Pumpe 1 und 2 gleichzeitig mit den gleichen Zeiten wie oben
'
'************************************************* *******************************
' ---------- Definitionen ----------
'
'Ausgänge
define Pumpe1 port[1] 'ohne Pullup-Widerstand
define Pumpe2 port[2] 'ohne Pullup-Widerstand
'
'Eingänge
define Taster1 port[3] 'mit Pullup-Widerstand
define Taster2 port[4] 'mit Pullup-Widerstand
define Taster3 port[5] 'mit Pullup-Widerstand
define Taster4 port[6] 'mit Pullup-Widerstand
'
' ---------- Programmoperationen ----------
Pumpe1 = off
Pumpe2 = off
'Taster1 = on
'Taster2 = on
'Taster3 = on
'Taster4 = on
#loop
if Taster1 = off then goto Programm1
if Taster2 = off then goto Programm2
if Taster3 = off then goto Programm3
if Taster4 = off then goto Programm4
goto loop
#Programm1
Pumpe2 = off
Pumpe1 = on
Pause 90000 ' 30 min Anzeit
Pumpe1 = off
Pause 45000 ' 15 min Auszeit
goto Programm1
#Programm2
Pumpe1 = off
Pumpe2 = on
Pause 90000 ' 30 min Anzeit
Pumpe2 = off
Pause 45000 ' 15 min Auszeit
goto Programm2
#Programm3
Pumpe1 = on
Pumpe2 = off
Pause 90000 ' 30 min Anzeit
Pumpe1 = off
Pumpe2 = on
Pause 90000 ' 30 min Anzeit
goto Programm3
#Programm4
Pumpe1 = on
Pumpe2 = on
Pause 90000 ' 30 min Anzeit
Pumpe1 = off
Pumpe2 = off
Pause 45000 ' 15 min Auszeit
goto Programm4
zugeschnitte Drähte sind immer zu kurz.![]()
Oszillatoren schwingen nie, Verstärker immer.
Goto loop am Ende jeder Schleife.Zitat von Manf
Manfred
Hallo!
Ein 'goto Loop' würde das Program nur einmal ausführen (dann wäre auch die Pause am Ende eines Programs überflüssig), da die Programme aber periodisch laufen sollen (so habe ich das verstanden)
muss ein Rücksprung auf das jeweilige Programm erfolgenTaste 1 = Pumpe 1 soll 30 min laufen, dann 15 min Pause. Dann wieder von vorn beginnen.
Gruß
Jörn Arne
Ja wenn das so ist, ich konnte mir einen solchen Ablauf ohne weitere Eingriffsmöglichkeit nicht so recht vorstellen.
Dann ist es wohl umso interessanter eine Tastenabfrage in den Programmablauf einzubinden.
Manfred
Eine Idee hätte ich, man könnte eine Art Fortschalteautomatik programmieren, wie bei einer Waschmaschine.
Man unterteilt die Programme in Programmschritte
Nach Ablauf einer Zeit wird in den nächsten Programmschritt weitergeschaltet, das Programm kehrt in die Hauptschleife zurück, wo es die Tasten abfragt und die Zeit überwacht.
Überlegt hab ich mir da was und habe mal ein Testprogramm gebastelt, ich habe es noch nicht ausgiebig getestet, es gibt bestimmt noch eine Dinge die man verbessern kann:
Vielleicht kann man das ja gebrauchenCode:' -------------------------- ' ' Projekt: 'Brunnensteuerung ' Beschreibung: 'Fortschalteautomatik 'byJ.A. '--------------------------- ' ---------- Definitionen ---------- ' 'Ausgänge define Pumpe1 port[1] 'ohne Pullup-Widerstand define Pumpe2 port[2] 'ohne Pullup-Widerstand ' 'Eingänge define Taster1 port[3] 'mit Pullup-Widerstand define Taster2 port[4] 'mit Pullup-Widerstand define Taster3 port[5] 'mit Pullup-Widerstand define Taster4 port[6] 'mit Pullup-Widerstand define desiredDelay byte 'Verzögerungszeit in Minuten define selectedProgram byte 'Ausgewähltes Programm define programStep byte 'Aktuellerprogrammschritt define maxSteps byte 'Anzahl der Programmschritte des jeweiligen Programms ' ' ---------- Programmoperationen ---------- Pumpe1 = off Pumpe2 = off ' Programmteil #Main if Taster1 = off then gosub initProgramm1 'if Taster2 = off then gosub initProgramm2 'if Taster3 = off then gosub initProgramm3 'if Taster4 = off then gosub initProgramm4 if ((minute => desiredDelay) and (selectedProgram >0)) then gosub nextStep 'Nach Ablauf der Verzögerungszeit wird einen Schritt weiter geschaltet 'Prüfen ob Programm gewählt wurde goto main ' Unterprogramme '---------Programm1------------------------------- #initProgramm1 selectedProgram = 1 'Ausgewähltes Programm festlegen programStep = 0 'Ausgangsposition festlegen maxSteps = 2 'Anzahl der Programmschritte minute = 0 'Systemzeit zurücksetzen 'läuft direkt weiter zum 1. Programmschritt 'Programmschritte: #program1Step0 Pumpe2 = off 'Pumpenzustände einstellen Pumpe1 = on desiredDelay = 30 'gewünschte Zeit bis zum nächsten Schritt return #program1Step1 Pumpe2 = off 'Pumpenzustände einstellen Pumpe1 = off desiredDelay = 15 'gewünschte Zeit bis zum nächsten Schritt return 'weitere Schritte möglich '---------Programm2------------------------------- '#initProgramm2 '.... '------------------------------------------------- #nextStep programStep = programStep + 1 'Programmschritt um 1 erhöhen if programStep = maxSteps then programStep = 0 'Maximalschritt erreicht? Dann wieder von vorn minute = 0 if selectedProgram = 1 then on programStep gosub program1Step0, program1Step1 'Gewähltes Programm abfragen dann Springen in den jeweiligen Programmschritt 'if selectedProgram = 2 then on programStep gosub program2Step0, program2Step1 '.... return
Jörn Arne
Nimm doch lieber einer 5-stufigen Drehschalter (4 Programme und Aus).
Da dann das gewünschte Programm dauerhaft dem Controller signalisiert wird, brauchst Du nach Ablauf der Zeit immer nur ins Hauptprogramm zu springen und dann entsprechend dem Schalter wieder in ein Unterprogramm.
mfg
Stefan
Das Programm hat noch mehr Fehler und ist sehr unkomfortabel.
Eine Pause 90000 ist zu groß, bei 65535 ist Schluß.
Besser wäre es, einfach in Minuten zu rechnen (über die Zeitfunktionen in Basic: hour, minute).
Zeit bei Start merken, Stop-Zeit = Startzeit + 30 (Wenn >59, dann 60 abziehen) so kann man zwischendurch immer die Taster/Schalter abfragen um ggfs ein anderes Programm zu wählen.
mfg
Stefan
Lesezeichen