eDIP Display Routine

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; //&lt;DC1&gt;=chr(17) und die Länge voranstellen
		$s1 = 0;
		for($i = 0; $i &lt; 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);
	}
?&gt;

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 :frowning: 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 :wink:
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 :wink:

Genial!!!

Du bist der Held - genau das hat beim EDIP noch gefehlt, um perfekt zu sein.

Vielen Dank dafür!

Hallo Sven,

wertest Du auch irgendwo ACK und NAK aus. Ansonsten hat es ja nicht viel Sinn.

Ack und NACK werden wie man als Fachmann sicherlich aus dem Quelltext ersehen kann nicht ausgewertet.
Um Ehrlich zu sein bin ich noch nicht soweit, dass ich die Daten aus dem Display empfange. Das ist erst der 2. Schritt. Diese Funktion bildet hierfür aber das Fundament. Der geübte PHP Programmierer wird aber sicherlich selbst Ack und Nack auswerten können. Später möchte ich das sicherlich in die Funktion integrieren. Das wird denn dann Version 2 :wink:

Weiterhin wird NICHT geprüft, ob mehr als 64 Zeichen gesendet werden.

Auch wird NICHT geprüft, ob die Serielle Schnittstelle vorhanden und auch
Empfangsbereit ist.

Und es lassen sich keine Blider in Blöcken damit senden, da ein chr(13) an die Zeichenfolge drangehängt wird.

Nun hatte ich auch nicht den Anspruch gestellt diese Funktion für alle zu schreiben, sondern für mich… und wenn es jemand gebrauchen kann freue ich mich :stuck_out_tongue:

LG aus Handewitt

Nun kommt eben Phase 2… Daten vom Display empfangen :wink: Mal sehen wie das so klappt… Macht ja irgenwie schon sinn, wenn man das Dingens Interaktiv nutzen kann.

Rainer,

sei mir bitte nicht böse, aber mit solchen Bemerkungen -auch wenn sie sachlich sind- raubst Du jedem Newbie die Illusion, einen Schritt weiterzukommen.

Ich finde es gut, dass hier Lösungsansätze gepostet werden, auch wenn diese (noch) nicht perfekt sind. Jeder fängt mal klein an, und da sind genau solche Postings wie der des Threaderstellers immens hilfreich. Und vielleicht Anreiz für die PHP-Freaks hier, um diese dann perfekt zu machen :slight_smile:

Wenn im Forum nur noch das Posten perfekt funktionierender PHP-Scripts erlaubt ist, wird die Hürde für einen PHP-Einsteiger nur noch größer - der sucht nämlich einfach gestrickte Beispiele, die er nachvollziehen kann und mit denen er PHP erlernen kann.

Sorry für OT!

:confused: @ dreamy, schlecht geschlafen!

Das war eine ganz normale Frage. Sven hat es ja in seiner Antwort geschrieben das es der nächste Schritt ist.

Denk was du willst. Koppschüttel.

Hi,

ich hatte heute Nachmittag auch schon darüber gegrübelt, was diese Funktion für einen Sinn haben soll, da fehlende Pakete doch eh nicht erkannt und erneuert gesendet werden?

Deshalb ist die Frage von Rainer hier sicherlich berechtigt.
Im Moment sehe ich mit dieser Funktion nur Nachteile im Betrieb bzw. wird doch nur die Prüfsumme berechnet aber nicht ausgewertet.
Wenn das mit der Funktion 2.0 dann mal umgesetzt ist, läßt sich das sicherlich gut implementieren.
Also mach’ mal weiter damit.

Grüße,
Doc

Hallo Sven, wo muß man deinen ersten Code genau hinterlegen um ihn aufrufen bzw. einbinden zu können?

Hallo,
das Script liegt bei mir im \ipsymcon\scripts
Ich habe es als eigenständiges Script direkt im IPS angelegt.

//Sven