Hallo
wollte eigentlich nur „schnell“ nen Screenshot von meinem edip haben um ne Frage verständlicher zu formulieren, aber da ich zu faul war das edip abzufotografieren dachte ich mir machs doch schnell mal mit IPS.
Naja schnell wars nich aber immerhin funktionierts jetzt ganz gut.
Der Befehl den man ans edip senden muss ist
COMPort_SendText(46080 /*[Serial Port]*/,chr(27)."UH".chr(10).chr(15).chr(50).chr(55)); //daten an edip übertragen
wobei 10,15 die erste Ecke ist und 50,55 die zweite Ecke(immer x,y) ist.
Soweit so klar.
Das edip antwortet dann mit ESC UL 40,40 und dann die BHL daten.
Das Auslesen übernimmt dieses Skript für die Registervariable, wobei Ihr natürlich nur die Caseanweisung für U(85) braucht und sie bei eurem Programm einfügen müsst.
$id_Register = 15719 /*[edip\Register Variable]*/;
$buf = RegVar_GetBuffer($id_Register); //Puffer einlesen
if ($IPS_SENDER == "RegisterVariable")
$buf .= $IPS_VALUE; // neuen Wert hinzufügen
$id = ord(substr($buf,0,1)); //ersten wert auslesen
print $id." ";
if ($id == "27") //27 = ESC
{
switch (ord(substr($buf,1,1)))
{
case "85":
$breite = ord(substr($buf,5,1)); //breite der blh datei
$hoch =ord(substr($buf,6,1)); //höhe
$max = intval(($breite+7)/8)*$hoch; //Anzahl der Bytes (formel ausm edip handbuch)
if ((strlen($buf))>($max+5)) //Schauen ob alles empfangen wurde
{
$buf= substr($buf,5,($max+2)); //ESC UL und startwerte abziehen
$Pfad = "c:/test1.blh"; //Dateiname
unlink($Pfad); //alte datei löschen
$Attribut = "ab";
$open = fopen($Pfad,$Attribut); //Öffnen
fwrite($open,$buf); //schreiben
fclose($open); //schließen
RegVar_SetBuffer($id_Register,""); // Puffer löschen
IPS_SetScriptTimer($IPS_SELF,0);
}
else
{
RegVar_SetBuffer($id_Register,$buf); // Puffer setzten
}
break;
case "65": //A befehle auslesen
if ((strlen($buf))>3) //Schauen ob alles empfangen wurde
{
$id = ord(substr($buf,3,1)); // 4 zahl ist die NR.
print "erfolgreich ".$id;
setvalue(35128 /*[edip\Taste]*/,$id);
if ((strlen($buf))>4)
{
RegVar_SetBuffer($id_Register,substr($buf,4,10));
IPS_SetScriptTimer($IPS_SELF,2);
}
else
{
RegVar_SetBuffer($id_Register,""); // Puffer löschen
IPS_SetScriptTimer($IPS_SELF,0);
}
}
else
{
RegVar_SetBuffer($id_Register,$buf); // Puffer setzten
IPS_SetScriptTimer($IPS_SELF,2);
print "nochnicht1";
}
break;
case "66": //Bargrafen auslesen
if ((strlen($buf))>4) //Schauen ob alles empfangen wurde
{
$id = ord(substr($buf,3,1)); // 4 zahl ist die NR.
$wert = ord(substr($buf,4,1));
print "erfolgreich ".$id." Wert: ".$wert;
setvalue(19564 /*[edip\Schieber]*/,$id);
setvalue(51784 /*[edip\Wert]*/,$wert);
if ((strlen($buf))>5)
{ RegVar_SetBuffer($id_Register,substr($buf,5,20));
IPS_SetScriptTimer($IPS_SELF,2);
}
else
RegVar_SetBuffer($id_Register,""); // Puffer löschen
}
else
{
RegVar_SetBuffer($id_Register,$buf); // Puffer setzten
IPS_SetScriptTimer($IPS_SELF,2);
print "nochnicht2";
}
break;
default:
if ((strlen($buf))==1)
{RegVar_SetBuffer($id_Register,$buf); // Puffer setzten
print "nur 1 empfangen";
}
else
{
RegVar_SetBuffer($id_Register,""); // Puffer rücksetzten
IPS_SetScriptTimer($IPS_SELF,0);
print "Fehler";
}
}
}
else // Sonstige Taste gesendet
{ if ((strlen($buf))>1)
{
RegVar_SetBuffer($id_Register,""); // Puffer löschen
IPS_SetScriptTimer($IPS_SELF,0);
print "Overflow";
}
setvalue(38542 /*[edip\Befehl]*/,$id);
IPS_SetScriptTimer($IPS_SELF,0);
}
Manchmal klappts nicht auf Anhieb , denn wenn nur ein byte fehlt/zuviel ist öffnet der Bitmapeditor vom edip die Datei nicht mehr. Deswegen auch der
substr($buf,5,($max+2));
$max anzahl der Bytes plus je ein byte für Breite und Höhe.
Dann einfach nochmal probieren oder IPS die anzahl der bytes überprüfen lassen und wenn da was nicht passt dann nochmal senden.
Was ich noch nicht ausprobiert hab wie ich die BLH datei automatisch in bmp umwandle, aber den arbeitsschritt kann man ja noch von Hand machen. (oder hat jemand n Tip dazu?)
Vielleicht kanns ja jemand gebrauchen z.B. um den Zeichenbereich auszulesen und abzuspeichern.
Gruß Jannis