HSG |
|
Über wichtige Grundlagen der Netzwerktechnik soll nicht nur geredet, sondern sie sollen in praktischen Versuchen erfahrbar werden. Die hohe Komplexität moderner Netzwerktechnik versperrt dabei den Blick auf die grundlegenden Konzepte.
Es soll ein Modellnetzwerk aufgebaut werden, das einfach, robust und billig ist. Basis unseres Modellnetzwerkes ist
die serielle Schnittstelle. Sie ist fast immer verfügbar,
robust und über die WinAPI verhältnismäßig leicht ansteuerbar.
Eine nicht vorhandene serielle Schnittstelle lässt sich sowohl bei Desktop-Rechnern über eine PCI-Karte (ca. 15 Euro)
bzw. bei Laptops über eine PCMCIA-Karte (ca. 35 Euro) nachrüsten. Viele moderne Boards verfügen sehr wohl noch
über eine serielle Schnittstelle, die aber nicht auf ein Slotblech herausgeführt ist. Auf Nachfrage kann man
also sehr günstig nachrüsten. Modernere USB-Serial-Adapter sind durchaus auch brauchbar.
Wir verwenden dabei nicht den komplexen 'Datenteil', sondern die sogenannten Handshake-Leitungen RTS und CTS. Natürlich sind Alternativen wie parallele oder
USB-Schnittstelle, Fischertechnik-Interface usw. denkbar.
Zum Experimentieren empfiehlt sich zunächst ein 1:1 Verlängerungskabel D-SUB 9-polig (z.B. AK230 bei
Reichelt), um die serielle Schnittstelle zum bequemen Hantieren nach vorne zu verlegen.
Eine 9-polige D-SUB-Buchse (z.B. D-SUB BU 09 , Reichelt), eine Leuchtdiode (z.B. LED 3MM 2MA , Reichelt)
und ein Widerstand (z.B 1/4W 2.2K , Reichelt) reichen für die ersten Versuche aus. Die Leuchtdiode wird
dabei mit der Anode (längerer Anschluss) über einen Vorwiderstand mit Pin 7 (RTS) und mit der Kathode
(größerer Teil im Inneren der LED) mit Pin 5 (GND) verbunden. Falls RTS auf Eins- (+12V) Level liegt,
leuchtet die LED. Falls RTS auf Null- (-12V) Level liegt, leuchtet sie nicht, weil sie in Sperrrichtung
gepolt ist.
Bilder vom Bau (mit Bestell-Liste)
Grundsätzlich ist das Ansprechen der seriellen Schnittstelle mit den meisten Programmiersprachen möglich. In Delphi, Python, Java und Lazarus liegen Erfahrungen vor. Viele Programme dieser Reihe wurden in Delphi geschrieben und sollten mit allen Versionen etwa ab Delphi3 funktionieren. In jüngster Zeit wurde angefangen, die Programme nach Python zu übertragen. Thomas Karp hat auf seiner Seit e infoskript.de viele ähnliche Programme in Java dokumentiert.
In allen der genannten Sprachen gehen wir in bewährter objektorientierter Denkweise davon aus, dass es einen 'Experten für die serielle Schnittstelle' gibt, der diesbezügliche Befehle ausführen und entsprechende Anfragen beantworten kann. Konkret wird ein 'Schnittstellen-Objekt' nach einer vorhandenen Klasse erzeugt. Für das weitere ist also die Kompetenz erforderlich, eine vorhandene Klasse zu benutzen.
Mit pySerial von Chris Liechti kann man die serielle Schnittstelle Plattform-unabhängig ansteuern. Es ist ein großer Vorteil von Python, dass man ohne ein Programm zu schreiben auf der Shell experimentieren kann. Die folgenden Experimente gehen davon aus, dass die RTS-CTS-Brücke mit LED, wie oben beschrieben, benutzt wird.
>>> import serial # das Modul serial wird importiert >>> s = serial.Serial(0) # Objekt s wird erzeugt und öffnet sofort Port 0 (COM1) >>> s.setRTS(0) # RTS wird auf 0 gesetzt >>> s.setRTS(1) # RTS wird auf 1 gesetzt >>> s.getCTS() # CTS wird abgefragt (RTS-CTS geschlossen) True >>> s.getCTS() # CTS wird abgefragt (RTS-CTS offen) False >>> s.close() # Schnittstelle wird geschlossen
Ein offener CTS-Eingang wird also hier anscheinend wie eine Null gelesen. Das ist nicht selbstverständlich, eigentlich ist der Zustand unbestimmt.
Wichtig: Man darf nicht vergessen, die Schnittstelle zu schließen, da sie sonst nicht mehr ansprechbar ist.
Die 'Granularität' von sleep liegt bei Windows etwa bei 10-15ms. Sie lässt sich über spezielle Befehle bis in die Gegend von 1 ms steigern (timeBeginPeriod).
import ctypes ctypes.windll.winmm.timeBeginPeriod(1) .... ctypes.windll.winmm.timeEndPeriod(1)
Eine allererste Aufgabe wird darin bestehen, den Ausgang RTS ein- und auszuschalten. Der Ausgang wird dabei durch die Leuchtdiode überwacht. Will man diese Aufgabe so einfach wie möglich erledigen, so ist das in Python bereits mit obigen Shell-Experimenten geschehen. Ein nächster Schritt könnte darin bestehen, das Gleiche mit einer grafischen Oberfläche zu erreichen. Schön wäre dabei, wenn das Einschalten an das Niederdrücken, das Ausschalten an das Loslassen eines Tasters gebunden werden könnte.
Die CTS-Leitung soll auf einfachste Art beobachtet werden. Dazu ist es nötig, die CTS-Leitung immer wieder abzufragen. Auf der Shell kann man das über eine Schleife realisieren.
>>> import serial >>> s = serial.Serial('/dev/ttyS0') >>> while True: if s.getCTS(): print('CTS auf 1') else: print('CTS auf 0')
Man kann über die Prozessorlast sehen, das das keine gute Idee ist. Der Prozessor wird durch das pausenlose Abfragen nahezu ausgelastet. Legt man kleine Pausen ein, so wird das besser.
>>> import serial >>> s = serial.Serial('/dev/ttyS0') >>> import time >>> while True: time.sleep(0.05) if s.getCTS(): print('CTS auf 1') else: print('CTS auf 0')
Die sleep-Anweisung ist in jeder der genannten Sprachen verfügbar. Sie ermöglicht auf einfache Weise, Zeitbedingungen einzuhalten. In obiger Anweisung wird jeweils 0.05 Sekunden gewartet. Steht in dieser Zeit der ganze Computer still? Nein, nur der jeweilige Thread.
Aufgabe 2 soll grafisch gelöst werden. Unter Linux ist es möglich, die gleich Schnittstelle von zwei verschiedenen Programmen aus anzusprechen. So kann man, vorausgesetzt RTS und CTS sind gebrückt, das Einschalten von RTS über CTS darstellen. Unter allen Betriebssystemen kann man natürlich auch eine eventuell vorhandene weitere Schnittstelle nutzen. Die benutzten Schnittstellen können zunächst in den Programmen 'hardgecodet' werden. Sehr reizvoll ist es, zwei Computer über ein Nullmodem-Kabel zu verbinden und Signale von einem Computer zum anderen zu senden. Zur Lösung wird empfohlen, den vermutlich im jeweiligen Fenstermanager eingebauten Timer zum Polling zu benutzen. In tkinter ist das die Methode after.
Es liegt nahe, 'RTS senden' und 'CTS zu empfangen' in einem Programm zu vereinen.
Es ist oft nützlich, über die eingebauten Schnittstellen und ihre Namen Bescheid zu wissen. Daher soll ein Programm geschrieben werden, das diese Schnittstellen auflistet. Stehen die Namen in einem Optionmenu, so ist dieser Programmteil für spätere Anwendungen gut brauchbar.
Die Ausgabe-Leitung (RTS) heißt aus und die Eingabe-Leitung (CTS) ein.
Achtung: Es hat in der Vergangenheit zu Missverständnissen geführt, dass SetAus mit Ausschalten
assoziiert wurde. Das ist nicht so. Aus steht für die Ausgabeleitung, die mit SetAus(false) ausgeschaltet und mit SetAus(true) eingeschaltet wird.
Außer den Methoden zum
Setzen bzw. Auslesen der Leitungen hat die Klasse die Methoden Start zum Starten der
Hardware und Stop zum Stoppen. Start kann über einen Parameter noch die Nummer der
Schnittstelle auswählen.
Details zur Klasse TNetzHW
Schreibe ein kleines Testprogramm - etwa mit nebenstehender Oberfläche - , das TNetzHW (in
mTNetzHW.zip) benutzt, um RTS zu setzen und
CTS einzulesen. Das Abfragen von CTS kann dabei periodisch mit Hilfe eines Timers (Polling)
erfolgen.
Zum Testen des Schreibens kann eine LED - wie oben beschrieben - dienen. Zum Test des
Einlesens ist es praktisch, CTS mit RTS zu verbinden - das geht zur Not auch mit etwas Alu-Folie.
Zumindest unter Windows funktioniert die Ansteuerung mit einer neu erstellten Unit uSerial.pas.
Mit Hilfe der Lazarus-eigenen Unit serial lässt sich ganz einfach eine Plattform-übergreifende Anwendung entwickeln.
Für viele Anwendungen ist es lästig, die CTS-Leitung dauernd abzufragen. Es wäre schöner, wenn ein Flankenwechsel an CTS ein Ereignis onCTS auslösen würde, das dann mit einer entsprechenden Ereignisbehandlung verbunden werden könnte. Eine neue Klasse TNetzHW in NetzHWneu.zip stellt diese Funktionalität zusätzlich bereit. Hier ist lediglich zu Beginn des Programms mit setOnCTS(Ereignisbehandlung) eine Verbindung zwischen Ereignis und der - parameterlosen - Ereignisbehandlung herzustellen.
Achtung: TNetzHW scheint noch nicht fehlerfrei: Empfaenger0neu.zip
Man kann Windows zu einem entscheidend - für unsere Zwecke - besseren Zeitverhalten veranlassen, wenn man mit dem Taskmanager (Strg-Alt-Entf) dem Prozess mit der rechten Maustaste eine höhere Priorität zuweist. Die Priorität 'Echtzeit' erreicht man nur mit Administratorrechten.
Thomas Karp hatauf seiner Seite infoskript.de viele Programme in Java dokumentiert.