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.
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);
}
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