Überwachung von Fräsmaschinen/Bearbeitungszentren

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. :confused:

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

:confused:

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 :smiley:

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 :confused:

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.

So sieht der Debug vom Serial Port aus:

Und hier der Debug von der Register Variable:

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

@Jannis:


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