Hilfe bei PHP Fread nach Umstieg auf Win7

Hallo zusammen,

habe meinen IPS auf einen neuen Rechner mit Win7 statt XP installiert.

Es läuft alles soweit. Nur meine PHP Scripte in denen ich direkt den
COM-Port anspreche funktionierne nicht mehr.

fwrite ($fp, ($Command.$Ckecksum));
	ips_sleep(300);

fwrite ($fp, ($Command.$Ckecksum));
ips_sleep(300);

 	}
 
 	if ($Command <= "G999999")
	{

	fwrite ($fp, ($Command.$Ckecksum));
	ips_sleep(200);
	$contents = "";
	while (!feof($fp))
			{
			$contents .= fread($fp, 2);
			if($contents === false) {break;}
			}
			fclose ($fp);
  setvalue(37195 /*[Heizung\Kessel\Soll-Werte\abfragen  51]*/,true);
	}

Der fwrite funktioniert scheinbar, zumindest sehe ich in einem Seriellport Monitorprogramm den
Befehl , aber beim fread kommen keine Daten an .

Hat jemand eine Idee was da anders sein könnte?

Hi!

Du hast jetzt IPS 3.4 installiert?

Der COM-Port ist bei dir als im IPS unter „I/O Instanzen“ als „Serial Port“ angelegt?

Befehle auf den COM-Port senden kannst du direkt mit „SPRT_SendText“ (siehe IPS Doku). Oder du lässt alles über eine Register-Variable laufen und/oder eine Splitter Instanz.

Grüße,
Chris

Weder noch Chris.
Er schreibt und liest mit PHP direkt den Port.
Michael

Wie Michael richtig erkannt hat will ich am liebsten direkt
in PHP schreiben und lesen.

Es war eine heiden Arbeit das für fast 10 verschieden Befehle
zu programmieren.

Leider sind die empfangenen Daten je nach gesendetem Befehl unterschiedlich lang und es gibt auch
kein vernüftiges Endzeichen.
Daher die While-Schleife mit PHP

Ich habe heute schon mit Serial Port Cutter Registervariable rumgebastelt,
aber ich schaffe es nicht die Daten in die Registervariable zu schreiben.
Ich sehe die im Cutter aber die kommen nicht in der Registervariable an.

Gibt es denn bei IPS 3.4 eine Möglichkeit quasi das was ich jetzt mit Fread in der
While-Schleife mache (verschieden lange empfangene Daten lesen) über IPS
zu machen.

Vielléicht ohne Cutter direkt vom Serial-Port an Registervariable
Wie lese ich dann den COM-Port aus?

Funktioniert nachfolgendes Script aus der Doku wenn ich
Registervariable direkt auf den COM-Port verbinde , sodaß
die Daten aus dem COM-Port solange ausgelesen werden bis
16 Zeichen da sind ?

Das Script muß dann mit der Registervariable verbunden werden oder ?

Oder kommt da ein Cutter dazwischen und wenn ja wie stellt man den ein
damit der Cutter kein Endzeichen erwartet.

Der Befehl um aus einem anderen Script auf den COM-Port zu schreiben um den Versand
der Daten anzufordern ist ja kein Problem mit SPRT_Sendtext

Dann könnte ich mit vertretbarem Aufwand meine Scripte umschreiben.


if ($_IPS['SENDER'] == "RegisterVariable")
{
    // bereits im Puffer der Instanz vorhandene Daten in $data kopieren
    $data  = RegVar_GetBuffer($_IPS['INSTANCE']);
    // neu empfangene Daten an $data anhängen
    $data .= $_IPS['VALUE'];
 
    // wenn $data mindestens 16 Zeichen lang ist
    if (strlen($data) >= 16)
    {
        // $data zwischenspeichern
        $datasets = $data
        // $data leeren
        $data = "";
 
        // ab hier würde ich mein Script zum Aufteilen der Daten reinbauen
        for ($i = 0; $i < count($datasets); $i++)
        {
            // vollständige Datensätze (genau 16 Zeichen lang) ausgeben
            if (strlen($datasets[$i]) == 16)
            {
                echo "empfangener Datensatz: ".$datasets[$i]."
";
            }
            else
            {
                // Unvollständige Datensätze in $data schreiben
                $data = $datasets[$i];
            }
        }
    }
 
    // Inhalt von $data im Puffer der RegisterVariable-Instanz speichern
    RegVar_SetBuffer($_IPS['INSTANCE'], $data);
}

Ja genau so.

In der RegisterVariable muss du das Script konfigurieren. Jup.

Cutter ist optional. Er ersetzt sozusagen dieses Script, wo der Datensatz immer auf 16 Zeichen zusammengefügt wird.
Der Cutter ist für ca 75% der Fälle geeignet. Bei dir scheinbar nicht, da es weder Endzeichen noch feste Länge gibt.
Da ist dann ein eigenes Script, welches nach der Antwort ‚was auch immer‘ in den Daten sucht schon besser.

Würde ich nicht nutzen. Du kannst auch an die RegisterVariable senden, diese leitet es dann an den verbundenen IO (SerialPort bei dir) weiter.
Somit hast du nur eine Instanz welche du im Script ansprichst und den Rest erledigt IPS für dich.
RegVar_SendText — IP-Symcon :: Automatisierungssoftware

Michael
PS: Bitte Scripte in entsprechende PHP-Tags setzen, danke :slight_smile:

Hallo Michael

vielen Dank für deine Ausführungen.

Ich habe inzwischen noch ein paar alte Codeschnipsel gefunden
wo ich das schon mal probiert hatte.
Das mit Regvar_Sendtext kannte ich noch nicht

Werde das gleich mal testen

Sorry das das PHP Script nicht in den Tags war. Hatte das über Teamviewer von meinem Server
kopiert.

Gruß Udo

Vielen Dank für die Anregungen

es läuft jetzt mit Serial-Port und RegisterVariable

Gruß Udo

Na also, dann war meine Frage doch gar nicht so „falsch“ und hat doch etwas gebracht :slight_smile:
> Also nicht immer gleich schimpfen @Nall chan :stuck_out_tongue: :wink:

Grüße,
Chris

Hallo Chris,

ich wollte es aber am liebsten
wieder mit PHP am Laufen haben.

Aber irgendwie kriege ich es nicht hin.