1.1k Aufrufe
Gefragt in Skripte(PHP,ASP,Perl...) von mikoop Experte (2.7k Punkte)
Hallo,

Momentan versuche ich über eine batch-Datei Relais anzusprechen, die am PC seriell angeschlossen sind. Dazu nutze ich das Programm Relaiser von Frank Steinberg.
Das klappt auch soweit ganz gut.

Das ganze soll quasi endlos durchlaufen, ausser wenn es später als eine bestimmte Uhrzeit ist.
Wenn die Uhrzeit beim Start der batch-Datei schon überschritten ist, dann startet die Datei wie geplant nicht.
Wird die Uhrzeit aber zwischendrin erreicht, läuft die Datei immer weiter durch, auch wenn sie am Start die Uhrzeit wieder checken soll.

Da ich mich dunkel daran erinnere, dass der Check der Uhrzeit in der Batch-Datei nicht aktualisiert wird, habe ich mal testweise versucht, die Zeitüberprüfung und das Ansprechen der Relais in zwei verschiedene batchs aufzuteilen, die sich gegenseitig aufrufen.
Das hat leider auch nicht geklappt.

Hier die Datei:

cls
cd\
cd relaiser
setlocal

:start

for /f "delims=:" %%i in ("%time%") do set /a Std=%%i

if %Std% geq 7 (
if %Std% lss 18 set "OK=1"
)

if defined OK (
goto anfang
) else (
goto ende
)

:anfang

echo.
echo.
echo starten der Bewaesserung
timeout /T 3 >NUL

rem Masterventil oeffnen
relaiser 3 3 128 com2

rem Platine 1
relaiser 3 1 1 com2
timeout /T 3
relaiser 3 1 2 com2
timeout /T 3
relaiser 3 1 4 com2
timeout /T 3
relaiser 3 1 8 com2
timeout /T 3
relaiser 3 1 16 com2
timeout /T 3
relaiser 3 1 32 com2
timeout /T 3
relaiser 3 1 64 com2
timeout /T 3
relaiser 3 1 128 com2
timeout /T 3
relaiser 7 1 128 com2

rem Platine 2
relaiser 3 2 1 com2
timeout /T 3
relaiser 3 2 2 com2
timeout /T 3
relaiser 3 2 4 com2
timeout /T 3
relaiser 3 2 8 com2
timeout /T 3
relaiser 3 2 16 com2
timeout /T 3
relaiser 3 2 32 com2
timeout /T 3
relaiser 3 2 64 com2
timeout /T 3
relaiser 3 2 128 com2
timeout /T 3
relaiser 7 2 128 com2

rem platine 3
relaiser 6 3 1 com2
timeout /T 3
relaiser 3 3 130 com2
timeout /T 3
relaiser 3 3 132 com2
timeout /T 3
relaiser 3 3 136 com2
timeout /T 3
relaiser 3 3 144 com2
timeout /T 3
relaiser 3 3 160 com2
timeout /T 3
relaiser 3 3 192 com2
timeout /T 3
relaiser 7 3 192 com2

rem platine 4 ohne Mastervalve
relaiser 3 4 1 com2
timeout /T 3
relaiser 3 4 2 com2
timeout /T 3
relaiser 3 4 4 com2
timeout /T 3
relaiser 3 4 8 com2
timeout /T 3
relaiser 7 4 8 com2

cls
echo Pause vor Wiederholung
timeout /T 1800
goto start

:ende
echo off
cls
echo.
echo.
echo Uhrzeit ausserhalb der vorgesehenen Bewaesserungszeit
echo Abbruch des Programms
echo.
timeout /T 60

exit



Das Alles läuft auf einem PC mit Win 7 Prof. als BS.

Wo kann da der Fehler liegen?
Mache ich einen Denkfehler?
Gibt es eine andere / bessere Lösung?

Danke und Gruss, Mikoop

12 Antworten

0 Punkte
Beantwortet von flupo Profi (17.8k Punkte)
Ich würde die zeitliche Steuerung von Windows machen lassen.
Über die Aufgabenplanung kann man sehr gut und mit beliebigen
Wiederholungen eine Batchdatei starten.
Also nur einen Ablauf in den Batch und dann zeitgesteuert immer wieder
starten.
Gruß Flupo
0 Punkte
Beantwortet von mikoop Experte (2.7k Punkte)
Hallo Flupo,

Danke für deine Antwort.

Auf die Windows Aufgabenplanung würde ich gerne verzichten.
Der Hintergrund dafür ist, dass es sich um die Steuerung einer Bewässerung handelt (handeln soll, jetzt noch Testphase)

Abhängig von Witterung, Bestand und Jahreszeit ändern sich die einzelnen Laufzeiten der Relais (i.d.R. zwischen 4 und 8 Minuten pro Durchgang) immer wieder mal und dadurch dann auch die Startzeiten.

Wenn ich da nicht aufpasse ist die Datei noch nicht durchgelaufen und wird nicht gestartet oder schmiert ab.

Um die Stabilität im Dauerbetrieb testen zu können (und um möglichst wenige Fehlerquellen zu haben) möchte ich möglichst wenige verschiedene Anwendungen nutzen.

Ich habe auch schon überlegt, ob sich das Ganze per VBS umsetzen lässt, davon habe ich aber so gut wie keine Ahnung...

Danke und Gruss, Mikoop
0 Punkte
Beantwortet von
na ja, ich habs jetzt nur mal schnell überflogen, aber du setzt die Variable "OK" einmalig auf 1 aber dann nicht mehr zurück. Heißt deine If abfrage (if defined OK) wird dann immer erfüllt egal wie oft und wann du an den Start springst
0 Punkte
Beantwortet von flupo Profi (17.8k Punkte)
Die wechselnden Durchläufe sind im Programm aber noch nicht berücksichtigt oder seh ich da was nicht?
Im Moment macht das Programm zwischen 7 und 18 Uhr alle 30 Min einen Durchlauf und das lässt sich mit der Aufgabenplanung super steuern.
Wenn die Pause zwischen den Durchläufen so lange ist, hast du doch genügend Puffer für die Schwankungen.

Reduziere den Batch auf das, was zwischen :Anfang und dem CLS vor der Pause steht.
In der Aufgabenplanung kannst du das so einrichten, dass dieser eine Durchlauf beginnend um 7 Uhr bis 18 Uhr alle halbe Stunde wiederholt wird. Mehr macht deine Batchdatei ja auch nicht.

So lassen sich auch für verschiedene Zeiträume unterschiedliche Bewässerungspläne (z.B. im Winter nur alle 45 min...) ganz einfach definieren und das ohne dass du nochmal an die Batchdatei ran musst.
Du musst dich auch nicht um den Start kümmern, weil Windows das selbst übernimmt.
Sorry, aber ich teile deine Bedenken nicht. ;-)

Ich hab aber auch noch ne Alternative:
Vor dem "goto start" einfügen:
set Std=%time:~0,2%

Damit schreibst du die Stunde (die ersten beiden Zeichen der Variable %Time%) neu in die Variable Std und kannst sie oben wieder auswerten. Die Zeile kannst du auch oben anstelle der For-Schleife einsetzen.
Der Else-Zweig mit dem OK=False fehlt natürlich auch noch, wie ifOK richtig angemerkt hat.

Gruß Flupo
0 Punkte
Beantwortet von flupo Profi (17.8k Punkte)
Hier mal meine (ungeprüfte) Version:


echo off
cls
cd\
cd relaiser
setlocal
set OK=true

:start
set Std=%time:~0,2%
if %Std% lss 7 (set OK=false)
if %Std% gtr 18 (set OK=false)

if "%OK%"=="true" (goto anfang) else (goto ende)

:anfang
...Relaissteuerung

cls
echo Pause vor Wiederholung
timeout /T 1800
goto start

:ende
cls
echo.
echo.
echo Uhrzeit ausserhalb der vorgesehenen Bewaesserungszeit
echo Abbruch des Programms
echo.
timeout /T 60
exit


Gruß Flupo
0 Punkte
Beantwortet von flupo Profi (17.8k Punkte)
Nach dem Abschicken hab ich noch eine mögliche Fehlerquelle gesehen.
Schau mal, wie Std bei einstelligen Uhrzeiten belegt wird und passe die erste IF-Zeile entsprechend an. Wahrscheinlich muss da "07" hin.

Gruß Flupo
0 Punkte
Beantwortet von flupo Profi (17.8k Punkte)
Die Zahlen in beiden IF-Zeilen müssen in Anführungszeichen stehen.
if %Std% lss "07" (set OK=false)
if %Std% gtr "18" (set OK=false)
0 Punkte
Beantwortet von mikoop Experte (2.7k Punkte)
Hallo nochmal,

Danke für eure engagierten Beiträge.

@Flupo
Du hast recht, die unterschiedlichen Bewässerungszeiten sind noch nicht berücksichtigt, da dies nur eine Testdatei ist und ich erst mal die grundsätzliche Funktionalität prüfen wollte.
Der Zeitcheck über die Batchdatei würde einfach besser ins Konzept passen, wenn es nicht geht muss ich dann neu darüber nachdenken.

Damit sind wir beim Thema:
Leider klappt es auch nicht mit deinen Änderungen:

:start
set Std=%time:~0,2%
if %Std% lss 7 (set OK=false)
if %Std% gtr 18 (set OK=false)


So ist es genauso wie bei meinem Versuch, es klappt bei jedem Start innerhalb des vorgesehenen Zeitraums, nach Erreichen der 18°° Uhr Marke läuft es aber immer weiter.

Wenn ich die Zahlen in "Anführungszeichen" setze oder die 7 als 07 schreibe wird der Vorgang immer gleich beim Start als ausserhalb des Zeitraums abgebrochen, auch wenn das nicht so ist.

Ausser zum Testen hatte ich heute keine Zeit, momentan verstehe ich nicht wo das Problem liegt.

Danke und Gruss, Mikoop
0 Punkte
Beantwortet von flupo Profi (17.8k Punkte)
Ich hatte doch noch einige Denk und Logikfehler drin.
Bei der Recherche hab ich auch das Forum gefunden, wo du deine Lösung her hast. :-)

So sollte es jetzt passen:
echo off

:start
set OK=AUS

for /f "delims=:" %%i in ("%time%") do set /a Std=%%i

if %Std% geq 7 (set OK=AN)
if %Std% geq 18 (set OK=AUS)

if "%OK%"=="AN" (
goto anfang
) else (
goto ende
)

:anfang
echo wasser marsch
echo ich warte
timeout /T 60
goto start

:ende
echo feierabend


Gruß Flupo
0 Punkte
Beantwortet von flupo Profi (17.8k Punkte)
Kleine Erläuterung noch als Nachtrag (wollte gestern abend ins Bett):
Hauptproblem unserer beider Versionen war das fehlende Rücksetzen
von OK. Dadurch hat die Prüfung auf das Ende der Bewässerungszeit
nicht funktioniert. Antwort 3 hat damit das Problem im Grunde gelöst.

Deine Version der Ermittlung und Setzen der Uhrzeit war besser als
meine da man hierbei kein Problem mit den einstelligen Stundenwerten
hat und eine numerische Variable bekommt, mit der man rechnen kann.
Die "größer/kleiner"-Sachen funktionieren mit Textvariablen nicht so gut
(so einfach).

Da ich mich dunkel daran erinnere, dass der Check der Uhrzeit
in der Batch-Datei nicht aktualisiert wird,

Das ist mit Sicherheit nicht der Fall. Wenn man die %Time%-Variable
abfragt, bekommt man immer den jeweils aktuellen Wert.

Viel Spaß beim Gießen ;-)
Gruß Flupo
...