umFish30 Notes

ftComputing : Programme für die fischertechnik-Interfaces und -konstruktionskästen
  
ftComputing.de
Home
Back
Sitemap
Index
Links
Impressum
Mail
 

Allgemeines

umFish30.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.

Struktur

Zur Namensgebung : nur Funktionen mit dem Prefix 'um' bzw. 'cs' stehen extern zur Verfügung.

Zugriff auf das Interface

Verbindung zum Interface

Die Verbindung zum Interface wird durch die Funktion umOpenInterface hersgestellt, die ihrerseits nach Interface und Betriebssystem differenziert :

  • umOpenInterface
    • OpenInterfaceCOM : Intelligent Interface
    • OpenInterfaceLPT : Universal (paralleles) Interface (direkt)
      • OpenInterfaceRT : Zugriff über Treiber

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änge

GetInputs ist die zentrale (interne) Routine für diese Aufgabe :

  • GetInputs
    • GetInputsCOM1 : Intelligent Interface allein
    • GetInputsCOM2 : mit Extension Module
    • GetInputsRT : über Treiber
    • GetInputsLPT : Direktzugriff

GetInputs überträgt als erstes den ftiDCB.OutputStatus und liest das die Werte der E-Eingänge nach ftiDCB.InputStatus

Lesen Analog-Eingänge

GetAnalog ist die zentrale (interne) Routine für diese Aufgabe :

  • GetAnalog
    • GetAnalogCOM1 : Intelligent Interface allein
    • GetAnalogCOM2 : mit Extension Module
    • GetAnalogRT : über Treiber
    • GetAnalogLPT : Direktzugriff

GetAnalog besetzt ftiDCB.Analogs[] und beim Intelligent Interface auch noch ftiDCB.InputStatus.

Pollen des Interfaces

Das 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änge

Retten des InputStatus : StatusAlt = d->InputStatus;
Besetzen StatusNeu

  • Bei Intelligent Interface :
    • GetInputs(*d); wenn AnalogScan = 0
    • wechselnd GetAnalog(*d, 0/1); wenn mit AnalogScan
  • Bei Universal (parallel) Interface :
    • GetInputs(*d);
    • wechselnd GetAnalog(*d, 0/1); wenn mit AnalogScan

Emitteln StatusDelta : StatusDelta = StatusAlt ^ StatusNeu;
Besetzen ftiDCB : d->InputStatus = StatusNeu;

Schleife über Motoren

Die 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ängen

Durchgeführt im NormalMode (MotMode, bezogen auf einen M-Ausgang)

if(StatusDelta & EMaske[.] > 0) d-Counters[.]++;

Position : ImpulsCounter-Überwachung

Durchgefü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änge

Durchgeführt im Normal- und RobMode, wenn M-Ausgang nicht aus (SollDirection >0) und Geschwindigkeitsstufe (Speed) < Full und > aus.

d->OutputStatus &= MAus[.];  M-Ausgang abschalten
SpeedValue = ...; nach OnOffTab[.] soll M-Ausgang ein oder aus sein.
d->OutputStatus |= AktDirection; neuer OutputStatus

Anwendung : Zugriff auf den Kontrollblock ftiDCB

Die 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.

Details

MultiMediaTimer

Der MultiMediaTimer veranlaßt zu festen Zeitintervallen den Aufruf der CALLBACK-Routine PollInterface. Er wird in umOpenInterface gestartet :

Interface.FID = timeSetEvent(
    Interface.PollInterval,   // Zeitinterval
    0,                                     // bei langsamen Systemen :
                                            // maximal mögliche Auflösung
    PollInterface,                  // Adresse der CALLBACK-Routine
    DWORD(&Interface),            //  Adresse des ftiDCB als DWORD
    TIME_PERIODIC);                 //  wiederholter Aufruf

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