|
C# : Objekte anstelle von MethodenC# Assembly FishDevices40.DLL : FishDev40.PDF. Die Ein- und Ausgänge sind Objekte des zugehörenden Interfaces, sie werden nicht mehr über die Methoden des Interface-Objektes angesprochen. Sie verfügen meit über einen eigenen Thread (ExecuteRoutine EventLoop) um den aktuellen Interfacestand auswerten zu können. Im EventLoop können eigene Ereignisse auslösen. Z.B. ChangedToTrue, wenn der Zustand eines Taster von false auf true wechselt. Die Device-Objekte erlauben sowohl eine eventorientierte wie auch eine lineare Programmierung, da sie parallel zu einem kompletten Satz von Ereignissen auch mit einem Satz korrepondierender Methoden ausgestattet sind. Über die Klasse FishDevices werden die Resourcen (Interfaces der ROBO Serie, Intelligent Interface) zentral verwaltet. Download FishDev40.ZIP (enthält auch ein VB.NET-Beispiel (auf Basis von FishDevices40.DLL).
Hinweise zum KonzeptEbenenkonzept der Klassenbibliothek FishDevices40.DLL Vergleich FishFace40.DLL - FishDevices40.DLLStandard-Lösung : FishFace40.DLLDie bekannte Klassenbibliothek FishFace40 wird für eine größere Anzahl von Programmiersprachen - auch für C# - einheitlich angeboten. FishFace40 basiert auf umFish40.DLL und bietet mit der zentralen Klasse FishFace eine Beschreibung des angeschlossenen Interfaces an. Die Ein- und Ausgänge des Interfaces werden über Methoden der Klasse FishFace angesteuert : FishFace ft = new FishFace(); ft.SetMotor(Out.M1, Dir.Links); if(ft.GetInput(Inp.I1)) ft.SetMotor(Out.M1, Dir.Off); Die Methode SetMotor startet z.B. einen am Ausgang M1 angeschlossenen Motor in Drehrichtung Links. Die Methode GetInput ermittelt den aktuellen Status des Einganges E1. Der Motor an M1 wird ggf. abgeschaltet. OO-Lösung mit FishDevices40.DLLMit FishDevices40 sieht das dann so aus : FishDevices fd = new FishDevices(); Antrieb.Left(); if(Endtaster.IsTrue) Antrieb.Off(); Das Motor-Objekt Antrieb wird in Drehrichtung links gestartet. Der Status des Sensor-Objektes Endtaster wird ermittelt. Der Antrieb wird ggf. abgeschaltet. Wenn man zusätzlich eine Ereignisroutine zuordnet, kann man eine Zustandsänderung von Endtaster (Ereignis) auch in einer zugehörenden Ereignisroutine erfahren und darauf reagieren : Endtaster.ChangedToTrue += BinaryInput.Changed(AntriebLinks); void AntriebLinks(object sender) { Hier kann auf das if verzichtet werden, der Antrieb wird "hinter der Leinwand" abgeschaltet. Beispiel Parkhausschranke aus dem Computing Starter Kit"Durch Betätigen des Tasters E3 soll die Schranke geöffnet werden. Ist die Schranke offen, leuchtet die Ampel grün. Erst wenn die Lichtschranke passiert wurde, springt die Ampel auf rot und die Schranke schließt wieder." Originaltext aus der Anleitung. Die Schranke wird nun auf folgende Objekte abgebildet : FishDevices fd = new FishDevices(); Die Schranke besteht hier aus dem Objekt LimitedMotor mit den Objekten Motor
an M3 und dem Endtaster für "geschlossen" an I5 und "offen"
an I7 Die Steuerung sieht dann so aus : do { Die Steuerung läuft in einer Endlosschleife, die durch ESC abgebrochen werden kann. Der Reihe nach wird hier die Schranke geschlossen, auf eine Anforderung zu Durchfahrt gewartet, die Ampel geschaltet, die Durchfahrt abgewartet und wieder die Ampel geschaltet. Und ereignisgesteuert :private void SchrankeOeffnen(object sender){ if(SchrankeBusy) return; SchrankeBusy = true; lblStatus.Text = "--- SchrankeBusy ---"; Schranke.GoRight(); }private void SchrankeFreigeben(object sender){ Rot.Off(); Gruen.On(); } private void SchrankeSchliessen(object sender) { ft.Pause(555); Rot.On(); Gruen.Off(); Schranke.GoLeft(); } private void SchrankeWarten(object sender) { SchrankeBusy = false; lblStatus.Text = "--- Schranke betriebsbereit ---"; } Anstelle der Endlosschleife eine Folge von Ereignisroutinen, die das gleiche tun. Sie sind in der Reihenfolge ihrer Nutzung aufgeführt. Das vollständige Programm ist im Downloadpäckchen enthalten. ZeitverhaltenFishDevices zeigt bei ereignisgesteuerten Programmen ein sehr gutes Zeitverhalten, wenn man darauf achtet die Eventroutinen nicht ausufern zu lassen. Gemischte Programme (lineare Programme mit ereignisgesteuerter Anzeige von Werten) sind völlig unproblematisch. Bei rein linearen Programmen kann der Ereignis-Loop des entsprechenden Objekts abgeschaltet werden (Parameter WithEvents = false). Die Zeitaussagen beziehen sich auf einen 1,7 GHz-Rechner unter Windows 2000 SP4 und .NET Final SP2. Das jetzt überholte RoboFace ist zu Vergleichszwecken z.Zt. noch unter RoboFace.HTM zugänglich. DownloadsDas vollständige Beispielprogramm, einschließlich einer ereignisgesteuerten Lösung und weiteren Beispielen und - natürlich - die übersetzte FishDevices40.DLL und die Sources dazu in FishDev40.ZIP. Die Dokumentation auch separat in FishDev40.PDF. Stand : 10.05.2007 |