Archiv verlassen und diese Seite im Standarddesign anzeigen : Einfache Zeitsteuerung / M-Unit
elektronix00
19.08.2006, 09:24
Hi @ all,
Ich möchte eine Pumpensteuerung für einen Zimmerspringbrunnen (2 Pumpen) bauen.
Über 4 versch. Taster soll der Modus ausgewählt werden.
Taste 1 = Pumpe 1 soll 30 min laufen, dann 15 min Pause. Dann wieder von vorn beginnen.
Taste 2 = Pumpe 2 soll 30 min laufen, dann 15 min Pause. Dann wieder von vorn beginnen.
Taste 3 = Pumpe 1 soll 30 min laufen, dann Pumpe 2 für 30 min. Dann wieder von vorn beginnen.
Taste 4 = Pumpe 1 und 2 sollen beide gleichzeitig 30 min laufen, dann 15 min Pause. Dann wieder von vorn beginnen.
Für Pumpe 1 und 2 wurden die beiden Digitalports (Ausgänge) gewählt. Über einen Vorwiderstand soll ein Transistor jeweils ein Relais ansteuern.
Für Taster 1 bis 4 wurden die Digitalports Ports 3 bis 6 gewählt. Alle haben einen 10k Pull up Widerstand, die Eingänge liegen also auf High und werden durch die Taster auf Low gezogen.
Hier noch das Listing:
'************************************************* *******************************
'
' 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
'
'
define Minuten Word
define Anzeit 30 ' 30 min
'
' ---------- Programmoperationen ----------
Pumpe1 = off
Pumpe2 = off
Taster1 = on
Taster2 = on
Taster3 = on
Taster4 = on
if Taster1 = off then gosub Programm1
if Taster2 = off then gosub Programm2
if Taster3 = off then gosub Programm3
if Taster4 = off then gosub Programm4
#Programm1
Pumpe2 = off
Pumpe1 = on
for Minuten = 1 to Anzeit
next Minuten
Pause 45000 ' 15 min Auszeit
return
#Programm2
Pumpe1 = off
Pumpe2 = on
for Minuten = 1 to Anzeit
next Minuten
Pause 45000 ' 15 min Auszeit
return
#Programm3
Pumpe1 = on
Pumpe2 = off
for Minuten = 1 to Anzeit
next Minuten
Pumpe1 = 0
Pumpe2 = on
for Minuten = 1 to Anzeit
next Minuten
return
#Programm4
Pumpe1 = on
Pumpe2 = on
for Minuten = 1 to Anzeit
next Minuten
Pause 45000 ' 15 min Auszeit
return
Schönes Beispiel ich habe es jetzt nicht geprüft aber es sieht recht übersichtlich aus.
Wenn damit keine Frage verbunden ist, dann könnte man ja darüberhinaus noch überlegen, ob man mit Spannungsteilern mehrere Tasten an einen A/D-Port bringt um auch noch eine Aus- Funktion zu realisieren.
Ich will aber das sehr übersichtliche Beispiel damit nicht stören.
Manfred
elektronix00
19.08.2006, 14:33
Hallo Manfred,
sicher ging es um Fragen zu meinem Lsting, hatte ich nur vergessen zu schreiben.
Es funktioniert nämlich nicht. Und ich kann den fehler einfach nicht finden. Da ich schon sehr lange nicht mehr mit der c-control gearbeitet habe, denke, das es nur eine Kleinigkeit im Programm sein kann. Vielleicht wirfst du mal einen Blick über den Quelltext.
Grüße Michael
Wie sieht denn die Umgebung aus, hast Du es mit Trace getestet und dir in der (verkürzten) Warteschleife die entsprechenden Zustände ausgeben lassen?
Kannst Du mit der HW die Steuereingänge ansprechen und auch ohne Pumpen (z.B. mit LED) die Funktion prüfen?
Manfred
elektronix00
19.08.2006, 21:07
Hallo Manfred,
ich habe die Ausgänge (Pumpen) durch LEDs ersetzt, die Eingänge (Taster habe ich provisorisch mit einer Drahtbrücke simuliert, die Platine auf dich ich die M-Unit draufgesetzt habe, hat nämlich Schraubklemmen. Ich arbeite mit der ccontrol Basic Version 1.33. Den Trace Befehl kenne ich nicht.
Wird das compilierte Programm auf die M-Unit übertragen, dann der START-Jumper gesetzt, so leuchtet sofort die LED für Pumpe 1 ohne das ein Taster simuliert wird. Eigentlich reagiert die Schaltung auch garnicht auf simulierte Tastereingaben. Nach Ablauf der Zeit (habe die Zeit zum testen gekürzt) wechselt das Programm auf LED2 (Pumpe2), das Programm läuft also quasi ohne das irgendweine Taste gedrückt bzw. simuliert wird.
Grüße Michael
Das Hauptprogramm soll natürlich für sich ablauffähig sein, es läuft nach der Abfrage der Taster in die Unterprogramme.
Ein Loop zur Tastaturabfrage im Hauptprogramm wäre hier ein erster Schritt.
...
Danach ist es sicher besser wenn das Program nicht im Unterprogramm wartet sondern von dort einen Wartezeitwert mitnimmt und das Warten wieder im Hauptprogramm durchführt wo es zur Not wieder ansprechbar ist.
Manfred
elektronix00
20.08.2006, 10:13
Hallo Manfred,
wie ich ja schon vorher in meinen Hinweisen geschrieben habe, bin ich nicht sonderlich fit mit dieser ccbasic-Software und deren Befehle. Ich dachte eigentlich eher, das jemand, der sich auskennt mein Listing kopiert und geändert bzw. verbessert erneut postet.
Grüße Michael
Ich habe nichts dagegen wenn es jemand macht.
Falls nicht, orientiere Dich an dem Beispiel hier mit dem
https://www.roboternetz.de/phpBB2/viewtopic.php?p=197281#197281
DO
-
if Taster1 = off then gosub Programm1
if Taster2 = off then gosub Programm2
if Taster3 = off then gosub Programm3
if Taster4 = off then gosub Programm4
-
LOOP
Damit das Hauptprogramm solange abfragt bis die Eingabe kommt.
Manfred
elektronix00
20.08.2006, 11:20
Hallo Manfred,
zuerst mal Danke für deine schnelle Antworten.
Also vielleicht habe ich vergessen zu erwähnen, das ich noch eine ältere M-Unit besitze, der Beispiel-link bezieht sich auf eine M-Unit 2.0.
Ich habe nun wie oben angegeben, die DO LOOP Schleife genau so in meinem Programm gesetzt. Beim compilieren bekomme ich aber dann die Fehlermeldung: undefiniertes Label LOOP.
Grüße Michael
Dafür gibt es dann das (Label) an der Stelle des DO
und das GOTO (Label) an der Stelle des LOOP.
Am besten auch an einem Programm Beispiel heraussuchen. (für die Synatx)
Manfred
http://www.b-kainka.de/ccbsp.htm
#Loop
Einer = Hour mod 10
Zehner = Hour / 10
Daten1 = Zehner * 16 + Einer
Einer = Minute mod 10
Zehner = Minute / 10
Daten2 = Zehner * 16 + Einer
goto Loop
end
Jörn Arne
20.08.2006, 19:13
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:
' ---------- 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
Eine Kleinigkeit ist noch das Goto am Ende von Programm1, das soll sicher zu Loop gehen.
Nach Beendigung der jeweiligen Programmschleife soll es in die Hauptschleife zurückkehren.
Manfred
Suggarman
21.08.2006, 08:50
"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
elektronix00
21.08.2006, 09:58
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
Eine Kleinigkeit ist noch das Goto am Ende von Programm1, das soll sicher zu Loop gehen.
Nach Beendigung der jeweiligen Programmschleife soll es in die Hauptschleife zurückkehren.
Manfred
Goto loop am Ende jeder Schleife.
Manfred
Jörn Arne
21.08.2006, 11:31
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)
Taste 1 = Pumpe 1 soll 30 min laufen, dann 15 min Pause. Dann wieder von vorn beginnen.
muss ein Rücksprung auf das jeweilige Programm erfolgen
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
Jörn Arne
21.08.2006, 11:55
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:
' --------------------------
'
' 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
Vielleicht kann man das ja gebrauchen
Jörn Arne
Suggarman
21.08.2006, 12:14
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
Suggarman
21.08.2006, 12:53
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
elektronix00
22.08.2006, 09:46
Hallo Jörn,
dein Programm habe ich soweit übernommen und halt noch ergänzt für die anderen Programmabschnitte. Und es läuft wie gewünscht. Tolle Arbeit. Nochmals herzlichen Dank für deine Mühe. Ebenfalls ein dickes Danke an all die anderen, die ebenfalls mit Tipps und Hinweisen zur Lösung beitragen konnten.
Grüße Michael
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.