#$K+ RS485DDE - DDE-Schnittstelle für RS485 am COM-Port
RS485 ist ein serieller Zweidraht-Bus, der mit differenziellen Pegeln arbeitet und den Anschluss mehrerer Einheiten gestattet. Das Übertragungsschema sieht nur einen Bus-Master vor; dieser fragt jedes Gerät ab, und das Gerät antwortet umgehend.
Der Aufbau der Datenbytes ist identisch mit denen auf einer asynchronen seriellen Schnittstelle RS232 am PC. Deshalb sind gängige RS232-zu-RS485-Umsetzer sehr einfach gebaut; die notwendige Richtungsumschaltung wird entweder automatisch generiert oder vom PC mit der RTS-Leitung gesteuert.
Durch überlegte Programmierung läuft dieses Programm auch unter Windows NT/2K/XP, und das ohne Administrator-Rechte und Gerätetreiber!
Einführung
ddeinit (Aufbau einer DDE-Konversation)
dderequest (Abfrage von Werten o. ä.)
ddepoke (Setzen von Einstellungen o. ä.)
ddeterm (Beenden der DDE-Konversation)
DDE übers Netzwerk einrichten
Der Zustand von RS485DDE und die laufende Datenübertragung wird mit 4 verschiedenen Symbolen (Icons) kenntlich gemacht:
	Programm ist inaktiv
	(Mindestens) eine DDE-Verbindung ist vorhanden
	Eine Transaktion ist fehlgeschlagen (ungültige Antwort vom RS485-Bus)
	Eine Transaktion ist erfolgreich verlaufen
Die letzten beiden Symbole „blitzen“ für 200 ms kurz auf. Transaktionen, die wegen Formfehler schon vor der RS485-Busbenutzung versagen, führen zu keinem Aufblitzen!

h#s 04/04

#$K+ Einführung
RS485DDE agiert als DDE-Server für bis zu vier RS485-Schnittstellen, die an serielle Schnittstellen angeschlossen sind, ist also gewissermaßen ein „Bustreiber“.
Voraussetzung: Windows 3.1 oder höher.
Unter Windows 9x/Me kann das Programm in den Meldungsbereich der Taskleiste (System-Tray) verschoben werden, entweder über's Menü oder beim Start durch Angabe von „als Symbol“.
Beim RS485-Umsetzer Typ 5401-Z001 können unter Windows NT wegen Taskumschaltungen gelegentlich Übertragungsfehler auftreten.
Die zu übertragenden Zeichenketten sind programmatisch auf 80 Zeichen begrenzt.

Die Übertragung ist sowohl im ASCII- als auch im Binärmodus möglich.
Wegen der Beschränkung der DDE-Übertragung auf CF_TEXT ist die Übertragung von NULL-Zeichen nicht möglich.

Beim Senden im ASCII-Modus wird bei Bedarf eine hexadezimale Prüfsumme generiert und angehängt, ein Wagenrücklauf (0Dh) wird stets angehängt.
Beim Empfang im ASCII-Modus wird stets das erste Zeichen auf Gleichheit mit dem erwarteten getestet, das letzte auf Wagenrücklauf (0Dh) geprüft und bei Bedarf auch eine Prüfsumme abgetestet.

Der Anwender hat selbst dafür Sorge zu tragen, dass auf einem Bus nur ein Protokoll (ASCII, Profibus oder Modbus) benutzt wird!

RS485DDE hat sehr flexible, nicht aufzählbare Themen und Datenelemente (Topics und Items).
Sowohl dderequest als auch ddepoke senden und empfangen Zeichenketten zu/von der RS485-Baugruppe, um die Konversation einfach zu gestalten.
Weiterhin unterstützt RS485DDE ein SYSTEM-Thema.
Welche Vorteile bietet DDE?
–	DDE ist ein seit langem standardisiertes und etabliertes, paketorientiertes Protokoll,
–	ein Übergang von 16 nach 32 bit oder umgekehrt ist absolut problemlos,
–	Netzwerk-Fähigkeit (Datenaustausch über Rechnergrenzen hinweg) ist in Windows eingebaut,
–	zahlreiche Clients, wie MS Office, Matlab, LabView, VEE … sind vorhanden,
–	ein brauchbares Debug-Werkzeug „DDESPY“ ist ebenfalls verfügbar, wenn's mal klemmt.
Gibt es Nachteile mit DDE?
–	DDE ist „etwas angestaubt“, Microsoft empfiehlt OLE2,
–	Datenaustausch mit Unix- und Java-Programmen ist bisher unmöglich, dort gibt es Berkeley-Sockets und TCP/IP (nicht paket- sondern stream-orientiert). Ein Mittler-Programm D2S (läuft auf der Windows-Seite) ist in Arbeit, siehe http://www.tu-chemnitz.de/~heha/messtech/d2s.zip.

#$K+ ddeinit – Aufbau einer DDE-Konversation
Matlab-Syntax:
kanal = ddeinit ('rs485', 'COMx Schnittstellen-Parameter Pausenzeiten')
kanal = ddeinit ('rs485', 'system')
Windows-API in C++ (im Beispiel mit COM2):
#include <ddeml.h>
DWORD Inst;	//globale Variable
HCONV Conv;	//globale Variable
DdeInitialize(&Inst,NULL,APPCMD_CLIENTONLY|CBF_SKIP_ALLNOTIFICATIONS,0);
HSZ sz1=DdeCreateStringHandle(Inst,"rs485",CP_WINANSI);
HSZ sz2=DdeCreateStringHandle(Inst,"COM2 9600,n,8,1",CP_WINANSI);
Conv=DdeConnect(Inst,sz1,sz2,NULL);
DdeFreeStringHandle(Inst,sz2);
DdeFreeStringHandle(Inst,sz1);
allgemein:
Es werden 2 Zeichenketten-Parameter erwartet:
Application oder Service: "rs485"
Topic oder Thema: "COMx Schnittstellen-Parameter Pausenzeiten"
Schnittstellen-Parameter und Pausenzeiten siehe unten.

Konversations-Start, der erste Befehl für die Kommunikation. 'rs485' ist der Service-Name von RS485DDE.EXE. Bei Verwendung von Netzwerk-DDE gelten andere Zeichenketten!
Parameter	Beschreibung
COMx	Nummer der Schnittstelle, x = 1 .. 4
Existiert die Schnittstelle nicht, wird die DDE-Konversation abgelehnt.
Schnittstellen-Parameter	Kommaseparierte Zeichenkette wie beim DOS-Kommando mode, z. B.
9600,n,8,1
bedeutet: 9600 Baud, keine Parität, 8 Datenbits, 1 Stoppbit
Wird dieser Parameter weggelassen, gelten die Einstellungen der Systemsteuerung beim ersten Öffnen, die Einstellungen der offenen DDE-Konversation bei jedem weiteren Öffnen (Mehrfachverwendung des Busses durch mehrere Module und Konversationen).
Jede falsche Angabe der Schnittstellen-Parameter führt zu Datensalat oder zu keiner Kommunikation.
Bei Kollision der Schnittstellen-Parameter mit denen einer bereits offenen DDE-Konversation wird die neue Konversation abgelehnt.
Pausenzeiten	Protokoll-Pausenzeiten T1 und T2 in Millisekunden, max. 255, z. B.
20,20 oder nur 20
Für die ordnungsgemäße Kommunikation sind Mindestpausenzeiten einzuhalten, siehe hierzu das Handbuch zum Gerät:

Zu kleine Werte führen (sporadisch!) zu Zeitüberschreitungsfehlern, zu große verlangsamen die Kommunikation.
Wird dieser Parameter weggelassen, werden 20 ms angesetzt. Diese Einstellung gilt pro Gerät und kollidiert nicht mit einer anderen bereits geöffneten DDE-Konversation

Pausenzeiten und Schnittstellen-Parameter können von rechts nach links weggelassen werden, dann gelten die angegebenen Vorgabe-Belegungen.
Eine syntaktisch falsche Zeichenkette führt zur Ablehnung der DDE-Konversation.

Das Thema „system“ ist in dieser Hilfe nicht dokumentiert. Kurzinformation gibt es dabei mit dem System-Item „help“ per dderequest.
Rückgabewert
Bei Erfolg liefert diese Funktion das Handle der DDE-Konversation, Null bei Fehler.

#$K+ dderequest – Abfrage von Werten o. ä.
Matlab-Syntax:
antwort = ddereq(kanal, 'Sende-String{:|;}Empfangs-Maske{|:|;}', [1 1])
antwort = ddereq(kanal, 'Sende-String*', [1 1])
Windows-API in C++ (im Beispiel Displaydaten vom Sensokom-Modul lesen):
char buf[20];
wsprintf(buf,"#%02X:>;",address);
HSZ sz=DdeCreateStringHandle(Inst,buf,CP_WINANSI);
HDDEDATA data=DdeClientTransaction(NULL,0,Conv,sz,CF_TEXT,XTYP_REQUEST,1000,NULL);
DdeFreeStringHandle(Inst,sz);
if (data) {
 DdeGetData(data,buf,sizeof(buf),0);	//Ergebnis in <buf>
 DdeFreeDataHandle(data);
}
allgemein:
Für die Transaktion wird 1 Zeichenketten-Parameter erwartet:
Item (seltener Feld, Element): "Sende-String{:|;}Empfangs-Maske{|:|;}"
Sende-String und Empfangs-Maske siehe unten.
Zurück kommt der Empfangs-String, der über die Empfangs-Maske gekürzt und ggf. validiert wurde.

1.	Abfragen von Geräteinformationen oder Messwerten im ASCII-Modus mit Filterung (obere Matlab-Zeile)
Die geschweiften Klammern und senkrechten Striche umfassen Alternativen.
Parameter	Beschreibung
kanal	DDE-Konversations-Handle von ddeinit.
Sende-String	Zeichenkette, die zum Gerät gesendet wird, ohne Wagenrücklauf (0Dh)
Sollte mindestens bestehen aus:
• Startzeichen,
• Geräteadresse (2stellige Hexadezimalzahl),
: (Doppelpunkt)	Beendet den Sende-String
; (Semikolon)	Beendet den Sende-String und fügt daran eine Prüfsumme in Form einer zweistelligen Hexadezimalzahl an.
Entweder Doppelpunkt oder Semikolon muss dem Sende-String folgen!
Der Wagenrücklauf wird durch RS485DDE angehängt.
Empfangs-Maske	Ein Zeichen, das das erste erwartete Zeichen der Empfangs-Zeichenkette ist, es wird von der empfangenen Zeichenkette abgeschnitten.
Stimmen diese nicht überein, wird die DDE-Transaktion mit einem Fehler beendet.
: (Doppelpunkt)	Beendet die Empfangs-Maske und ermöglicht es, das Semikolon oder den Stern als Empfangs-Maske anzugeben. Kann weggelassen werden.
; (Semikolon)	Beendet die Empfangs-Maske. Die empfangene Zeichenkette wird mit Prüfsumme (wie oben als zweistellige Hexadezimalzahl) erwartet und getestet. Diese beiden Zeichen werden von der Zeichenkette abgeschnitten.
Stimmt die Prüfsumme nicht, wird die DDE-Transaktion mit einem Fehler beendet.
Ein nachlaufender Wagenrücklauf (0Dh) wird stets im der empfangenen Zeichenkette erwartet und abgeschnitten.

2. Kommunikation im Binär-Modus ohne Filterung (untere Zeile)
Parameter	Beschreibung
kanal	DDE-Konversations-Handle von ddeinit.
Sende-String	Zeichenkette, die zum Gerät gesendet wird. Sie muss sowohl das Start- als auch das Stopp-Zeichen enthalten, das das anzusprechende Gerät erwartet.
Hinweis: In Matlab gelangt man an '\r' u. ä. mittels sprintf().
* (Stern)	Beendet den Sende-String und kennzeichnet die DDE-Transaktion als Binärmodus.
Rückgabewert
Bei Erfolg liefert diese Funktion die empfangene Zeichenkette, unbearbeitet im Binär-Modus, ohne Startzeichen, Prüfsumme und Endezeichen im ASCII-Modus.
Beispiel	Burster/Gernsbach Sensokom-Modul (Adresse 01)
#01:>;	Lesen der Daten von Adresse 01h
%01S:>;	Seriennummer und Dateiname lesen
%01R1E019:>:	Lesen des Parameters „Messart“; die Prüfsumme aus Eingangs- und Ergebnisdaten muss man selbst nachprüfen – oder ignorieren
Beispiel	Gantner Intelligentes Sensor-Modul ISM 112 (Adresse 03)
#03V;>;	Lesen der Geräteidentifikation (26 Zeichen), mit Prüfsumme beim Senden und Empfang
$03S:=	Lesen der Geräteinformation (27 Zeichen), ohne Prüfsumme
$03Z:=	Lesen der Statusinformation (6 Zeichen), ohne Prüfsumme
$03B2:=	Lesen der Kanalinformation des Kanals „2“ (29 Zeichen), ohne Prüfsumme
$03R2:=	Lesen des Kanals „2“ (max. 8 Zeichen), ohne Prüfsumme

#$K+ ddepoke – Setzen von Einstellungen o. ä.
Matlab-Syntax:
ddepoke (kanal,'Sende-String-Kopf{|:|;}','Sende-String-Körper')
Windows-API in C++ (im Beispiel ein Byte „poken“):
char buf[13];
wsprintf(buf,"%%%02XW1%04X%02X;",address,memadr,membyte);
HSZ sz=DdeCreateStringHandle(Inst,buf,CP_WINANSI);
BOOL ok=(BOOL)DdeClientTransaction("",1,Conv,sz,CF_TEXT,XTYP_POKE,1000,NULL);
DdeFreeStringHandle(Inst,sz);
allgemein:
Es wird 1 Zeichenketten-Parameter erwartet:
Item (seltener Feld, Element): "Sende-String-Kopf{:|;}"
Sende-String und Empfangs-Maske siehe unten.
Hineingesteckt wird der „Sende-String-Körper“; siehe unten.

Setzen von Geräteinformationen im ASCII-Modus mit Filterung und Bestätigung durch Empfang einer 1-Byte-Quittung ACK (=06h). Sendet das Gerät andere Quittungsbytes, muss dderequest im Binärmodus verwendet werden.
Die geschweiften Klammern und senkrechten Striche umfassen Alternativen.
Parameter	Beschreibung
kanal	DDE-Konversations-Handle von ddeinit.
Sende-String-Kopf	Erster Teil der Zeichenkette, die zum Gerät gesendet wird, ohne Wagenrücklauf (0Dh)
Sollte mindestens bestehen aus:
• Startzeichen,
• Geräteadresse (2stellige Hexadezimalzahl),
: (Doppelpunkt)	Beendet den Sende-String-Kopf und kann weggelassen werden.
; (Semikolon)	Beendet den Sende-String-Kopf und fügt an die zu sendende Zeichenkette eine Prüfsumme in Form einer zweistelligen Hexadezimalzahl an.
Sende-String-Körper	Zweiter Teil der Zeichenkette, die zum Gerät gesendet wird.
Die Prüfsumme (falls aktiviert) und der Wagenrücklauf (0Dh) wird durch RS485DDE angehängt.
Der Sende-String-Körper darf auch leer sein, wenn die gesamte Information im Sende-String-Kopf steckt.
Rückgabewert
Bei Erfolg liefert diese Funktion TRUE (=1), andernfalls FALSE (=0).
Erfolg ist nur bei Empfang der 1-Byte-Quittung ACK (=06h) gegeben.
Beispiel	Burster/Gernsbach Sensokom-Modul (Adresse 01)
%01O0	Setzen der digitalen Ausgänge zu Null (funktioniert aber nicht!)
%01W1E01901;	Setzen des Parameters „Messart“ auf „Strommessung“
Beispiel	Gantner Intelligentes Sensor-Modul ISM 112 (Adresse 03)
#03W2100;	Setzen des Kanals „2“ auf „100“, mit Prüfsumme
$03D2	Rücksetzen des Kanals „2“, ohne Prüfsumme

#$K+ ddeterm – Beenden der DDE-Konversation
Matlab-Syntax:
ddeterm (kanal)
Windows-API in C++:
DdeDisconnect(Conv);
DdeUninitialize(Inst);
allgemein:
Viele Programme (Word, Excel, LabView, HP VEE usw.) ersparen es dem Benutzer, die DDE-Verbindung explizit schließen zu müssen.

Schließt die DDE-Konversation
Parameter	Beschreibung
kanal	DDE-Konversations-Handle von ddeinit.
Rückgabewert
Bei Erfolg liefert diese Funktion TRUE (=1), andernfalls FALSE (=0).

#$K+ DDE übers Netzwerk einrichten
DDE überwindet mittels Netzwerk-DDE auch Rechnergrenzen.

Die Handhabung ist etwas unterschiedlich bei Windows 3.11 und Windows 9x.

Auf beiden Rechnern muss NETDDE.EXE laufen:

Windows 3.11	Windows 9x	
Systemsteuerung — Netzwerk — Start — Netzwerk-DDE aktivieren	NETDDE.EXE starten (ggf. im Autostart-Menü)	
Server-Seite
Auf dem Server muss eine Freigabe eingerichtet werden. Dazu das Programm DDESHARE.EXE (z. B. O:\winprg\tools\ddeshare.exe) ausführen.

Sie müssen vom DDE-Serverprogramm den Applikations- als auch den Themennamen angeben, also z. B.:

Share Name:	RS485-COM2
Application Name:	RS485
Topic Name:	COM2 9600+n+8+1
Item Name:	(freilassen)

Die Angabe von Kommata ist nicht möglich; deshalb hat RS485DDE eine alternative Angabemöglichkeit mit Plus-Zeichen „+“.
Sie verlieren so leider die Möglichkeit, zu beliebigen Themen (hier: RS485-Bussen) Verbindungen aufbauen zu können — Sie müssen für jeden Bus eine eigene Freigabe machen!
Client-Seite
Anstelle des Applikationsnamens tritt ein Freigabe-Name (Servername, immer mit der Komponente NDDE$), anstelle des Themas der Share-Name, also z. B. in Matlab:

kanal = ddeinit ('\\amarillo\ndde$', 'RS485-COM2')
ddeterm (kanal)

Achtung: <kanal> ist bei vorhandener DDE-Software nie Null, auch wenn keine Verbindung zustandekommt (diese wird erst verzögert aufgebaut), ist also kein Indiz für das Fehlen des Serverprogramms auf dem Server-Rechner!
Testen Sie daher die Verbindung durch Abfrage der Identifikation des RS485-Gerätes oder durch Anfrage von Hilfe aus dem System-Thema (muss extra freigegeben werden).

#$K Burster/Gernsbach
Das Modul „Sensokom 5401“ kommt im Laborversuch in 2 Exemplaren zum Einsatz. Es hat eine zweckmäßige, leider nicht frei host-programmierbare 8stellige LCD-Anzeige.

#$K Gantner
Wird auch als Meilhaus Electronic umetikettiert. Das Modul „ISM112“ besitzt leider keine Ziffernanzeige, dafür aber 4 Messkanäle.