Was sagt denn das Debug des Com-Ports? Geht überhaupt was raus?
Gruß
Feuerfuchs
Hallo,
vielleicht muss noch ein „CR“ dahinter. Wenn du im Hyperterminal die Q500 eintippst dann schickst du das ja auch mit
„Enter“ weg. Habe jetzt auf die schnelle den Tastaturcode für „CR“ nicht im Kopf.
Wenn gar nichts zurück kommt, dann kann es ja sein das die Steuerung noch was erwartet.
Sind die Einstellungen für den COM-Port BAUDRATE , Parity, Stopbit etc. gleich wie bei Hyperterminal ?
Eventuell mal im Gerätemanager unter dem COM-Port so voreinstellen wie es bei Hyperterminal funktioniert hat.
Ansonsten gibt es ein Programm „Free seriell Port Monitor“ mit dem man die Verbindung mitsniffen kann.
Da kann man dann sehen ob Hyperterminal und IPS die gleichen Befehle senden.
So habe ich mir bei den ersten Versuchen geholfen.
Gruß Udo
COM Einstellungen sind die selben, auch im Gerätemanager.
Free serial port monitor war ein guter Tipp! Danke dafür!
HyperTerminal sendet:
71 35 30 30 0D q500.
IPS.exe sendet:
51 35 30 30 q500
Nun sehe ich, dass HyperTerminal ja noch einen Punkt, bzw. 0D mitsendet!
Nun hab ich im IPS-Skript an das q500 noch einen Punkt gehängt, jedoch ist der hex(?)-code unterschiedlich:
71 35 30 30 2E q500.
IPS sendet für den Punkt 2E, anstatt wie Hyperterminal 0D.
51 = „Q“
71 = „q“
0D = CR
wie ich vermutet habe fehlt anscheinend der CR
Versuche mal im IPS hinter dem Q500 ein „^M“ zu senden. Das sollte der CR sein soweit ich mich erinnere
71 35 30 30 5E 4D q500^M
Dann versuch mal aus dem Beispiel von Jannis
regvar_sendtext(12345,„q500“.chr(0x13));
Das funktioniert leider nicht:
71 35 30 30 13 q500.
Ich war aber erfolgreich hiermit:
<?
$str = "\x71\x35\x30\x30\x0D";
RegVar_SendText(50541 /*[Maschinen u. PCs\Haas TM3P\Register Variable]*/, $str);
?>
Nun kommt der korrekte Wert zurück.
Jedoch wird dieser leider noch nicht richtig geschrieben.
Ich habe in der Variablen nun anstatt
...PROGRAM,MDI,IDLE,PARTS,12112...>
nur
ARTS,12112>
In der Register Variablen ist dieses Skript hinterlegt, das den Wert speichert:
<?
Setvalue(13605,$IPS_VALUE);
?>
Variable hat den Typ String.
so geht es auch mit dem Befehl senden. Dann halt komplett als Code geschickt.
Es sollte aber auch zusammengesetzt gehen.
Das dein Rückwert unvollständig ist, ist das Problem mit dem Buffer.
da brauchst du das Stück aus dem Beispiel was ich gestern beschrieben habe.
Der String kommt nicht in einem Stück an, sondern Häppchenweise.
Du musst den also solange mit einer IF-Schleife zusammenbauen
bis der „CR“ von der Maschine kommt.
Dann erst kannst du den in die Variable schreiben.
Gruß Udo
Na sieht doch schon mal gut aus das was ankommt.
Schau dir mal den Debug der Registervariable an da kannst du dann wahrscheinlich sehen das er nach dem Transmitted mehrer Zeilen mit Received hat. Und die arbeitet IPS nacheinander ab. Und überschreibt somit jedesmal die Variable mit dem nächsten Received (Mach einfach mal einen Doppelklick auf den Wert der Variable im Objektbaum und dann kannst du beobachten was alles nacheinander in die Variable geschrieben wird wenn du wieder was sendest)
Wenn das der Fall ist und nicht woanders noch ein Problem ist kann man das mit einem Zwischenspeichern der Empfangen Daten machen und erst in der Variablen abspeichern wenn das Endzeichn in deinem Fall glaube ich > CR kommt.
Ich such mal ein Script raus und poste es später noch
Gruß Jannis
edit: Diesesmal war Udo schneller
Hier wäre auf die schnelle ein Script was hoffentlich passt.
<?
$regid=12345; //Id der Registervariable
if ($_IPS['SENDER'] == "RegisterVariable")
{
$data = RegVar_GetBuffer($regid); //Alten wert einlesen
$data .= $_IPS['VALUE']; // neu empfangene Daten an $data anhängen
if (strpos($data, '>')) // wenn das Trennzeichen > in $data gefunden worden ist
{
$Setvalue(67890,$data); //den kompletten empfangenen Wert abspeichern
//Wenn du jetzt auch noch die verschiedenen Werte bestimmten Variablen zuordnen willst
// $data in durch , separierte Datensätze zerlegen
$datasets = explode(',', $data);
// alle Datensätze ausgeben zum überprüfen
for ($i = 0; $i < count($datasets); $i++)
{
echo "empfangener Datensatznr ".$i.": ".$datasets[$i]."
";
}
//Ich denke das Datensatz nr 1 die Programm Nummer bzw. der Betriebsmodus ist, nr 2 der Status der Maschine ist
Setvalue(11223,$datasets[1]); //11223 wäre dann die Programmnumervariable der Maschine
Setvalue(22334,$datasets[2]); //22334 wäre dann der Aktuelle Status der Maschine usw.....
// $data löschen da ja alles empfangen wurde
$data = "";
}
// Inhalt von $data im Puffer der RegisterVariable-Instanz speichern
RegVar_SetBuffer($regid, $data);
}
?>
Mit den verschieden Datasets musst du natürlich noch ausprobieren welcher für was ist.
Gruß Jannis
Guten Morgen zusammen und danke Jannis! Super toll mit den Erklärungen zu jeder Zeile!
Habe das mal reingefummelt, leider sagt mir IPS immer „Dieses Skript wurde als fehlerhaft markiert. Bitte beheben Sie alle Fehler“.
Jedoch nur wenn ich die Abfrage durchlaufen lasse. Wenn ich das Skript einzeln starte, kommt kein Fehler
Es reicht mir, wenn der komplette Wert, der von der Maschine kommt, abgespeichert wird, daher habe ich ein wenig aus dem Skript entfernt:
<?
$regid=50541; //Id der Registervariable
if ($_IPS['SENDER'] == "RegisterVariable")
{
$data = RegVar_GetBuffer($regid); //Alten wert einlesen
$data .= $_IPS['VALUE']; // neu empfangene Daten an $data anhängen
if (strpos($data, '>')) // wenn das Trennzeichen > in $data gefunden worden ist
{
$Setvalue(13605,$data); //den kompletten empfangenen Wert abspeichern
// $data löschen da ja alles empfangen wurde
$data = "";
}
// Inhalt von $data im Puffer der RegisterVariable-Instanz speichern
RegVar_SetBuffer($regid, $data);
}
?>
Die Variable 13605, in der die Daten abgespeichert werden sollen, bleibt leer.
Free Serial Port Monitor zeigt mir, dass die Maschine etwas sendet.
Morgen
Wenn du das Script von Hand ausführst macht er ja auch nicht die IF anweisung, da er die ja nur macht wenn die Registervariable das Script aufruft.
Was hast du denn für eine IPS Version?
Eventuell liegts am $_IPS[ (ist für neuere Versionen) weil der Rest sollte eigentlich funktionieren und auch das was in dein Debug Fenster anzeigt sieht doch gut aus.
Probiers mal mit dem hier
if ($IPS_SENDER == "RegisterVariable") //<---------- Ändern
{
$data = RegVar_GetBuffer($regid); //Alten wert einlesen
$data .= $IPS_VALUE; // neu empfangene Daten an $data anhängen <-------- Ändern
if (strpos($data, '>')) // wenn das Trennzeichen > in $data gefunden worden ist
{
$Setvalue(13605,$data); //den kompletten empfangenen Wert abspeichern
// $data löschen da ja alles empfangen wurde
$data = "";
}
// Inhalt von $data im Puffer der RegisterVariable-Instanz speichern
RegVar_SetBuffer($regid, $data);
}
Mit $IPS_VALUE hats ja schonmal geklappt.
Gruß Jannis
Ich habe Version 2.7
Hab erst vor 2 Tagen ein Live update gemacht.
Mit deinem Skript kommt kein Fehler mehr, jedoch bleibt die Variable auch leer.
Com Port sendet und empfängt jedoch erfolgreich.
Okay dann machen wir mal einen print Befehl um dem Fehler auf die Spur zu kommen rein.
<?
$regid=50541; //Id der Registervariable
print "Sender: ".$IPS_SENDER." IPS_VALUE:".$IPS_VALUE." RegisterBuffer:".RegVar_GetBuffer($regid)."/r/N";
if ($IPS_SENDER == "RegisterVariable") //<---------- Ändern
{
$data = RegVar_GetBuffer($regid); //Alten wert einlesen
$data .= $IPS_VALUE; // neu empfangene Daten an $data anhängen <-------- Ändern
if (strpos($data, '>')) // wenn das Trennzeichen > in $data gefunden worden ist
{
$Setvalue(13605,$data); //den kompletten empfangenen Wert abspeichern
// $data löschen da ja alles empfangen wurde
$data = "";
}
// Inhalt von $data im Puffer der RegisterVariable-Instanz speichern
RegVar_SetBuffer($regid, $data);
}
?>
Und dann schau mal was er im Meldungsfenster anzeigt.
Ich könnte mir vorstellen,
daß das Zeichen „>“ nicht richtig interpretiert wird.
Wo ich meine Heizungssteuerung programmiert habe, kam auch immer das gleiche Zeichen
im Debug als letztes, hatte aber im Hex immer einen anderen Wert.
Daher wäre eine Idee, mal im Debugfenster unter Hex nachschauen welchen Hexcode das letzte Zeichen hat.
gruß Udo
Notice: Undefined variable: IPS_VALUE on line 4
Sender: Execute IPS_VALUE: RegisterBuffer:
PROGRAM,O99999,IDLE,P
PROGRAM,O99999
PROGRAM,O99999,IDLE,PARTS,12112
PROGRAM,O99999,IDLE,PARTS,12
PROGRAM,O99999,IDLE,
PROGRAM,O99999,IDLE,/r/N