Hallo Liebe Fangemeinde,
heute möchte ich schon mal eines meiner Ergebnisse an die Gemeinde zurück geben.
Kurz zur Entstehung: Es hatte mich gestört, dass ich das Protokoll auf dem Display deaktivieren muss. Wobei Herstellerseitig ja nicht dazu geraten wird. Bei meinen ersten Gehversuchen mit dem Display stellte ich weiterhin fest, dass bei der Übertragung wohl Zeilen verschluckt werden. Also habe ich mich seit gestern Abend an die Arbeit gemacht und diese kleine Funktion Entwickelt. Genau genommen ist es ja „nur“ aus kleinen Schnipseln (ich kann kein PHP bzw. lerne es erst seit IPS) zusammenkopiert. So ist die Umlaute- und Sonderzeichenumsetzung hier aus dem Forum…
Nun braucht man sich also weder um die Umlaute und Sonderzeichen, noch um die Prüfsummen etc. kümmern.
Ggf. muss das Timing angepasst werden. Bei mir geht es mit 4 hundertstel fehlerfrei. Allerdings hängt das Display derzeit noch an einem USB<->Netzwerk host. Ich Vermute dass wenn die Latenz vom LAN wegfällt, die Wartezeit vergrößert werden muss.
Über Feedbeck freue ich mich natürlich.
Hier die Funktion:
<?
function edip_send($f_cport, $string)
/////////////////////////////////////////////////////////////////////////
//
// Version: 1.0
// Datum: 31.01.2010
// Autor: Sven Kurzhals sven@kurzhals.com
//
// Beschreibung: Funktion um IPSYMCON die Kommunikation mit den eDIP Displays
// zu erleichtern insbesondere den Rahmen und die Prüfsumme
// für das Smallprotokoll zu bilden
//
// Aufruf: edip_send(ID des eDIP Ports, Text);
//
/////////////////////////////////////////////////////////////////////////
{
$wartezeit=5;
//*********************************************************************
// Sonderzeichen wandeln
//*********************************************************************
$string = str_replace("Ä","Ä",$string);
$string = str_replace("ä","ä",$string);
$string = str_replace("Ö","Ö",$string);
$string = str_replace("ö","ö",$string);
$string = str_replace("%F6","ö",$string);
$string = str_replace("%FC","ü",$string);
$string = str_replace("Ãœ","Ü",$string);
$string = str_replace("ü","ü",$string);
$string = str_replace("ß","ß",$string);
$string = str_replace("Ä", "\x8E", $string);
$string = str_replace("ä", "\x84", $string);
$string = str_replace("Ö", "\x99", $string);
$string = str_replace("ö", "\x94", $string);
$string = str_replace("ü", "\x81", $string);
$string = str_replace("Ü", "\x9A", $string);
$string = str_replace("ß", "\xE1", $string);
$string = str_replace(",", "\xFB", $string); // Komma in Sonderzeichen
//mehrfache Leerzeichen raus
$string = str_replace(" ", " ", $string);
$string = str_replace(" ", " ", $string);
$string = str_replace(" ", " ", $string);
$string = str_replace(" ", " ", $string);
//*********************************************************************
// Prüfsumme und andere Tags für das Smallprotokoll Bilden
//*********************************************************************
$string = $string.chr(13); //`nen Abschlusszeichen ans Ende zufügen
$string = chr(17).chr(strlen($string)).$string; //<DC1>=chr(17) und die Länge voranstellen
$s1 = 0;
for($i = 0; $i < strlen($string); $i++)
{
$s1 = $s1 + ord(substr($string, $i, 1)); // Prüfsumme Bilden... hierzu alle Byte Saldieren
}
$string .= chr($s1 % 256); // Modulo 256 der Summe aller Byte an den String hängen
//*********************************************************************
// und wech damit über z.b. die Serielle
//*********************************************************************
COMPort_SendText($f_cport,$string);
ips_sleep($wartezeit);
}
?>
Und so sieht ein Teil des Aufrufes bei mir aus:
<?
include=edipsend.php;
$Pos1=0; $Pos2=65; $Pos3=95;
$Pos4=135; $Pos5=180; $Pos6=210;
$cport=47948 /*[eDIP]*/;
edip_send($cport,"#DL#TA#ZF4#ZW0"); // Bildschirm löschen
//#TA = Terminal ausschalten #ZF4 = Font einstellen
//#ZW0 = 90grad ausgabe #YH50 = Helligkeit
//****************************************************************
edip_send($cport,"#GD0,14,240,14"); // Linie Zeichnen
//****************************************************************
$Zeile=15;
edip_send($cport,"#ZL".$Pos1.",".$Zeile." Sensor");
edip_send($cport,"#ZL".$Pos2.",".$Zeile." Ist");
edip_send($cport,"#ZL".$Pos3.",".$Zeile." Soll");
edip_send($cport,"#ZL".$Pos4.",".$Zeile." Steller");
edip_send($cport,"#ZL".$Pos5.",".$Zeile." RF");
edip_send($cport,"#ZL".$Pos6.",".$Zeile." Adj.");
//****************************************************************
edip_send($cport,"#GD0,24,240,24"); //Linie Zeichnen
//****************************************************************
...
etc.
...
?>
[EDIT 07.02.2010]
Nachtrag:
Nach Intensivem auseinandersetzen mit dem Display habe ich nun festgestellt, dass wenn das Protokoll eingeschaltet ist (J2 offen), das Display außer die und von sich aus gar nichts mehr sendet Es mus also aktiv abgefragt werden ob was im Puffer zur abholung liegt. Mit ´nem Portanalysator habe ich nun mal geguckt wie die von EA das in ihrer Terminal-SW machen… dort ist es so, dass die alle 1 sekunde die abfrage sequenz senden und dann einfach horchen ob was kommt. Dies halte ich für nicht Praktikabel. Ich habe mal versucht alle 1 sekunde die abholsequenz ( 1 I bcc) zu senden. Hm joa… grundsätzlich geht das so… aaaaber IPS saust dann bei mir auf so ca. 90% CPU last. Alo bleibt eigentlich nur PIN 20 des Displays (Data in Sendbuffer) zu verwenden könnte man z.b. auf "RI"oder DSR o.ä. legen und im IPS auswerten. Also ist dies Projekt mangels Zeit zunächst mal auf Eis gelegt… aber nicht gestorben
Eine Sache ist mir noch aufgefallen, die mir von anfang an nicht ganz klar war und vielleicht gerade neu-einsteigern hilft: Wenn man die zu sende Zeichenkette an das Display mit einem = chr(27) beginnt muss man die Zahlenwerte z.b. Koordinatenangaben als byte senden. Verwendet man jedoch das # als ersatz für das , dann kann man die Koordinaten ganz gemütlich als String senden. Dieser Umstand geht wohl so nicht klar aus dem Manual hervor… oder ich hab´s überlesen. Kurzes Beispiel:
edip_send($cport,chr(27)."GD".chr(0).chr(14).chr(240).chr(14)); // Linie Zeichnen
edip_send($cport,"#GD 0,14,240,14"); // Linie Zeichnen
beide Zeilen bewirken das gleiche