#$K+ ddegpib - Universelle DDE-Schnittstelle für GPIB
Neu: Beim Starten „als Symbol“ wird das Programm sofort im Meldungsbereich der Taskleiste (System-Tray) verankert; ansonsten startet das Programm „wie gehabt“ als normales Symbol. Gilt nicht für Windows 3.x.
Einführung
Liste der Unterfunktionen
DDE übers Netzwerk einrichten
Anwendungsbeispiel
Siehe auch:
N:\HENNI\GPIB\TPWGPIB\GPIB.HLP
Detaillierte Beschreibung aller GPIB-Funktionen
(befindet sich im Programm-Manager unter "CD-Infos")

h#s 12/00

#$K+ Einführung
Die DDE-Schnittstelle hat gegenüber der vorhergehenden Lösung mittels mexgpib.dll den Vorteil, dass Bitbreiten-Schranken problemlos (von Windows) überwunden werden (Nutzbarkeit sowohl von Matlab 4.2 als auch 5.x), sowie die Verwendbarkeit außerhalb von Matlab.
Das Programm DDEGPIB.EXE läuft nur als Icon bzw. in der Taskleiste und zeigt in der Textzeile die Anzahl der DDE-Verbindungen an.
Es unterstützt auf der DDE-Seite Übertragung im Text- und im Excel-Tabellen-Format (CF_XLTABLE), und auf der GPIB-Seite das Text- sowie verschiedene Festkomma-Binärformate, und konvertiert alle vier Kombinationen.

Die Datenmenge pro Transaktion kann und darf in jeder Kombination 64 KB überschreiten,
sofern die darunterliegende GPIB.DLL (standardmäßig von National Instruments) das verkraftet.

Weiterhin unterstützt DDEGPIB ein SYSTEM-Thema.

#$K+ Liste der Unterfunktionen
Alphabetische Liste ehemaliger MEXGPIB-Funktionen
help
ibask
ibclr
ibcnt
ibconfig
iberr
ibfind
ibloc
ibrd, ibrdXX
ibrsp
ibsta
ibwait
ibwrt, ibwrtXX
query
version

#$K+ help
ddeexec (kanal, 'help');

Startet diese Windows-Hilfe. Die Hilfe muß manuell geschlossen werden, d.h., sie wird nicht bei clear mex oder beim Beenden von Matlab geschlossen.

#$K+ ibask
sekunden = ddereq(kanal, 'config TMO')
eot_flag = ddereq(kanal, 'config EOT')

Gerätekonfiguration abfragen: hier nur zwei Werte!

Bei 'config TMO' wird die Zeit in Sekunden umgerechnet und zurückgegeben.

'config EOT' liefert zurück, ob nach ibwrt die End-Of-Transmission-Leitung aktiviert wird (Standard) oder nicht. Mit ausgeschaltetem EOT lassen sich bspw. lange Befehle und Übertragungen aufteilen.

Siehe auch:
ibsta-Konstanten
ibask()

#$K+ ibclr
ddeexec (kanal,'ibclr')

Gerät rücksetzen (z.B. nach missglücktem Befehl).
Siehe auch:
ibclr()

#$K+ ibcnt
ret_val = ddereq (kanal,'ibcnt')

Abfrage der Zeichenzahl der letzten GPIB-Übertragung (selten benutzt, da sie bei ibrd zur Festlegung der Arraygröße bereits benutzt wird).

#$K+ ibconfig
ddepoke (kanal,'config TMO', sekunden)
ddepoke (kanal,'config EOT', eot_flag)

Gerät konfigurieren: hier nur zwei Werte!

Bei 'config TMO' wird die Zeit in Sekunden angegeben und in den internen Code umgerechnet.
'config EOT' setzt das interne End-Of-Transmission-Flag (0 oder 1), welches bei ibwrt entscheidet, ob die End-Of-Transmission-Leitung beim letzten Byte aktiviert wird oder nicht.

ibconfig()

#$K+ iberr
ret_cal = ddereq (kanal,'iberr')

Abfrage des Fehlercodes der letzten GPIB-Übertragung. Der Fehlercode ist nur gültig, wenn auch das ERR-Bit in ibsta gesetzt ist.
Siehe auch:
Fehlercodes
ibsta

#$K+ ibfind
kanal = ddeinit ('gpib', 'gerätename')
kanal = ddeinit ('gpib', 'brd pad sad tmo eot eos')
ddeterm (kanal)

Konversations-Start, der erste Befehl für die Kommunikation.
Die Kommunikationsparameter (Geräteadresse, EOS-Byte, Timeout usw.) werden der Datei GPIB.INI im Windows-Verzeichnis entnommen.

Die alternative Form kommt ohne GPIB.INI aus und ist vorzuziehen, weil künftige (32-bit) Versionen leider ohne GPIB.INI arbeiten!
brd = 0 (Board-Nummer, pro Rechner steckt meistens nur eins)
pad = Geräteadresse
Ab hier können die Parameter weggelassen werden:
sad = 0 (Sekundär-Adresse)
tmo = 3 (Sekunden TimeOut)
eot = 1 (End-Of-Transmission-Flag)
eos = 10 (Zeichen für End-Of-Transmission bei Empfang?)

ddeterm ist obligatorisch und ruft intern ibonl(0) auf.
(Daher zur Zeit keine Funktion bei GPIB.DLL-Nachbauten, wie für HPIB-Karte oder Hameg HO-80-Karte!!)
Siehe auch:
ibfind()

#$K+ ibloc
ddeexec (kanal,'ibloc')

Gerät auf Lokalbedienung rückschalten
Siehe auch:
ibloc()

#$K+ ibrd, ibrdXX
ret_text = ddereq (kanal,'data',[1 1])
ret_vektor = ddereq (kanal,'{[u]|i}{8|16|32}{[i]|m}')

Text bzw. Binärdaten lesen

Binärdaten (wie sie vom angeschlossenen Gerät kommen) müssen folgendes Format aufweisen:

<Text>	(beliebiger Header-Text ohne #, kann auch leer sein)
#	(literales Doppelkreuz)
m	(1 ASCII-Ziffer: Anzahl der folgenden ASCII-Ziffern)
n	(m ASCII-Ziffern: Anzahl der folgenden binären 8-bit-Bytes)
<Rest>	(Binärdaten z.B. wie folgt angegeben, Groß/Kleinschreibung egal):
8	8-bit-Bytes, vorzeichenlos
i8	8-bit-Bytes, vorzeichenbehaftet
i16	16-bit-Integer, vorzeichenbehaftet, Intel-Notation (least significant byte zuerst [LSB first])
i16m	16-bit-Integer, vorzeichenbehaftet, Motorola-Notation (most significant byte zuerst [MSB first])
Nochmal in Baccus-Naur-Form:

Dieses Format trifft auf den Yokogawa-Oszi, den HP546xx und den R&S-Waveform-Generator zu und ermöglicht sehr hohe Datenübertragungsraten.
Siehe auch:
ibrd()

#$K+ ibrsp
ret_val = ddereq (kanal,'ibrsp')

Response-Byte abholen

Siehe auch:
ibrsp()

#$K+ ibsta
ret_val = ddereq (kanal,'ibsta')

ibsta-Variable lesen

Siehe auch:
ibsta-Status-Bits in GPIB.HLP

#$K+ ibwait
ddeexec (kanal,'ibwait [maske]')

Warten auf externes Ereignis, i.d.R. Bedienungsanforderung (RQS). Liegt bereits das Ereignis vor, kehrt die Funktion sofort zurück.

[maske] wird z.Z. nicht unterstützt, liegt fest auf COMPLETION.

Siehe auch:
ibsta-Status-Bits in GPIB.HLP
ibwait()

#$K+ ibwrt, ibwrtXX
ddepoke (kanal, 'data', 'text')
ddepoke (kanal, '{[u]|i}{8|16|32}{[i]|m}',vektor)

Text (i.d.R. Kommandos) bzw. Binärdaten schreiben

Binärdaten werden ohne Header gesendet. Erwartet das Gerät einen Header, muß dieser vorher (als Text) gesendet werden. Dazu muß häufig die automatische EOT-Kennung mittels ibconfig vorübergehend abgeschaltet werden.

Die Binärdaten werden gewandelt siehe ibrd, ibrdXX
Siehe auch:
ibwrt()

#$K+ query
ret_text = ibquery (kanal, 'text')

Kurzform aus ibwrt mit nachfolgendem ibrd zur Abfrage von Geräte-Parametern. Ist ein kleines .M-Skript.
Siehe auch:
Beispiele

#$K+ version
ret_text = ddereq (kanal,'version')

Versionsabfrage von mexgpib.

#$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. N:\henni\ndde\ddeshare.exe) ausführen.

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

Share Name:	Yokogawa
Application Name:	GPIB
Topic Name:	DL1540
Item Name:	(freilassen)

Sie verlieren so leider die Möglichkeit, zu beliebigen Themen (hier: Geräten) Verbindungen aufbauen zu können — Sie müssen für jedes Gerät 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$', 'Yokogawa')
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 GPIB-Gerätes oder durch Anfrage von Hilfe aus dem System-Thema.

#$K+ Anwendungsbeispiele
Beispiel (hypothetisches Oszilloskop):

k=ddeinit('gpib','oszi');           % Kanalhandle für 'oszi' ergattern
ddepoke(k,'data',sprintf('timebase %f',zeitbasis));
peak_text=ibquery(k,'peak?');
ddeterm(k)