PHP While unterbrechen ?

Hallo zusammen,

ich frage per Seriellport (Seriell Netzwerkadapter)meinen Heizkessel ab.
Wenn aus irgendeinem Grund die Seriellverbindung unterbrochen wird
hängt sich mein Script auf.

Ich vermute das es in der while-Schleife die darauf wartet das alle Daten angekommen sind
stecken bleibt . Damit bleibt dann auch der Com-Port offen und ich kann diesen nicht
neu initialisieren.
Da hilft dann nur IPS beenden .

$contents = „“;
while (!feof($fp)) {
$contents .= fread($fp, 101);
}

Das Script fragt solange den COM-Port ab bis die Variable mit 101 Zeichen gefüllt ist.

Hat jemand eine Idee für mich wie ich aus der Whileschleife rauskomme wenn keine Daten kommen ?
Entweder zeitgesteuert oder vielleicht nach einer Anzahl Durchläufe ?
Oder gibt es inzwischen einen Befehl der ein Script killen kann ?

Gruß Udo

Hi Udo!

Mit „break“ kommst du da wieder raus. Ob du es nach Zeit oder nach Anzahl von Durchläufen machst, das bleibt dir überlassen :slight_smile:

PHP: break - Manual

Grüße,
Chris

„break“ von Chris passt schon, aber du solltest die grundlegende Kommunikation überdenken ;).

Sollte es mal länger dauern (als 30 Sekunden), wird dein Script automatisch beendet. Aber bei solchen Verbindungen bleibt das ganze dann gern hängen.

Besser wäre vermutlich der Versuch über ein „Client Connect“ und eine Registervariable, dann könntest du die Bearbeitung unabhängig durchführen und es würde auch ein automatischer Reconnect durch IPS erfolgen, wenn die Verbindung verloren geht.

Hallo zusammen,

das mit dem Break hatte ich mir fast gedacht.
ich kriege es aber noch nicht hin aus der Schleife raus zu kommen.

if($contents === false) break; funktioniert nicht, habe ich in der PHP-Hilfe
gefunden.

Ich habe bevor ich das ganze mit PHP gemacht habe die Sache über IPS gemacht,
Mit Register Variable und Seriellem Port
aber das war sehr langsam. Das Füllen der Variable mit den 101 Stellen hat teilweise
10 Sekunden gedauert und das System in den Keller gezogen.

Mit dem PHP Script läuft das seit 2 Jahren sehr stabil und sauber. Außer halt wenn der
Seriell to RJ45 Konnektor neu initialisiert, Passiert eigentlich nur wenn ich z.B. die
Steuerung von der Heizung abschalte oder mal den Netzwerkswitch der dazwischen hängt
vom Strom trenne.

Ich möchte das Ganze aber gerne abfangen, damit wenn es passiert, die Heizung nicht ausfällt.
Ist mir jetzt 2 x in den letzten Tagen passiert, da ich beim Renovieren die Sicherung von dem
Stromkreis mit dem Switch raus gemacht habe und dann vergessen habe nachzuschauen.

Gruß Udo

Ich glaub nicht, dass die Schleife dein Problem ist. fread „hängt“ sicher weil es nie eine Antwort bekommt. Das würde auch erklären warum break nichts bewirkt.

Schau mal ob du ein Read-Timeout übergeben kannst beim Öffnen der Verbindung.

Gruß,

Toni

Hallo Toni,

du hast recht.

Ich habe mir an verschiedene Stellen eine Variable geschrieben
um zu sehen wo es hängt,

Und es bleibt beim fread stehen.

Mal sehen wie ich das hin bekomme.

Gruß Udo

Hab nicht so viel Erfahrung mit PHP.

Das sollte ein Lösungsansatz sein: php - How to get fopen to timeout properly - Stack Overflow

Gruß,

Toni

@ Toni,

so ähnliche Beiträge hatte ich auch schon gefunden
aber irgendwie komme ich aus dem while nicht raus.

Ich muß mal eine Nacht drüber schlafen .

Vielleicht habe ich dann morgen einen Geistesblitz

Aber vielleicht hat ja nochjemand eine Idee

gruß Udo

Ich würde dafür den (Splitter) Cutter verwenden, da kann man Länge und Timeout festlegen

Serial Port -> Cutter -> Register Variable

Ich habe damit keine Verzögerungen.

@Charykun

ich hatte das ganze vor gut 2 Jahren zuerst so ausprobiert. Aber zum einen habe ich
für jeden Befehl den ich an die Steuerung sende verschieden lange Antworten
wo auch kein eindeutiges Endzeichen da ist. die muß ich dann auch noch in verschieden
lange Happen zerlegen .

Das größte Problem war aber das ich, wie schon geschrieben, eine sehr starke Auslastung
des System hatte beim Einlesen des COM-Port. Ich hatte Scriptlaufzeiten von rund 10 Sekunden
Bei PHP ist das Ganze in weniger als 1 Sekunde erledigt.

Nach einigen Recherchen hier im Forum, kam von mehreren hier der Vorschlag es besser direkt in PHP
zu machen. Seinerzeit habe ich noch mit IPS 2.5 gearbeitet. Mag sein, das es jetzt besser klappt,
Aber da sind etliche Seiten Code in tagelanger Arbeit programmiert die ich wahrscheinlich komplett
wegschmeissen kann wenn ich das umstelle.

Außerdem kann ich das dann erst im Sommer oder wenn es schön warm ist machen da sonst die Heizung
nicht läuft während ich das programmiere. Habe nur eine Heizungsstuerung an der ich das testen kann.

Gruß Udo