#$K+{bml sms10.bmp} Schrittmotorsteuerung - DDE-Server
Das Programm MOTORST dient zur Ansteuerung eines isel-Schrittmotors unter Zuhilfenahme der Mikrostep-Steuerkarte und des virtuellen Gerätetreibers MPK3D.386. Der Originaltreiber MPK3DRV.EXE wird nicht benötigt. Hauptanwendung dieses Programms ist die Steuerung eines rotatorischen Direktantriebs. Daher beziehen sich alle Maßeinheiten auf Winkelgrad. Kennzeichend ist, dass der Arbeitsbereich größer als 360 ° sein darf und der Referenzschalter während der Bewegungen überfahren werden darf. Emulations-Schaltungen können ersatzlos entfallen. Weiterhin wird ein Bremsmagnet nach jedem Bewegungsende angesteuert, und der Motorstrom abgeschaltet, um Störeinkopplungen in die Messschaltung zu vermeiden. Die Bewegung des Motors kann auch über eine DDE-Verbindung ausgelöst werden.

Ultraschallmessplatz und MOTORST
Erforderliche Hard- und Software
Installation
Bedienung der Fenster
Elemente des Hauptfensters
Bereich abfahren
Grenzen festlegen
Motor auswählen
Bedienung allgemein
Referenzfahrt durchführen
Bewegung durchführen
Motor freigeben
Beenden des Programms
Konfiguration speichern
DDE
Was ist DDE?
Konversation mit MOTORST
DDE-Verbindung erstellen
Probleme und Lösungen
Fehlerhafte Initialisierungsdatei...
Einheit nicht verfügbar
Fehlerhafte Zahleneingabe
DDE-Fehler
Sonstige Fehler
h#s  © Technische Universität Chemnitz, Fachbereich Mess- und Sensortechnik

#$+ K {bml dipic.bmp} Hard- und Software-Erfordernisse
Das Programm MOTORST.EXE benötigt mindestens Windows 3.1 im Standard-Modus. Da jedoch der virtuelle Gerätetreiber MPK3D.386 den Erweiterten Modus erfordert, ist für eine Funktion mit Motor ein AT 386 oder besser mit mindestens 1.5 Megabyte RAM erforderlich. Aufgrund der Notwendigkeit eines Kernel-Treibers, der z. Z. nur als Windows 3.1-VxD vorliegt, ist eine Funktion nur unter Windows 3.1 und Windows 95 gegeben. Um dasselbe Programm unter Windows NT laufen zu lassen, ist ein NT-Kernel-Treiber erforderlich. Unter Win/OS2 wäre ein OS/2-Treiber nötig.
Installationshinweise für den virtuellen Gerätetreiber finden sich in der MPK3D-Referenz.
Des weiteren ist die isel Microstep-Steuerkarte MPK3 erforderlich, mit der dann der Schrittmotor im Mikroschrittbetrieb angesteuert wird. Erläuterungen zur Karte und zum Mikroschrittbetrieb siehe isel-Dokumentation.
Der Treiber wurde jedoch mit einer gänzlich anderen Strategie entworfen (Nanoschritt-Rechnung), die zwar mehr Rechenaufwand kostet, durch die starke Verminderung der Arbeitsfrequenz und die vollständige Kodierung in 32-bit-Assembler die Rechenleistung des Rechners nur kaum beeinflusst. Die Angabe der "Mikroschritte pro Schritt" entfällt, die Positioniergenauigkeit ist auf theoretische 256 Mikroschritte angewachsen, bei einer immer noch sportlichen Maximaldrehzahl von 5 U/s.
Eine automatische Erkennung der Karte erfolgt nicht. Sie ist aufgrund der Gestaltung des Kartenzugriffs nicht möglich. Somit ist der Betrieb mit Gerätetreiber auch ohne Karte möglich; jedoch findet die Referenzfahrt kein Ende.
Entstanden ist dieses Programm aus der Notwendigkeit, die vorhandene Hardware unter Windows über DDE anzusprechen. Vorlage war eine DOS-Version UMSxx (Ultraschall-Messplatz-Steuerung) von Dipl.-Ing. Karsten Krämer, die er im Rahmen seiner Diplomarbeit angefertigt hat.

Dieses Programm besteht aus:
MOTORST.EXE	das Programm
MOTORST.HLP	diese Hilfedatei
MPK3D.EXE	der virtuelle Gerätetreiber
MPK3D.HLP	Referenz (Installationshinweise und Programmierschnittstelle)
WasserMP.INI	eine Initialisierungsdatei im Windows-Verzeichnis. Sie wird ggf. automatisch angelegt.

#$+K {bml dipic.bmp} Installation
Dateien auf Festplatte kopieren und Sinnbilder (Icons) im Programm-Manager erstellen. Folgende Dateien sollten dazugehören:
MOTORST.EXE	das Programm
MOTORST.HLP	diese Hilfedatei
MPK3D.386	Virtueller Gerätetreiber für Windows
MPK3D.HLP	Referenz zum Gerätetreiber
Das Icon für die obenstehende .EXE kann bequem per Drag & Drop zwischen Datei- und Programm-Manager erstellt werden. Eine SETUP.EXE wurde nicht vorgesehen, da dieses Programm für den lokalen Einsatz an der TU Chamnitz vorgesehen ist.
Der Gerätetreiber wird in die [386enh]-Sektion der SYSTEM.INI eingetragen. Mit einem Texteditor oder dem Programm SYSEDIT (im Lieferumfang von Windows) kann die Zeile
device=[pfad]mpk3d.386
eingetragen werden. Damit der Treiber wirksam werden kann, muss Windows neu gestartet werden.
Genaueres hierzu steht in der Referenz zu MPK3D.HLP.

#$+K Elemente des Hauptfensters
Das Programm präsentiert sich als Dialogfenster, bei dem die wichtigsten Aktionen direkt ausgeführt werden können.

{bml main.shg}
Klicke mit der Maus auf die gewünschten Dialogelemente oder Menüpunkte, oder drücke TAB, um entsprechende Hilfe zu bekommen

# Das Datei-Menü beinhaltet ausschließlich den Menüpunkt Beenden. Damit kann dieses Programm beendet werden. Der Motor wird dabei automatisch auf Freilauf geschaltet, d.h. die Achse ist frei drehbar. Existiert eine aktive DDE-Verbindung, erfolgt eine Sicherheitsabfrage.

# Der Menüpunkt Optionen beinhaltet einige Unterpunkte, die der Einstellung einzelner Eckwerte dienen. Außerdem kann eine halbautomatische Fahrt von einem wählbaren Punkt zu einem anderen in einer einstellbaren Schrittweite und einem einstellbaren Zeittakt durchgeführt werden.

# Die Unterpunkte unter dem Menüpunkt Hilfe dienen dem Start der Anzeige dieser Hilfedatei sowie der Anzeige einer Programmkurzinformation im Unterpunkt Über….

# Dieses Editierfeld dient sowohl zur Anzeige der Absolutposition als auch zur Eingabe einer neuen Absolutposition. Zum Wirksammachen der Änderungen in diesem Eingabefeld, d.h. zum Bewegen des Motors zur angegebenen Position, muss der Schalter Zur Position betätigt werden. Die Anzeige wird nach Abschluss eines jeden Bewegungssegments aktualisiert. Es können sich dabei Rundungsfehler einstellen, die auf die interne Verarbeitung der Positionsangaben mit Festkommazahlen wegen der endlichen Schrittzahl des Schrittmotors zurückzuführen sind. In der standardmäßigen Konfiguration beträgt der Quantisierungsfehler 4 Tausendstel Grad.

# Dieser Schalter dient zum Bewegen des Motors zu einer der beiden links daneben angezeigten Positionen. Zu welcher Zahl der Motor bewegt wird, hängt davon ab, welches Eingabefenster zuletzt den Cursor enthielt (in Fachsprache: fokussiert war). Wird dieser Schalter gedrückt, wenn keiner der beiden Eingabefelder den Cursor enthielt, erscheint eine darauf hinweisende Fehlermeldung. Ebenfalls eine Fehlermeldung erscheint, wenn die Zahl ungültige Zeichen enthält.
Der Schalter macht die eingegebene Zahl für das nächste Bewegungssegment wirksam. Er ist voreingestellt, d.h. die Taste ENTER betätigt diese Taste während der Eingabe. So lässt sich laufend ein neuer Wert eingeben und dahin fahren.
Während die DDE-Verbindung aktiv ist, sollte dieser Schalter - wie auch alle anderen Dialogelemente dieses Fensters - mit Bedacht betätigt werden.
Der Schalter ist grau, wenn noch keine Referenzfahrt (Schalter unten rechts) durchgeführt wurde.

# Dieses Editierfeld dient sowohl zur Anzeige der Relativposition als auch zur Eingabe einer neuen Relativposition. Zunächst sind Absolut- und Relativposition gleich. Eine Vorzugsstellung, z.B. bei einem gefundenen Maximalpegel einer Schallkeule, kann mit dem Schalter Nullpunkt setzen zum neuen Nullpunkt erklärt werden. Die DDE-Operationen beziehen sich generell auf die Relativposition. Zum Wirksammachen der Änderungen in diesem Eingabefeld, d.h. zum Bewegen des Motors zur angegebenen Position, muss der Schalter Zur Position rechts daneben betätigt werden. Die Anzeige wird nach Abschluss eines jeden Bewegungssegments aktualisiert. Es können sich dabei Rundungsfehler einstellen, die auf die interne Verarbeitung der Positionsangaben mit Festkommazahlen zurückzuführen sind. In der standardmäßigen Konfiguration beträgt der Quantisierungsfehler 4 Tausendstel Grad.

# Dieser Schalter stellt die momentane Position als neue relative Nullposition. Er wird zweckmäßigerweise nach der Einrichtung der Mechanik und der Findung eines geeigneten Nullpunktes z.B. mit Hilfe der Rollbalken betätigt. Während die DDE-Verbindung aktiv ist, sollte dieser Schalter - wie auch alle anderen Dialogelemente dieses Fensters - mit Bedacht betätigt werden.
Der Schalter ist grau, wenn noch keine Referenzfahrt (Schalter unten rechts) durchgeführt wurde.

# Dieser Rollbalken stellt die Nachkommastellen der Motorposition in Grad ein. Er kann sowohl mit den Cursortasten als auch mit der Maus bedient werden. Beim Ziehen mit der Maus werden in den Editierfeldern die neuen Zielpositionen angezeigt; die Motordrehung setzt jedoch erst mit dem Loslassen des Schiebers ein. Nach Beendigung der Drehung können gerundete Werte zur Anzeige kommen, da intern mit Festpunktzahlen gerechnet wird. Während die DDE-Verbindung aktiv ist, sollten die Rollbalken mit Bedacht betätigt werden.
In der Mitte befindet sich die Nullage, an den Enden ist der Winkel genau 1 Grad kleiner bzw. größer. Das Betätigen der Enden verändert den Winkel um Hundertstel Grad, das Betätigen des Schieberbereiches um Zehntel Grad. Nach Beendigung einer Bewegung "fängt" sich der Schieber immer im mittleren Bereich (-0,5°..0,5°) - auf diese Weise kann permanent nach links bzw. rechts geklickt werden ohne Überlaufeffekte.

# Dieser Schalter bricht eine laufende Bewegung sofort ab. Die Motorachse wird durch den Ruhestrom festgehalten. Eine anschließende Referenzfahrt ist angeraten, insbesondere wenn beim Abbremsen von hoher Geschwindigkeit Schrittfehler zu erwarten sind.
Der Schalter ist für einen eventuellen Fehlerfall vorgesehen, wenn z.B. durch Defekt des Endschalters oder zu kleiner Werte für die Geschwindigkeit in der Konfiguration ein vorzeitiger Abbruch nötig ist. Während die DDE-Verbindung aktiv ist, sollte dieser Schalter - wie auch alle anderen Dialogelemente dieses Fensters - mit Bedacht betätigt werden.
Der Schalter ist grau, wenn momentan keine Bewegung erfolgt.

# Dieser Schalter bricht eine laufende Bewegung sofort ab. Die Motorspulen werden (fast) stromlos geschaltet, die Achse lässt sich leicht von Hand drehen. Danach ist eine neue Referenzfahrt vonnöten.
Der Schalter ist für einen eventuellen Fehlerfall oder für Servicearbeiten am Messplatz vorgesehen. Während die DDE-Verbindung aktiv ist, sollte dieser Schalter - wie auch alle anderen Dialogelemente dieses Fensters - mit Bedacht betätigt werden.
Achtung: Durch den Ausfall des Haltestroms kann es bei schräggestellter Versuchsanordnung zu einem "Herunterfallen" der angeschlossenen Elektronik kommen. Das ist unvermeidlich und normal, man sollte sich davon nicht beirren lassen.
Der Schalter ist immer aktiv (es sei denn, kein Motor ist ausgewählt) - bei bereits freigeschaltetem Motor passiert jedoch nichts.

# Dieser Rollbalken stellt die Vorkommastellen der Motorposition in Grad ein. Er kann sowohl mit den Cursortasten als auch mit der Maus bedient werden. Beim Ziehen mit der Maus werden in den Editierfeldern die neuen Zielpositionen angezeigt; die Motordrehung setzt jedoch erst mit dem Loslassen des Schiebers ein. Nach Beendigung der Drehung können gerundete Werte zur Anzeige kommen, da intern mit Festpunktzahlen gerechnet wird. Während die DDE-Verbindung aktiv ist, sollten die Rollbalken mit Bedacht betätigt werden.
In der Mitte befindet sich die Nullage, an den Enden sind die einstellbaren Maxima. Das Betätigen der Enden verändert den Winkel um 1 Grad, das Betätigen des Schieberbereiches um 10 Grad.

# Wie der Text sagt, dient dieses Dialogelement als Anzeige, dass sich der Motor gerade bewegt.
Eigentlich handelt es sich hierbei um einen "Wellenschalter". Der "Schalter" ist grau, weil er nur als Anzeige des Zustandes dient.

# Wie der Text sagt, dient dieses Dialogelement als Anzeige, dass eine DDE-Verbindung aktiv ist. Ist das der Fall, sollten die übrigen Dialogelemente mit Bedacht betätigt werden, das unbeabsichtigte Beenden des Programms wird durch eine Sicherheitsabfrage verhindert.
Eigentlich handelt es sich hierbei um einen "Wellenschalter". Der "Schalter" ist grau, weil er nur als Anzeige des Zustandes dient.
Falls es sinnvoll erscheint, die Bedienungsmöglichkeiten während aktiver DDE-Verbindung z.B. bei Abwesenheit oder vor den neugierigen Augen Dritter einzuschränken, sollte das Programm zum Symbol verkleinert werden. Mit Hilfe geeigneter Task-Manager kann man auch das Symbol verschwinden lassen.

# Mit diesem Schalter, der betätigt werden muss. damit die anderen Dialogelemente benutzbar sind, wird der Schrittmotor an seinem Endschalter "synchronisiert". Damit wird die Beziehung zwischen rechnerinterner und äußerer Position hergestellt. In der isel-Dokumentation wird das als Referenzfahrt bezeichnet. Während die DDE-Verbindung aktiv ist, sollte dieser Schalter - wie auch alle anderen Dialogelemente dieses Fensters - mit Bedacht betätigt werden.
Der Schalter ist grau, wenn kein Motor ausgewählt wurde.

#$+ K Referenzfahrt durchführen
Die Referenzfahrt (auch Synchronisation genannt) erfolgt durch Druck auf den entsprechenden Knopf. Ist der Motor momentan im Freilauf (die Achse lässt sich spielend leicht von Hand drehen), müssen Sie als Anwender dafür sorgen, dass sich die Anlage in etwa in Nullage befindet, da sie "Schaltersuche" nur in einer Richtung erfolgen kann, um eine Verdrehung der Stromkabel zur Messanordnung zu vermeiden. Eine entsprechendes Hinweisfenster weist darauf hin.

#$+ K {bml adjust.bmp} Bewegung durchführen
Durch Bewegung der Rollbalken oder durch Eingabe einer Zahl und Bestätigung durch Drücken von ENTER oder mit der Maus auf den Knopf Zur Position erfolgt eine manuelle Positionierung des Motors. Dies ist insbesondere zur Einrichtung vor dem Start der automatisierten Messung hilfreich.

#$+ K {bml adjust.bmp} Motor freigeben
Hierzu dient der Schalter Frei. Danach ist eine Referenzfahrt nötig - die anderen Schalter sind inaktiv. Alternativ kann das Programm beendet werden, oder ein anderer (oder kein) Motor ausgewählt werden.
Der Schalter Stop hält den Motor schlagartig an, lässt jedoch weiter Strom durch die Statorspulen fließen, womit der Motor an der Position festgeklemmt wird. Jedoch sind Schrittverluste möglich, daher sollte anschließend der Schalter für Referenzfahrt betätigt werden, um eine erneute Synchronisierung zu erreichen.

#$+ K {bml adjust.bmp} Bereich abfahren
Zu diesem Dialog gelangt man nur über den Menüpunkt Option/Bereich abfahren.

{bml bereich.shg}
Klicke mit der Maus auf die Dialogelemente, oder benutze TAB und ENTER, um Hilfe abzufragen.

Hiermit ist ein halbautomatisches Abfahren eines Bereiches mit gleichmäßien Haltepunkten möglich. Der Start des nächsten Bewegungssegmentes erfolgt entweder durch Betätgung eines Schalters (Taste ENTER oder mit Maus) oder durch Ablauf einer einstellbaren Zeitspanne.
Für ein vollautomatischen Messplatz ist ein MatLab-Skript geeigneter.
Achtung! Während einer aktiven DDE-Verbindung sollte dieses Programmteil mit Vorsicht verwendet werden.

# Startpunkt des abzufahrenden Bereiches in Grad.

# Endpunkt des abzufahrenden Bereiches in Grad.

# Angabe der Schrittweite in Grad oder der Anzahl der Schritte (je nach Stellung des Wellenschalters (RadioButton) rechts daneben).

# Die Angabe links daneben ist in Grad pro Schritt. Eine Umrechnung in die Anzahl der erforderlichen Schritte kann durch Betätigung des Wellenschalters darunter erfolgen.

# Die Angabe links daneben ist in Anzahl Schritte angegeben. Eine Umrechnung in Grad pro Schritt kann durch Betätigung des Wellenschalters darüber erfolgen.

# Ist dieser Wellenschalter aktiviert, kann das Fortfahren der Bewegung mit dem nächsten Schritt nur durch Benutzereingabe erfolgen.

# Ist dieser Wellenschalter aktiviert, kann das Fortfahren der Bewegung sowohl durch Benutzereingabe als auch bei Ablauf der einstellabren Zeit automatisch erfolgen. Wird dieser Schalter aktiviert, wird automatisch das Eingabefeld zum Editieren der Verzögerungszeit in Millisekunden aktiviert. Es sind maximal 65535 Millisekunden, also reichlich 65 Sekunden einstellbar.

# Mit Betätigung dieses Schalters werden die eingestellten Werte übernommen, und das Abschreiten eines Bereiches beginnt, indem der Motor sofort zur Anfangsposition fährt. Eine Dialogbox mit "Fortfahren" und "Abbrechen" erscheint, solange dieser Modus aktiv ist. Im Hintergrund zeigt das Hauptfenster die entsprechenden Aktivitäten an.
Bei Fehlern in den Angaben erscheint eine entsprechende Hinweisbox; danach wird die fehlerhafte Eingabezeile zur Änderung fokussiert.

#$+ K {bml adjust.bmp} Grenzen festlegen
Zu diesem Dialog gelangt man nur über den Menüpunkt Option/Bereich abfahren.
Er dient zur Einstellung seltener benutzter Kenn- und Grenzwerte. Das Abspeichern eingestellter Werte erfolgt nicht automatisch, sondern mit dem Menüpunkt Option/Konfiguration speichern.

{bml grenzen.shg}
Klicke mit der Maus auf die Dialogelemente, oder benutze TAB und ENTER, um Hilfe abzufragen.

# Linker softwaremäßiger Anschlag in Grad. Die Software überwacht mit jeder Bewegungsfunktion, ob die angegebene Zielposition innerhalb der Grenzen liegt. Kommastellen können angegeben werden, als Dezimaltrennzeichen sind Komma und Punkt erlaubt.

# Rechter softwaremäßiger Anschlag in Grad. Die Software überwacht mit jeder Bewegungsfunktion, ob die angegebene Zielposition innerhalb der Grenzen liegt. Kommastellen können angegeben werden, als Dezimaltrennzeichen sind Komma und Punkt erlaubt.

# Lage des Hardware-Endschalters in Grad. Bei Ausführung einer Referenzfahrt wird der Referenzschalter angefahren, und beim Auftreffen wird die aktuelle Position auf die hier angegebene Position gesetzt. Danach wird der Punkt 0 automatisch angefahren, und die Referenzfahrt ist beendet.

# Anzahl Vollschritte pro Umdrehung des Motors. Bei allen isel-Schrittmotoren ist diese Zahl auf 200 zu belassen. Ein negatives Vorzeichen ist angebbar und kehrt nahezu sämtliche Drehrichtungen, nicht jedoch die Referenzfahrtrichtung (Referenzschalter-Suchrichtung) um.

# Geschwindigkeit der Referenzfahrt in Grad pro Sekunde. Ein negatives Vorzeichen kehrt die Referenzschalter-Suchrichtung um. Achtung - es erfolgt keine Beschleunigungs- und Abbremsphase, daher sollte diese Zahl nicht zu groß gewählt werden.

# Geschwindigkeit der normalen Bewegung in Grad pro Sekunde. Maximal heißt hier, dass wegen der Beschleunigungs- und Bremsphase diese Geschwindigkeit nicht immer erreicht wird. Der Schrittmotortreiber und auch der Motor verkraften Geschwindigkeiten über 1000 Grad pro Sekunde. Die wesentliche Grenze ist die, die man der gedrehten Messanordnung zumuten kann.

# Winkelbeschleunigung bei der normalen Bewegung in [Grad pro Sekunde] pro Sekunde. Als Faustregel kann hier dieselbe Zahl wie bei der Geschwindigkeit angegeben werden. Die Grenzen werden hierbei von der Massenträgheit des Systems und den zumutbaren Kräften für die gedrehte Messanordnung festgelegt.

# Dieser Schalter übernimmt die angegebenen Werte für den weiteren Programmlauf. Es wird nicht automatisch in einer .INI-Datei gesichert, das übernimmt der Menüpunkt Optionen/Einstellungen speichern. Ist ein Wert fehlerhaft, erfolgt eine Fehlermeldung; danach wird das fehlerhafte Eingabefeld fokussiert, und es kann eine Korrektur vorgenommen werden.

# Dieser Schalter bricht diesen Dialog sofort ab, ohne dass irgendwelche Eintragungen wirksam werden.

# Dieser Schalter öffnet die Hilfe zu diesem Dialogfenster.

#$+ K {bml adjust.bmp} Einheit auswählen
Der virtuelle Gerätetreiber kann (auch gleichzeitig) alle 3 Systeme der isel-Microstep-Steuerkarte ansteuern, somit 3 Motoren gleichzeitig ansteuern. Das Programm MOTORST.EXE dagegen kann nur einen Motor steuern. (Es kann dafür ausgleichend mehrfach gestartet werden.) Es ist daher einer der Motoren auszuwählen. Die Auswahl wird in der Konfigurationsdatei gespeichert.

{bml motorsel.shg}
Klicke mit der Maus auf die Dialogelemente, oder benutze TAB und ENTER, um Hilfe abzufragen.

# Hiermit erfolgt die Auswahl von einem der drei vom MPK3D.386 unterstützten Motoren, oder keinem angeschlossenen Motor. Im letzteren Falle sind fast alle Funktionen totgelegt. Der Motor des Wassermessplatzes ist standardmäßig als Motor Z beschaltet.

# Dieses Ankreuzfeld kann benutzt werden, um zwischen der Ansteuerung der Motorspulen mit Sinus- oder Dreieckwellen zu wählen. Eins von beiden sollte einen ruhigeren Lauf bewirken, jedoch sind beide offenbar nicht optimal auf den Motor abgestimmt, sodass die Wirkung dieses Feldes fast unbemerkt bleibt.

# Die angegebenen Einstellungen werden übernommen.

#$+ K{bml help.bmp} Hilfe - Menü
Das Hilfemenü dient zur Bereitstellung folgender Funktionen:
Index	Starten der Windows-Hilfe mit der zu diesem Programm gehörigen Hilfedatei.
Über...	Anzeige von Programminformationen, wie Versionsnummer usw.
Zurück zum Hauptmenü

#$+K Beenden von MOTORST
Das Programm kann sowohl das Menü Datei/Beenden als auch über das Systemmenü (ALT+F4) beendet werden. Bei aktiver DDE-Verbindung erfolgt eine Warnung.

#$+K Konfiguration speichern
Die aktuellen Einstellungen des gesamten Optionen-Menüs können mit dem Menüpunkt Optionen/Konfiguration speichern für den nächsten Programmstart von MOTORST.EXE aufgehoben werden. Die Speicherung erfolgt dabei in Windows-3.1-typischen .INI-Dateiformat WasserMP.INI im Windows-Verzeichnis. Dabei wird eine Sektion [SMS] dieser Datei gegründet bzw. benutzt. Das Programm MOTORST.EXE teilt sich diese Profildatei mit dem verwandten Programm USM10.EXE, welches am gleichen (Wasser-)Messplatz zum Einsatz kommen soll.

#$+ K{bml dde.bmp} Dynamischer Datenaustausch
Unter Windows gibt es eine Möglichkeit, Daten zwischen Programmen über ein standardisiertes Protokoll auszutauschen. Eine DDE-Konversation findet generell zwischen genau 2 Programmen statt, wobei eins als Server und das andere als Client agiert. Als Server bezeichnet man eine Anwendung, die einen DDE-Dienst oder -Daten bereitstellt; als Client die Anwendung, die diese nutzt. MOTORST ist ein Server.
Die Konversation zwischen 2 DDE-Anwendung erfolgt mittels 3 festgelegter Hierarchiestufen: dem Service (oft identisch mit dem Programmnamen), dem Thema (eine Programm-Untereinheit; z.B. ein MDI-Kindfenster einer Anwendung, was dann gleichbedeutend mit dem Dateinamen ist) und dem Datenelement (z.B. ein Ausschnitt der Datei).
Da die Schrittmotorsteuerung nur einen Motor unterstützt, gibt es nur ein Thema. Wichtigstes Datenelement ist die aktuelle Position. Zwei weitere erforderliche Datenelemente zur Überwachung des Motor-Zustands runden das "DDE-Angebot" ab.

Aufbau einer DDE-Verbindung
Dienste von MOTORST
Anwendungsbeispiel mit MatLab

#DDE: Dynamic Data Exchange = dynamischer Datenaustausch

#$+K {bml dde.bmp} Aufbau einer DDE-Verbindung
MOTORST stellt sich hierzu systemweit als DDE-Server zur Verfügung. Systemweit bedeutet: auf dem Rechner selbst (Windows 3.1) und über ein lokales Netz (Windows für Workgroups mit entsprechender Installation).
Für den Aufbau einer DDE-Verbindung zu MOTORST wird ein (externer) DDE-Client benötigt, beispielsweise Excel, WinWord oder MatLab. Generell muss das Serverprogramm (MOTORST) zuerst gestartet werden. Danach können im Client die entsprechenden Befehle zum Aufbau der Verbindung gegeben werden. Informationen hierüber findet man in der Dokumentation oder der Onlinehilfe zu den entsprechenden Programmen. Alternativ kann das Client-Programm den DDE-Server starten, wenn eine Verbindung gefordert wird. Dazu muss meist das Verzeichnis von MOTORST.EXE im Pfad stehen - ein Nachteil, der mit OLE behoben wurde.

#$+K {bml dde.bmp} MOTORST als DDE-Server
MOTORST ist ein DDE-Server. Er ist in der Lage, Datenabfragen zu beantworten (REQUEST), Datenveränderungen dem Client mitzuteilen (ADVISE), neue Daten entgegenzunehmen (POKE) sowie eine Datenausgabe durchzuführen (EXECUTE).
Folgende Zeichenkettenkonstanten müssen für die Konversation mit MOTORST verwendet werden:

Service-Name	MOTORST (service)
System-Name	System (standard topic)
System-Datenelemente	SysItems (data item)
Themen-Liste	Topics (data item)
Formate-Liste	Formats (data item)
Item-Liste	TopicItemList (data item)
Hilfe	Help (data item)
Themen-Name	Motor (topic)
Themen-Alias	MotorX, MotorY oder MotorZ (topic) je nach Auswahl
Daten-Name	Position (data item) enthält die Relativposition
Daten-Name	InMove (data item) enthält 0 (stehend) oder 1 (bewegend)
Daten-Name	Synced (data item) enthält 0 oder 1 (Referenzfahrt ausgeführt)
Ausführen-Name	Init (execute command): Gesamte Einrichtung initialisieren
Ausführen-Name	Sync (execute command): Referenzfahrt durchführen
Ausführen-Name	Move xxx (execute command): Bewegen nach xxx
Neu: Ausführen-Name	Wait (execute command): Warten auf Bewegungsende
Ausführen-Name	Stop (execute command): Motor stoppen und halten
Ausführen-Name	Free (execute command): Motor stromlos schalten

Der Datenaustausch erfolgt auf Textbasis (CF_TEXT), d. h. es werden Zeichenketten übertragen, die die (intern gänzlich anders dargestellten) Zahlen repräsentieren. Dies ist gängigste Art, geringe Datenmengen auszutauschen.
Es steht ein System-Thema zur Verfügung, welches über die DDE-Möglichkeiten dieses Programms informiert.
MOTORST unterstützt die automatische Verbindungssuche (WILDCONNECT) nicht.

Erläuterungen zum System-Thema
Erläuterungen zum Motor-Thema

#$+K Erläuterungen zum Motor-Thema
Das wesentliche Thema dieses DDE-Servers ist das Motor-Thema. Es enthält 3 Datenelemente und stellt 5 Execute-Funktionen zur Verfügung. Alle Datenelemente sind "advisabe", können also Änderungen automatisch dem Client mitteilen. Das Datenelement Position kann außerdem noch verändert werden (POKE), die beiden zweiwertigen Datenelemente InMove und Synced sind nur lesbar.

Themen-Name	Motor (topic)
Themen-Alias	MotorX, MotorY oder MotorZ (topic) je nach Auswahl
Daten-Name	Position (data item) enthält die Relativposition
Daten-Name	InMove (data item) enthält 0 (stehend) oder 1 (bewegend)
Daten-Name	Synced (data item) enthält 0 oder 1 (Referenzfahrt ausgeführt)
Ausführen-Name	Init (execute command): Gesamte Einrichtung initialisieren
Ausführen-Name	Sync (execute command): Referenzfahrt durchführen
Ausführen-Name	Move xxx (execute command): Bewegen nach xxx
Neu: Ausführen-Name	Wait (execute command): Warten auf Bewegungsende
Ausführen-Name	Stop (execute command): Motor stoppen und halten
Ausführen-Name	Free (execute command): Motor stromlos schalten

Bei diesem DDE-Server ist die EXECUTE-Funktionalität besonders stark ausgebaut. Nicht jeder Client unterstützt DdeExec. Neben der Möglichkeit, den Motor sowohl über EXECUTE als auch über POKE (auf Item Position) zu bewegen, bietet hier DdeExec ausschließlich die übrigen Steuermöglichkeiten der Referenzfahrt (Kommando Sync), dem Soforthalt (Stop) und des Freischaltens (Free) der Motorachse an. Übrigens liefern alle Execute-Funktionen eine negative DDE-Bestätigung, wenn kein gültiger Motor ausgewählt wurde.
Position:
Eine Veränderung der Position zieht immer auch eine Bewegung des Motors nach sich; das Setzen der Position ist also gleichbedeutend mit dem Execute-Kommando Move xxx. Der DDE-Server bezieht sich hierbei ausschließlich auf die Relativposition, somit hat der Anwender die Möglichkeit, die tatsächliche Nullage vor dem DDE-Clienten zu verbergen. Dagegen sind die Angaben selbst absolut zum Nullpunkt und in Grad zu verstehen, d.h. ein Akkumulieren ist nicht möglich. Das vermeidet ein Zunehmen systematischer Fehler. Eine negative DDE-Bestätigung wird geliefert, wenn die Zielposition außerhalb festgelegter Grenzen liegt, oder der Motor freigeschaltet war (Synced=0).
Erfolgt momentan eine Bewegung (InMove=1), ist das kein Fehler - die neue Position wird in eine 1 Element lange Warteschlange gestellt. Diese neue Position wird dann automatisch beim Beenden des laufenden Bewegungssegmentes angefahren. Ist die Warteschlange bereits gefüllt, wird der Wert dort überschrieben. Im Falle des Schreibens in die Warteschlange erfolgt generell eine positive DDE-Bestätigung, da der Bereichstest erst bei Übergabe an den Motortreiber erfolgt. Es wird daher generell davon abgeraten, die Warteschlange über DDE auszunutzen.
Das Programm unterstützt die automatische Aktualisierung. Wenn ein Client die automatische Aktualisierung aktiviert (ADVSTART), werden bei jeder Wertänderung, sowohl von anderen Clients als auch direkt bei Manipulation an den Dialogelementen des Programms, die veränderten Daten aktualisiert.
InMove:
Das Datenelement InMove zeigt den Bewegungsstatus des Motors an und kann von einem DDE-Client sowohl durch zyklische Abfrage (Polling) als auch über die automatische Aktualisierung (ADVSTART) ausgewertet und für einen Programmfluss einer DDE unterstützenden Skriptsprache herangezogen werden. Dieses Datenelement ist ebenfalls ADVISEable, jedoch nicht POKEbar. InMove wird auch dann gesetzt und gelöscht, wenn eine Bewegung um null Schritte erfolgt.
Synced:
Das Datenelement Synced informiert darüber, ob eine gültige Referenzfahrt ausgeführt wurde (Synced=1), oder ob eine Referenzfahrt erforderlich ist (Synced=0), nachdem z.B. die Funktion Free aufgerufen wurde. Dieses Datenelement ist ebenfalls ADVISEable, jedoch nicht POKEbar.
Init:
Diese Funktion initialisiert die Schrittmotorsteuerung komplett. Es wird der Versatz zwischen relativer und absoluter Position nullgesetzt, d.h. fortan sind beide Werte gleich. Danach wird eine Referenzfahrt in exakt derselben Folge durchgeführt wie beim Drücken auf den Schalter Referenzfahrt:
-	Bewegen des Motors zur Position 0, wenn Motor bestromt ODER
-	Meldungsfenster zeigen, wenn der Motor freigeschaltet (stromlos)
-	Referenzfahrt ausführen
-	Motor zur Position 0 bewegen
Im Gegensatz zu allen anderen Execute-Funktionen verbleibt die Funktion Init solange im Server, bis sie beendet wird, führt also implizit Wait aus. Außerdem ist Init die einzige nicht-stille Funktion, d.h. sie kann Meldungsfenster erzeugen. Da die Beantwortung dieses Fensters einige Zeit in Anspruch nehmen kann, sollte hierbei ein möglichst hohes DDE-Timeout (z.B. 1 Minute) Client-seitig vorgegeben werden. Init liefert eine negative DDE-Bestätigung, wenn das Meldungsfenster durch Abbrechen geschlossen wurde oder sich ein Fehler einstellte.
Sync:
Hiermit wird eine "stille" Referenzfahrt ausgeführt. Es erfolgt niemals ein Meldungsfenster. Es wird nicht geprüft, ob sich der Motor auf der richtigen Seite des Schalters befindet und danach auch keine Bewegung zur Position 0 durchgeführt. Ein DDE-Server muss ggf. selbst entsprechende Warnungen dem Anwender mitteilen, was die Funtion Init automatisch tut.
Achtung: Der Server (genauer: die DDE-POKE-Funktion) kehrt bei Aufruf von Sync sofort zurück, er wartet also keinesfalls auf das Ende der Bewegung.
Move xxx:
Hiermit wird der Motor zu einer bestimmten Position bewegt. xxx ist dabei eine Gleitkommazahl im ASCII-Format. Dezimaltrenner darf Punkt oder Komma sein. Das Trennzeichen zwischen Move und xxx ist Weißraum (Leerzeichen oder Tabulator) und kann auch weggelassen werden.
Achtung: Der Server (genauer: die DDE-POKE-Funktion) kehrt bei Aufruf von Move xxx sofort zurück, er wartet also keinesfalls auf das Ende der Bewegung. Die Motorbewegung wird im Hintergrund vom Virtuellen Gerätetreiber MPK3D.386 ausgeführt, der nur unmerklich Rechenleistung verbraucht. Die Aktualisierung der Position erfolgt erst am Bewegungsende, so auch der "Advise"-Zyklus. Dabei wird die Istposition angenommen; dieser Wert kann sich von dem bei Move xxx angegebenen um unvermeidliche Quantisierungsfehler unterscheiden!
Wait:
Dieses neue Kommando wartet auf das Ende der Bewegung, d.h. verharrt, bis der Motor stillsteht. Steht der Motor still, tut diese Funktion nichts und kehrt sofort zurück.
Bei Anwendung dieses Kommandos ggf. das DDE-TimeOut höher setzen!
Stop:
Dieses Kommando bewirkt einen Soforthalt. Der Motor wird weiterhin bestromt, erzeugt also ein Haltemoment. Da ein Stop-Kommando aus geringen Geschwindigkeiten heraus selten zu Schrittfehlern führt, bleibt Synced=1 gesetzt. Dennoch ist im folgenden eine Referenzfahrt angeraten. War der Motor in Bewegung, wird InMove selbstverständlich auf 0 gesetzt. Dann erfolgt auch ein ADVISE-Zyklus auf die Anhalte-Position.
Free:
Wie Stop bewirkt dieses Kommando einen Soforthalt. Die Motorspulen werden stromlos geschaltet, es wird kein Haltemoment erzeugt. Da der Verlust der Synchronisation sehr wahrscheinlich ist, wird Synced=0 gesetzt. Es erfolgt kein ADVISE-Zyklus auf die nun ungültige Motorposition.

Für das allgemeine Thema Motor existiert ein Alias (Bezeichner gleicher Bedeutung), der sich je nach ausgewähltem Treiber unterscheidet. Das ermöglicht sowohl die einmalige Verwendung dieses Programms mit einem beliebigen der 3 Motoren als auch die mehrfache Verwendung und Steuerung mittels DDE z.B. in einem künftigen mehrmotorigen Messplatz.

#$+K Erläuterungen zum System-Thema
Dieses Programm stellt auch ein System-Thema zur Verfügung, welches über die DDE-Möglichkeiten informiert.

System-Name	System (standard topic)
System-Datenelemente	SysItems (data item)
Themen-Liste	Topics (data item)
Formate-Liste	Formats (data item)
Item-Liste	TopicItemList (data item)
Hilfe	Help (data item)

Alle Datenelemente können nur im Textformat (CF_TEXT) abgefragt werden.
Datenelemente, die Aufzählungen enthalten (wie z.B. SysItems die Liste aller System-Datenelemente auflistet), enthalten die einzelnen Zeichenketten durch 1 Leerzeichen getrennt.
Das Hilfe-Datenelement Help enthält schließlich menschenlesbare Kurzinformationen.

#$+K Matlab-DDE-Beispiel
Dieses untenstehende Programm realisiert eine einfache Messplatzsteuerung unter Verwendung dieses und des Ultraschallwandleransteuerungs-Servers SENDERST.EXE.

%Ultraschallsender öffnen
echo on
c1=ddeinit('SENDERST','SENDERST');
ddepoke(c1,'Pulses','8');
ddepoke(c1,'Param','200');

%Schrittmotor öffnen
c2=ddeinit('MOTORST','motor');
InMov=0;
ddeadv(c2,'InMove','disp(InMov)','InMov');

p=-90;
ddeexec(c2,'Sync');
ddeexec(c2,'Wait');
% Warten bis Bewegung zu Ende
while p<=90
 ddeexec(c2,sprintf('Move %f',p));
 ddeexec(c2,'Wait');

 ddepoke(c1,'Angle',sprintf('%f',p+30));
 ddeexec(c1,'Output');
 pause(1);
 p=p+1;

end;

ddepoke(c2,'Position','0');
ddeexec(c2,'Wait');
ddeexec(c2,'Free');
ddeterm(c2);
ddeterm(c1);

#$+K{bml riss.bmp} Initialisierungsdatei-Fehler
Diese Fehlermeldung tritt beim erstmaligen Start dieses Programms auf. Das Programm kann den Eintrag Unit= in der Sektion [MOTORST] der "WasserMP.INI" im Windows-Verzeichnis nicht finden und lässt den Motor (welchen auch?) uninitialisiert.
Sie sollten als nächstes über das Menü unter Optionen/Motor auswählen den gewünschten auswählen. Wenn dieser Dialog erfolgreich beendet wurde, wird die oben genannte Konfigurationsdatei entsprechend eingerichtet.

#$+K{bml riss.bmp} Einheit nicht verfügbar
Beim Start des Programms oder bei Auswahl eines Motors kann es sein, dass entweder der virtuelle Gerätetreiber nicht geladen wurde, oder der Motor gerade verwendet wird. Wählen Sie einen anderen Motor oder beenden Sie das andere Programm, welches den Motor gerade belegt. Falls kein Eigentümer des Motors greifbar ist, weil das Programm vorher unsanft beendet wurde, kann eine Freigabe erzwungen werden (Taste Ignorieren). Benutzung auf eigene Gefahr!

#$+KFehler bei der Zahleneingabe
Dieser Fehler kennt generell 2 Ursachen:
Fehlerhafte Zeichen	Die Zahl enthält Buchstaben, Sonderzeichen (außer Punkt oder Komma) oder Leerzeichen.
Bereichsüberlauf	Die angegebene Zahl übersteigt die im Dialog angegebenen Grenzen.

#$+K {bml dde.bmp} DDE-Fehler
MOTORST kann bei Fehlern bezüglich DDE niemals aktiv werden, dies tut die Client-Applikation.
Folgende Fehler könnten sich bei einem Konversationsversuch einstellen:
Kann DDE nicht initialisieren (MOTORST läuft, DDE-Verbindungsanzeige ist aus):
	Sind alle Zeichenketten (Strings) korrekt geschrieben? Schreibweise siehe DDE-Server
Kann DDE nicht initialisieren - Serveranwendung nicht gefunden (MOTORST läuft nicht):
	Liegt MOTORST im Pfad? Möglicherweise wird der automatische Start des Servers von der Client-Applikation nicht oder nicht richtig unterstützt.
Kann Daten nicht abschicken / abholen (MOTORST läuft, DDE-Verbindungsanzeige ist an):
	Sind alle Strings korrekt geschrieben? Siehe DDE-Server
Datenveränderungen werden nicht automatisch bei Veränderung aktualisiert (MOTORST läuft, DDE-Anzeige ist an):
	Vermutlich wurde vergessen, die automatische Aktualisierung client-seitig zu aktivieren, oder das Client-Programm unterstützt diese Funktion nicht.
Wie vollziehe ich vom Client aus eine Ausgabe?
	Dies erfolgt über DdePoke oder DdeExecute. Möglicherweise unterstützt der verwendete Client diese Funktionen nicht.

#$K{bml riss.bmp} Sonstige Fehler
MOTORST VERURSACHTE EINE ALLGEMEINE SCHUTZVERLETZUNG IM MODUL mmmm BEI ADRESSE ssss:oooo
Falls Sie einmal diese oder eine ähnliche Fehlermeldung erhalten sollten, so ist ein schwerer Programmfehler aufgetreten. Sie können das Programm nur beenden. Schreiben Sie auf, welche und in welcher Reihenfolge Sie die Funktionen aufgerufen haben, welche Fehleradresse angezeigt wird und welche Programmversion Sie benutzen und teilen Sie dies dem Entwickler mit.

Zurück zum Hauptmenü

# {bml sms10.bmp} MOTORST © h#s 1996,2000. Erstellt mit BORLAND PASCAL 7.0. Dieses Programm wurde für die Technische Universität Chemnitz, Fachbereich Mess- und Sensortechnik, angefertigt.

# MPK3D.386 Virtueller Gerätetreiber für Windows 3.x Erweiterter Modus und Windows 95. © h#s 1996. Erstellt mit Turbo Assembler 3.2 und DDK-Lite. Danke für die Unterstützung durch die Anwesenden in der Newsgroup comp.ms-windows.programmer.vxd.
Hilfe sowie Hinweise für Programmierer zu diesem Treiber gibt es in der MPK3D-Referenz.