| AllgemeinesumFish30.DLL soll eine Reihe von Basis-Funktionen für den Zugriff auf alle fischertechnik Interfaces unter den Windows-Betriebssystemen für möglichst viele Windows-Programmiersprachen bereitstellen. Deswegen wird neben der ursprünglichen um-Schnittstelle eine cs-Variante angeboten, die den als Parameter problematischen Kontrollblock ftiDCB kapselt und die Direktzugriffe, die über die um-Schnittstelle möglich sind, in Form von Funktionen anbietet. Um einkommende Änderungen an den E-Eingängen des Interfaces zuverlässig erkennen und verarbeiten zu können, wurden die direkten Zugriffe auf das Interface von den Zugriffen der Anwendung auf umFish30.DLL entkoppelt und über den MultiMediaTimer gesteuert, in festen Abständen in einer CALLBACK-Routine abgefragt (EX/EY, E-Eingänge) bzw. aufgefrischt (M-Ausgänge). Die Kommunikation findet über den Kontrollblock ftiDCB statt. Ergänzend zur Bearbeitung der Interface Ein- und Ausgänge wurden in der CALLBACK-Routine zusätzliche Funktionen implementiert, die die Funktionalität des Interfaces zur Anwendung hin erweitern. Das sind : Zählung der Impulse an den E-Eingängen, Steuerung der Einschaltdauer (d.h. Geschwindigkeit) an den M-Ausgängen und eine ImpulsCounter (Positions) Überwachung, die die M-Ausgänge selektiv abschaltet, wenn der zugehörende ImpulsCounter den Wert Null erreicht hat bzw. der zugehörende EndeTaster erreicht wurde. Die Sources zu umFish30.DLL sind in umFish30.ZIP zu finden. StrukturZur Namensgebung : nur Funktionen mit dem Prefix 'um' bzw. 'cs' stehen extern zur Verfügung. Zugriff auf das InterfaceVerbindung zum InterfaceDie Verbindung zum Interface wird durch die Funktion umOpenInterface hersgestellt, die ihrerseits nach Interface und Betriebssystem differenziert :
Besonders umOpenInterface setzt auch die (default) Werte des ftiDCB. umCloseInterface schließt die Verbindung zum Interface (mit CloseInterfaceRT beim Zugriff über Treiber). Es wird ein weiterer Kontrollblock ftiSave geführt, der die Daten des zuletzt geöffneten ftiDCB enthält. Beim Entladen von umFish30.DLL durch das System kann so im DllMain bei einem "vergessenen" umCloseInterface der Anwendung noch ein umCloseInterface nachgereicht werden, das gibt die Systemresourcen doch noch frei (Anmerkung : bei der cs-Variante ist diese Technik noch ausbaufähig). Lesen E-Eingänge - Refresh M-AusgängeGetInputs ist die zentrale (interne) Routine für diese Aufgabe :
GetInputs überträgt als erstes den ftiDCB.OutputStatus und liest das die Werte der E-Eingänge nach ftiDCB.InputStatus Lesen Analog-EingängeGetAnalog ist die zentrale (interne) Routine für diese Aufgabe :
GetAnalog besetzt ftiDCB.Analogs[] und beim Intelligent Interface auch noch ftiDCB.InputStatus. Pollen des InterfacesDas Pollen des Interfaces wird durch den MultiMediaTimer gesteuert, es geschieht in der zugehörenden CALLBACK-Routine PollInterface. Eingangs wird der Parameter DWORD DCB in eine praktikablere Form umgesetzt : ftiDCB *d = (ftiDCB*)DCB; Abfrage der E- und Analog-Eingänge, Refresh M-AusgängeRetten des InputStatus : StatusAlt =
d->InputStatus;
Emitteln StatusDelta : StatusDelta = StatusAlt ^
StatusNeu; Schleife über MotorenDie nachfolgenden Operationen werden in einer Schleife über die verfügbaren M-Ausgänge durchgeführt (Indices : iMot, iEnd, iImpuls) ImpulsCounter : Zählen der Impulse an den E-EingängenDurchgeführt im NormalMode (MotMode, bezogen auf einen M-Ausgang) if(StatusDelta & EMaske[.] > 0) d-Counters[.]++; Position : ImpulsCounter-ÜberwachungDurchgeführt im RobMode (ModMode, bezogen auf einen M-Ausgang) if(StatusDelta & EMaske[.] > 0) d-Counters[.]--; Bremsen wenn Counter < 6 : d->SpeedStatus = ... Geschwindigkeit : Steuerung der Einschaltdauer der M-AusgängeDurchgeführt im Normal- und RobMode, wenn M-Ausgang nicht aus (SollDirection >0) und Geschwindigkeitsstufe (Speed) < Full und > aus. d->OutputStatus &= MAus[.];
M-Ausgang abschalten Anwendung : Zugriff auf den Kontrollblock ftiDCBDie Funktionen mit dem Prefix um bzw. cs stehen extern zur Verfügung und können alternativ genutzt werden. In der Mehrzahl reichen sie nur Werte des ftiDCB weiter. Bei Funktionen, die einzelne E- bzw. M-Ausgänge ansprechen, wird das entsprechende ftiDCB-Feld noch maskiert. Sie sind eher als Komfort-Funktionen anzusehen, allerdings erfordert die Handhabung von Geschwindigkeitsstufen den Zugriff auf mehrere ftiDCB-Felder. Deswegen hier auch die gemeinsame Routine SetMotorAll. Eine Ausnahmestellung nimmt um GetAnalogDirect ein. Sie schaltet zur Ermittlung eines Analogwertes vorübergehend das Pollen ab. Grund : Der Zugriff auf EX/EY dauert recht lange und treibt so das PollInterval hoch. Die um-Funktionen erfordern einen Parameter ftiDCB, der im Anwendungsprogramm liegen muß. Die cs-Funktionen erfordern als Parameter ein Handle auf einen internen DCB und greifen auf entsprechende um-Funktionen zu, und wenn nicht vorhanden direkt auf den ftiDCB. csOpenInterface(Ex) wird ohne Handle aufgerufen und bestimmt für die folgenden Funktionen das erforderliche Handle. Außerdem werden einige im ftiDCB geführte Werte als Parameter übergeben. DetailsMultiMediaTimerDer MultiMediaTimer veranlaßt zu festen Zeitintervallen den Aufruf der CALLBACK-Routine PollInterface. Er wird in umOpenInterface gestartet : Interface.FID = timeSetEvent( Die CALLBACK-Routine hat folgende Parameterleiste : void CALLBACK PollInterface(UINT wTimerID, UINT msg, DWORD DCB, DWORD dw1, DWORD DW2) von Interesse ist hier nur der Parameter DWORD DCB, der Eingangs der Routine wieder in einen ftiDCB-Zeiger kopiert wird. ftiDCB *d = (ftiDCB+)DCB; umCloseInterface beendet dann das Pollen : if(Interface.FID != 0) timeKillEvent(Interface.FID); Da die CALLBACK-Routine in einem eigenen Thread läuft, ist es wichtig, den MultiMediaTimer zuverlässig abzuschalten (siehe auch umCloseInterface). Stand : 08.09.2003 |