Jugend-Forscht Beitrag 2000 (von A. Härtel)
Destillations-Interface Bausatz - Handbuch
(im Rahmen der Jugend-Forscht-Arbeit)
Destillations-Interface Bausatz
Handbuch
Das fertige Interface (Seite der Spannungsanschlüsse)
Dieses Handbuch wurde während der Teilnahme an dem Wettbewerb Jugend-Forscht 2000 erstellt!
Zu diesem Buch: | Erstellt von Andreas Härtel am 01.02.2000 für den Wettbewerb Jugend Forscht 2000 |
Feedback an: | Andreas Härtel |
Copyright: | ©by Andreas Härtel |
Inhalt
- Hinweis
- Kurzbeschreibung
- Systemanforderungen
- Bauteilliste (Preisliste, benötigte Bauteile)
- Aufbau des Gehäuses
- Aufbau des Temperatursensors
- Erklären der Schaltung
- Schaltplan
- Planen des Platinenlayouts
- Platinenlayout
- Uuml;bertragen des Layouts auf die Platine
- Bauteile einsetzen
- Die Schnittstelle
- Belegungstabelle der Schnittstelle (LPT)
- Verwenden der Software
- Software selbst erstellen
- Anwendungsmöglichkeiten
- Lieferumfang
- Beschreibung der Bauteile
- Skizze des Gehäuses
- Quelltext des Steuerprogramms
- Die Unit Interfac
- Glossar
Hinweis
Dieses Handbuch wurde als Teilbeitrag zu dem Wettbewerb Jugend-Forscht 2000 erstellt. Der Autor übernimmt keine Haftung für Schäden, die durch dieses Handbuch, die darin enthaltenen Hinweise oder die Software verursacht werden. Ebenso sind Fehler nicht auszuschließen.
Dieses Dokument ist eine minimale Version und kann jederzeit erweitert werden. Informationen über eventuelle Updates sind unter anderem im Internet unter http://www.anno1982.de zu erhalten.
Jede Art von Feedback, dass heißt, sowohl konstruktive Kritik, als auch Verbesserungsvorschläge oder Ähnliches, sind herzlich willkommen.
Kurzbeschreibung
Dieses Handbuch soll beim Aufbau eines Interfaces helfen, mit welchem der Computer den Vorgang einer Destillation regeln kann.
Es enthält Schaltpläne, Fotos, Folien und viele Tips, sowie die Software zum Steuern des Interfaces. Außerdem bietet es die Möglichkeit an, eine eigene Steuersoftware zu programmieren oder eigene Platinenlayouts zu entwerfen.
Dieses Buch eignet sich besonders für Schulen. Mit seiner Hilfe ist es möglich, einen Unterricht anhand von praktischen Beispielen durchzuführen, die Arbeit in (Projekt-)Gruppen zu fördern und an einem Tag der offenen Tür naturwissenschaftlich interessierte Schüler zu werben.
Systemanforderungen
- PC mit paralleler, bidirektionaler Schnittstelle (LPT)
- Rundkolben
- Heizkissen
- Zwei Stative
- Liebigkühler
- DOS oder Windows als Betriebssystem
- Werkzeug, um den Bausatz aufzubauen (Lötkolben, Laubsäge, Bohrer, Seitenschneider, etc.)
Bauteilliste
Zum Aufbau des Interfaces können entweder die beschriebenen Bauteile verwendet werden, oder aber Bauteile nach eigenem Ermessen eingekauft werden. Der Vorteil bei der Verwendung der vorgegebenen Bauteile liegt in der Übereinstimmung der Maße und der Funktionen der einzelnen Komponenten mit diesem Handbuch. Es ist aber generell nicht verkehrt, von diesen Vorgaben abzuweichen und selbst ein wenig zu forschen.
Diese Liste enthält Artikelbezeichnungen und Bestellnummern von Bauteilen, die zum Aufbau dieses Bausatzes notwendig sind.
Die Bauteile dieser Liste sind bei dem Elektronik - Fachgeschäft "Conrad Electronic" zu erhalten.
Zusätzlich benötigte Komponenten:
- Einadrige Litze
- Einadriges 220V Kabel für max. 2,5A
- 4 Senkkopfschrauben mit Muttern, Länge 10mm, f 3mm
- Unterlegscheiben, f 3,1mm
- Selbstschneidende Schrauben, Länge ca. 8mm
Aufbau des Gehäuses
Beim Aufbau des Gehäuses muß im wesentlichen darauf geachtet werden, dass die Schaltung des Interfaces noch hineinpasst. Um dies sicherzustellen, wird empfohlen, das in der Bauteilliste beschriebene Gehäuse zu verwenden. Es wirkt sich jedoch nicht negativ auf die Funktion des Interfaces aus, andere Gehäuse oder Bauteile zu verwenden.
In dem Gehäuse müssen Öffnungen für die Spannungsversorgung, den Spannungsausgang, den Anschluß des Temperatursensors und die 25 pol. Buchse für den Anschluß des Rechners vorhanden sein. Da diese nicht vorhanden sind, ist es notwendig, sie in das Gehäuse einzuarbeiten. Am besten ist dies mit einer Laubsäge zu bewerkstelligen.
Beim Kauf eines anderen Gehäuses muß darauf geachtet werden, dass nach Möglichkeit Befestigungsvorrichtungen für die Platine zur Verfügung stehen. Ansonsten wird es schwierig, diese zu befestigen.
(Abmessungen siehe Seite 15)
Aufbau des Temperatursensors
Der Temperatursensor muß zuerst an ein zweiadriges Kabel angelötet werden. Dieses Kabel wird dann mit dem Sensor zuletzt durch einen Schrumpfschlauch gezogen, der ca. 10 cm lang sein sollte (so lang, dass der Teil des Kabels geschützt ist, der sich später im Kolben befindet), bis der Sensor nur noch ein kleines Stückchen aus dem Schlauch herausragt; die Anschlüsse des Bauteils sollten nicht mehr zu sehen sein. Nun muß der Schrumpfschlauch durch Wärme zum Schrumpfen gebracht werden, z.B. mit einem Heißluftföhn. Der Kopf des Sensors kann nun durch Bepinseln mit flüssigem Plastikkleber (z.B. von Revell) noch extra gesichert werden; dies sollte an sich aber nicht mehr notwendig sein.
Die andere Seite des zweiadrigen Kabels wird dann an einen Klinkenstecker angelötet, der später an das Interface angesteckt werden kann.
Bei der Wahl des Schrumpfschlauches sollte darauf geachtet werden, dass der Schlauch bis zu knapp über einhundert Grad Celsius belastbar ist. Diese Eigenschaft hat zum Beispiel der in der Bauteilliste aufgeführte Schrumpfschlauch.
Erklärung der Schaltung
Die elektronische Schaltung, aus der das Interface besteht, enthält im wesentlichen drei Komponenten. Die erste Komponente stellt die Spannungsversorgung dar, die eine möglichst gute Gleichspannung von fünf Volt erstellt. Die zweite Komponente stellt den elektronischen Schalter für den Spannungsausgang des Heizkissens dar, der im wesentlichen aus einem Optokoppler und einem Relais besteht. Dabei schaltet der Optokoppler auf Befehl des Rechners das Relais ein oder aus. Die dritte und letzte Komponente ist schließlich die Temperaturmessung, oder auch der Analog/Digital-Wandler. Hier wird der Widerstand des Temperatursensors gemessen und in einen Wert zwischen 0 und 255 (1 Byte) umgewandelt. Diese Information wird dann an den Rechner weitergeleitet.
Um weitere Informationen über den Aufbau des Interfaces zu erhalten, kann auf den beiliegenden Datenblättern der Bauteile nachgelesen werden oder die schriftliche Arbeit über diesen Beitrag zu Jugend Forscht zur Hilfe gezogen werden. Diese Arbeit ist unter anderem im Internet auf der Homepage http://www.anno1982.de einzusehen.
Hier ist der zu dem Interface passende Schaltplan abgebildet.
Planen des Platinenlayouts
Wenn ein Schaltplan für eine Schaltung vorliegt, so ist es eine komplizierte Aufgabe, ein Platinenlayout zu entwerfen. Auch bei diesem Punkt gibt es wieder die Möglichkeit des selbständigen Arbeitens, ansonsten kann das beiliegende Layout verwendet werden.
Bei einem Platinenlayout ist im wesentlichen darauf zu achten, dass die Leiterbahnen nicht zu dünn sind; sie müssen immer der Leistung des fließenden Stroms angepasst sein. Außerdem ist darauf zu achten, dass sich möglichst wenig Leiterbahnen kreuzen, da in einem solchen Fall eine Drahtbrücke einzusetzen ist. Und um so mehr Drahtbrücken verwendet werden, um so komplizierter und unübersichtlicher wird die Schaltung.
Hier ist das Platinenlayout des Bausatzes abgebildet.
Übertragen des Layouts auf die Platine
Liegt ein fertiges Platinenlayout vor, so muß dieses auf die Platine übertragen werden. Für diesen Vorgang gibt es mehrere Möglichkeiten!
Zum einen kann eine Platine mit vorgegebenem Lochraster verwendet werden. Diese hat den Vorteil, dass man während dem Einsetzen der Bauteile noch Änderungen am Layout vornehmen kann, und keine Löcher in die Platine bohren muß. Die Nachteile sind aber die Verdrahtung der einzelnen Bauteile über längere Strecken und das vorgegebene Raster, an welches man gebunden ist. Die elegantere Methode ist es deshalb, das Layout auf eine vollkommen mit Kupfer beschichtete Platine einzuätzen. Dazu sind allerdings einige weitere Arbeitsschritte notwendig, die im Endeffekt aber viel einfacher und auch schneller zu erledigen sind, als die erste Methode.
Als erstes muß das Layout auf die Kupferschicht der Platine übertragen werden. Entweder kann es mit einem wasserfesten Stift mühselig abgezeichnet werden, oder aber mit Hilfe der Fototechnik auf die Platine übertragen werden. Dazu ist es notwendig, eine fotobeschichtete Platine zu verwenden, wie sie in der Bauteilliste aufgeführt ist. Diese muß dann mit ultraviolettem Licht belichtet werden (eine entsprechende Glühbirne ist in der Bauteilliste aufgeführt, es muß jedoch auf die Leistung geachtet werden, da nicht jede Fassung 250W aushält), indem man zum Beispiel die beiliegende Folie mit dem Layout verwendet. Beim Belichten sollte es möglichst dunkel sein, und nur eine schwache, gelbe Lichtquelle verwendet werden.
Die Belichtungsdauer ist je nach verwendeter Lichtquelle unterschiedlich. Am besten ist es daher, erst einmal einen Test durchzuführen, wie das entsprechende fotobeschichtete Material auf die Lichtquelle reagiert. Zu diesem Zweck kann beispielsweise ein Stück der Platine abgetrennt werden, und nach und nach belichtet werden; man entfernt nach und nach ein Stückchen der Schutzfolie, markiert die jeweiligen Stellen und merkt sich den Zeitpunkt des Vorgangs. Dann entwickelt man die Platine so lange in einem angesetzten Entwicklerbad (Lösungsverhältnis ist bei den jeweiligen Entwicklern beschrieben) so lange, bis eine Schicht gut entwickelt ist. Es läßt sich nun anhand der notierten Zeitpunkte und der Markierungen auf der Platine leicht die richtige Belichtungszeit errechnen. Außerdem weiß man auch direkt die benötigte Entwicklungszeit, da man diese bei der Entwicklung der Test-Platine stoppen kann.
Wichtig ist es, auch bei der Entwicklung möglichst wenig Licht zu verwenden. Ist die Platine fertig entwickelt, so muß sie unter fließendem Wasser abgewaschen werden.
Im nächsten Arbeitsschritt muß das Layout in die Kupferschicht der Platine eingeätzt werden. Dazu ist das in der Bauteilliste angegebene Ätzmittel zu verwenden, dessen Mischungsverhältnis auf der Verpackung angegeben ist. Die Platine muß solange behandelt werden, bis alles Kupfer weggeätzt ist, welches nicht benötigt wird. Danach ist die Platine abzuwaschen.
Zum Schluß müssen dann noch die Löcher mit einem möglichst dünnen Holzbohrer (0,5 - 1,0 mm) gebohrt werden. Bei der Wahl des Bohrers ist auf die Dicke der Anschlüsse der einzusetzenden Bauteile zu achten.
Bauteile einsetzen
Das Einsetzen der Bauteile ist dann nicht mehr allzu schwer. Sie werden nach dem Layout an die richtigen Positionen gesteckt und dann festgelötet, wobei am besten zuerst die ICs, dann die Widerstände und Kondensatoren, dann die Transistoren und erst zum Schluß das Relais und der Transformator eingesetzt werden. Beim Löten der ICs ist darauf zu achten, dass diese nicht zu heiß werden. Es ist daher empfehlenswert, passende IC-Fassungen zu verwenden.
Gelötet wird immer mit wenig Lötzinn, wobei erst die Leiterbahn erwärmt wird und dann von der anderen Seite des zu lötenden Drahtes das Lötzinn hinzugefügt wird. Mit ein wenig Übung werden dann schöne Lötstellen entstehen.
Ganz zum Schluß werden dann die Kabel eingesetzt, die später an die Schnittstelle, die Spannungsversorgungen und den Temperatursensor angelötet werden. Die Kabel werden dann erst nach dem Einsetzten der Platine in das Gehäuse mit den zugehörigen Bauteilen verbunden.
Die Schnittstelle
Das Interface ist an die parallele Schnittstelle des Rechners (LPT) anzuschließen. Die beiliegende Liste (LPT Belegung) zeigt, wie die einzelnen Pinne der Schnittstelle belegt sind.
Die erste Spalte stellt einen Vergleich zwischen der 36 pol. Centronics Schnittstelle, welche meistens als Druckereingang dient, und der parallelen Schnittstelle des Rechners dar. Die zweite Spalte zeigt die Stiftnummer der Schnittstelle. Die vierte gibt nun die entsprechende Interruptadresse an, über welche auf diesen Stift zugegriffen werden kann. Dabei steht IRQ1 für die erste Interruptadresse im E/A-Bereich der Schnittstelle (Bsp.: E/A-Bereich: 0378-037F; IRQ1 = 0378).
Die Spalte "Bit" gibt an, über welches Bit der angegebenen Interruptadresse auf den entsprechenden Stift der Schnittstelle zugegriffen werden kann; die Spalte Zahl stellt das Bit als dezimale Zahl dar.
In der nächsten Spalte wird beschrieben, ob das Bit invertiert ist, dass heißt, ob ein von der Software gesetztes Bit dem Zustand EIN am entsprechenden Stift entspricht. Dabei stimmen bei einem invertierten Bit die Einstellungen der Software und der Schnittstelle nicht überein.
In der letzten Spalte wird die Funktion des Stiftes beschrieben. Dabei dienen einige Pinne vom Rechner aus gesehen als Eingänge, andere als Ausgänge und einer als Masse.
Die interne Einstellung "Rechnerintern" muß in jedem Fall gesetzt sein, um eine fehlerfreie Messung zu gewährleisten.
Die Belegungstabelle der parallelen Schnittstelle (LPT)
Verwenden der Software
Die Software ist so ausgelegt, dass sie sich automatisch an den entsprechenden Temperatursensor anpasst. Aus diesem Grund fordert sie den Anwender beim ersten Start des Programmes auf, zwei Temperaturen einzugeben und den Sensor jeweils in ein Medium mit dieser Temperatur zu stecken. Hierfür können zum Beispiel die Raumtemperatur und die Temperatur von kochendem Wasser verwendet werden, wobei die Raumtemperatur mit einem Thermometer nachzumessen ist und die Temperatur von kochendem Wasser 100 °C beträgt. Es ist zu empfehlen, die zwei Temperaturwerte nicht zu nah beieinander zu wählen, da ansonsten die Ungenauigkeit der Messungen zunimmt.
Außerdem muß bei der Kalibrierung des Sensors die Interupt-Adresse der verwendeten parallelen Schnittstelle in dezimaler Schreibweise eingegeben werden. Um diese unter Windows zu ermitteln, kann über die Eigenschaften des Arbeitsplatzes (rechter Mausklick) die Systemeinstellung aufgerufen werden. In dieser können im Gerätemanager unter Schnittstellen die Eigenschaften der entsprechenden Schnittstelle angezeigt werden. Unter Ressourcen muß dann die erste Adresse des E/A-Bereichs notiert werden (Bsp.: E/A-Bereich 0378-037F; die 0378 muß notiert werden).
Sind alle Einstellungen richtig, werden sie als SETUP.INF abgespeichert. Diese Datei muß immer im selben Verzeichnis wie das Programm INTERFAC.EXE liegen.
Es wird dann die normale Oberfläche des Programms angezeigt. Hier sind einige der Buchstaben eingeklammert. Werden diese über die Tastatur eingegeben, so werden die entsprechenden Anweisungen ausgeführt. Es kann nun eine Temperatur eingestellt werden, auf welche die Apparatur die Flüssigkeit erhitzen soll. Danach kann die Destillation dann über die entsprechende Anweisung gestartet werden.
Software selbst erstellen
Es ist auch möglich, eine eigene Steuersoftware zu erstellen. Aus diesem Grund liegt der vorhandenen Steuersoftware eine Unit in der Programmiersprache Turbo-Pascal bei, mit deren Hilfe es erleichtert wird, ein solches Programm zu schreiben (INTERFAC.TPU).
Eine Beschreibung der von der Unit herausgereichten Prozeduren, Variablen und Funktionen liegt diesem Handbuch bei!
Anwendungsmöglichkeiten
Mit der Hilfe von diesem Interface ist es möglich, den Computer Destillationsvorgänge steuern zu lassen. So können zum Beispiel Alkohol oder Essigsäure von Wasser getrennt werden, oder destilliertes Wasser gewonnen werden. Es ist aber auch möglich, ökologische Untersuchungen, wie zum Beispiel Bodenproben oder toxische Analysen durchzuführen.
Tipp für Schulen: An einem Tag der offenen Tür ist es möglich, die Apparatur vorzustellen, und so speziell naturwissenschaftlich interessierte Schüler zu werben!
Lieferumfang
Folgende Medien sind im Lieferumfang des Handbuches enthalten:
- Dieses Handbuch
- Folie mit dem Platinenlayout
- Steuerprogramm für das Interface (INTERFAC.EXE)
- Befehlsbibliothek (Unit) zur Erstellung einer eigenen Steuersoftware (INTERFAC.TPU)
Beschreibung der Bauteile
Nachfolgend werden die in dem Bausatz verwendeten Komponenten beschrieben, welche nicht so einfach zu verstehen sind. Es ist jeweils das entsprechende Schaltzeichen des Bauteils angegeben. Die Anschlüsse sind beschriftet und beschrieben.
Elektrolyt-Kondensator |
|
||||
Transformator |
|
||||
Transistor (npn) |
|
||||
Gleichrichter |
|
||||
Festspannungsregler |
Die Spannung am Eingang des Bauteils sollte ca. 120% der Ausgangsspannung betragen. |
||||
Relais |
|
||||
Optokoppler |
|
||||
Analog/Digital-Wandler |
|
Die Eingangsspannung, die zwischen den Messeingängen anliegt, wird dann mit dem gesamten Messbereich verglichen. Das Ergebnis dieses Vergleichs ist dann an den Ausgängen abzunehmen. Läge z.B. am Messeingang (+) des oberen Beispiels eine Spannung von 3,34V an, so würde eine Spannung von 0,34V an den Messeingängen gemessen. Diese Spannung würde dann mit der Gesamtgröße des Messintervalls verglichen, d.h. es würde bestimmt, wieviel Prozent die gemessene Spannung von der Messintervallgröße, also der doppelten Referenzspannung, ausmacht; in diesem Beispiel beträgt die gemessene Spannung 34% des Messintervalls. Dieser Wert wird dann in eine Zahl zwischen 0 und 255 (1 Byte) umgewandelt und ausgegeben; im obigen Beispiel würde also ein Wert von 87 (86,7), oder 34% von 255, ausgegeben.
Skizze des Gehäuses
Die folgenden Skizzen beziehen sich auf das in der Bauteilliste aufgeführte Gehäuse.
Anschlußseite für Schnittstelle und Temperatursensor
Anschlußseite für Spannungsversorgung
Alle Angaben in mm
Quelltext des Steuerprogramms
Der hier abgedruckte Quelltext dient ausschließlich dem Zweck, ein eigenes Programm besser programmieren zu können. Das Programm ist in der Programmiersprache Turbo-Pascal verfasst. Falls sich Fragen zu diesem Programmcode ergeben, so können diese an den Autor gerichtet werden (siehe Seite 2).
PROGRAM Interfacesteuerung; { Copyright by Andreas Härtel, 23.01.2000 } USES NewDelay, Crt; CONST DateiName = 'SETUP.INF'; CONST Datum = '23.01.2000'; CONST R1 = 1200; R2 = 1200; R3 = 1000; R4 = 1200; R5 = 68; TYPE SetupInf = RECORD Temp1: Real; Byte1: Real; Temp2: Real; Byte2: Real; PortAddr: Integer; END; VAR Setup: SetupInf; VAR P1: Integer; P2: Integer; P3: Integer; FUNCTION Digital(Gesetzt: Byte; Max: Integer): Real; VAR Summe: LongInt; I: Integer; BEGIN Summe:= 0; FOR I:= 1 TO Max DO BEGIN Port[P3]:= 2 + Gesetzt; Port[P3]:= 0 + Gesetzt; Inc(Summe, Port[P1]); Delay(1); END; Digital:= Summe / Max; END; PROCEDURE Justieren; VAR Byte1, Byte2: Real; Temp1, Temp2: Real; PortAddr: Integer; Key: Char; Datei: File; BEGIN ClrScr; Write('Damit das Interface korrekt arbeiten kann, müssen Sie die Port '); Write('Adresse Ihrer paralellen Schnittstelle (meistens LPT1) angeben, '); Write('an die das Interface angeschlossen ist. Geben Sie diese Adresse,'); Write('die Sie in der Systemsteuerung nachschauen kiönnen oder mit an- '); Write('deren Programmen ermitteln können, in dezimaler Schreibweise '); Write('ein! '); Write('Die Port Adressen (IRQ) sind meistens in der Hexadezimalen '); Write('Schreibweise angegeben (Ziffern von 0 bis F, 16er System). Rech-'); Write('nen Sie diese Zahl ins Dezimalsystem (10er System) um und geben '); Write('Sie sie unten an! '); Write('(Wenn Sie die Adresse nicht wissen, können Sie den Setup Vorgang'); Write('mit "Esc" abbrechen und später erneut ausführen!) '); WriteLn; IF ReadKey = #27 THEN Exit; Write ('Port Adresse (IRQ): '); ReadLn(PortAddr); P1:= PortAddr + 0; P2:= PortAddr + 1; P3:= PortAddr + 2; Port[P3]:= 32; ClrScr; Write('Sie müssen den Temperaturfühler an Ihrem Interface noch kali- '); Write('brieren. Zu diesem Zweck brauchen Sie zwei Temperaturen, bei de-'); Write('nen das Programm die Werte misst, um danach eine Formel für Ihr '); Write('Interface zu bestimmen. '); Write('Sie können irgendwelche Temperaturen benutzen! Am besten wäre es'); Write('jedoch, Sie nähmen zwei, die weit auseinander liegen, da die Un-'); Write('genauigkeit dann nachlässt. '); Write('Vorschlag: Sie könnten die Temperaturen 0°C und 100°C oder 20°C '); Write(' und 100°C wählen. Für 0°C könnten Sie Eiswasser be- '); Write(' nutzen (war bei mir relativ ungenau), für 20°C ein- '); Write(' fach Raumtemperatur (diese können Sie auch nachmes- '); Write(' sen) und für 100°C können Sie Wasser zum kochen '); Write(' bringen und beim Kochen (nicht mit Wasserkocher auf- '); Write(' gekochtes sondern im besser im Topf) den Temperatur- '); Write(' fühler in das Wasser halten. '); Write('Hinweis: Je nach Sensor ist der Temperaturbereich verschieden! '); Write(' Er liegt ca. zw. -20°C und +110°C. '); Write ('Weiter mit "Return" ... '); REPEAT UNTIL ReadKey = #13; ClrScr; Write('Geben Sie jeweils eine Temperatur ein und bestätigen Sie diese, '); Write('wenn der Temperatursensor diese Temperatur angenommen hat (Kom- '); Write('mata als Punkte schreiben: '); WriteLn; Write ('Temperatur 1: '); ReadLn(Temp1); Write ('Bestätigen Sie, dass der Sensor ', Temp1:5:1, '°C angenommen hat ... '); REPEAT UNTIL ReadKey = #13; WriteLn; Byte1:= Digital(32, 5000); WriteLn; Write ('Temperatur 2: '); ReadLn(Temp2); Write ('Bestätigen Sie, dass der Sensor ', Temp2:5:1, '°C angenommen hat ... '); REPEAT UNTIL ReadKey = #13; WriteLn; Byte2:= Digital(32, 5000); IF Byte2 = Byte1 THEN BEGIN Justieren; Exit; END; Setup.Temp1:= Temp1; Setup.Byte1:= Byte1; Setup.Temp2:= Temp2; Setup.Byte2:= Byte2; Setup.PortAddr:= PortAddr; Assign(Datei, DateiName); Rewrite(Datei, SizeOf(SetupInf)); BlockWrite(Datei, Setup, 1); Close(Datei); END; PROCEDURE InitScreen; BEGIN TextBackground(0); TextColor(7); ClrScr; WriteLn('Destillier - Programm', 'Düsseldorf, den ':49, Datum); GotoXY(3, 24); Write(#184, ' by Andreas Härtel', '--> Abbruch mit "Esc"':56); Window(7, 3, 74, 22); TextBackground(7); TextColor(0); ClrScr; Window(9, 4, 72, 21); WriteLn('Einzustellender Temperaturbereich: 20°C - 100°C'); WriteLn; WriteLn('Eingestellte (T)emperatur: ---°C'); WriteLn; WriteLn; WriteLn('Temperatur(s)ensor neu kalibrieren ... '); WriteLn('(A)nfang der Destillation ... '); WriteLn; WriteLn; WriteLn; WriteLn('Status: Es findet keine Destillation statt!'); WriteLn; WriteLn; WriteLn(' Aktuelle Temperatur °C'); WriteLn(' Heizkissen ausgeschaltet'); END; PROCEDURE ShowDestillationsStatus(Status: Byte); BEGIN GotoXY(1, 6); CASE Status OF 1: Write('Temperatur(s)ensor neu kalibrieren ... '); ELSE Write(' '); END; GotoXY(1, 7); CASE Status OF 1: Write('(A)nfang der Destillation ... '); 2: Write('(U)nterbrechen der Destillation ...'); 3: Write('(B)eenden der Destillation ... '); END; GotoXY(11, 11); CASE Status OF 1: Write('Es findet keine Destillation statt!'); 2: Write('Die Destillation findet statt! '); 3: Write('Die Destillation ist beendet! '); END; END; PROCEDURE ShowTemp(Temp: Real); BEGIN GotoXY(41, 14); Write(Temp:5:1); END; PROCEDURE ShowHeizkissenStatus(Status: Byte); BEGIN GotoXY(41, 15); CASE Status OF 0: Write('ausgeschaltet'); 1: Write('eingeschaltet'); END; END; FUNCTION Num(Text: Char): Byte; VAR Code, Zahl: Integer; BEGIN Val(Text, Zahl, Code); Num:= Zahl; END; FUNCTION GetUserTemp: Real; VAR UserTemp: Byte; Key: Char; BEGIN GotoXY(28, 3); Write(' '); UserTemp:= 0; REPEAT GotoXY(28, 3); IF UserTemp > 0 THEN Write(UserTemp); IF UserTemp < 100 THEN Write(' ', #8); Key:= ReadKey; CASE Key OF '0'..'9': IF UserTemp * 10 + Num(Key) <= 100 THEN UserTemp:= UserTemp * 10 + Num(Key) ELSE BEGIN Sound(200); Delay(100); NoSound; END; #8: UserTemp:= UserTemp DIV 10; END; UNTIL Key = #13; IF UserTemp < 20 THEN UserTemp:= 0; GotoXY(28, 3); IF UserTemp = 0 THEN Write('---'); IF (UserTemp < 10) AND (UserTemp > 0) THEN Write(' '); IF (UserTemp < 100) AND (UserTemp > 0) THEN Write(' '); IF UserTemp > 0 THEN Write(UserTemp); GetUserTemp:= UserTemp; END; VAR Key : Char; PSet : Byte; Temp : Real; UserTemp : Real; HeizkissenStatus : Byte; DestillationsStatus: Byte; PROCEDURE Init; VAR Datei: File; BEGIN Assign(Datei, DateiName); {$I-} Reset(Datei, SizeOf(SetupInf)); IF IOResult <> 0 THEN BEGIN Justieren; Reset(Datei, SizeOf(SetupInf)); END; {$I+} BlockRead(Datei, Setup, 1); Close(Datei); InitScreen; P1:= Setup.PortAddr + 0; P2:= Setup.PortAddr + 1; P3:= Setup.PortAddr + 2; PSet:= 32; Port[P3]:= PSet; UserTemp:= 0; HeizkissenStatus:= 0; DestillationsStatus:= 1; END; BEGIN Init; REPEAT ShowDestillationsStatus(DestillationsStatus); Port[P3]:= PSet; WITH Setup DO Temp:= (Temp2 - Temp1) / (Byte2 - Byte1) * Digital(PSet, 100) + Temp1 - (Temp2 - Temp1) / (Byte2 - Byte1) * Byte1; ShowTemp(Temp); Key:= #32; IF KeyPressed THEN Key:= ReadKey; CASE UpCase(Key) OF 'T': UserTemp:= GetUserTemp; 'S': IF DestillationsStatus = 1 THEN BEGIN Justieren; InitScreen; GotoXY(28, 3); IF UserTemp = 0 THEN Write('---'); IF UserTemp > 0 THEN Write(UserTemp:3:0); END; 'A': IF (DestillationsStatus = 1) AND (UserTemp >= 20) AND (UserTemp <= 100) THEN DestillationsStatus:= 2; 'U': IF DestillationsStatus = 2 THEN DestillationsStatus:= 1; 'B': IF DestillationsStatus = 3 THEN Key:= #27; END; IF (DestillationsStatus = 1) AND (PSet MOD 8 DIV 4 = 1) THEN Dec(PSet, 4); IF DestillationsStatus = 2 THEN BEGIN IF (Temp < UserTemp) AND (PSet MOD 8 DIV 4 = 0) THEN Inc(PSet, 4); IF (Temp > UserTemp) AND (PSet MOD 8 DIV 4 = 1) THEN Dec(PSet, 4); END; ShowHeizkissenStatus(PSet MOD 8 DIV 4); UNTIL Key = #27; GotoXY(50, 10); Write('Fertig!':18); WHILE KeyPressed DO Key:= ReadKey; Port[P3]:= 0; Window(1, 1, 80, 25); TextBackground(0); TextColor(7); ClrScr; END.
Anmerkung: | Die Unit "NewDelay" wird nur auf schnelleren Rechnern unter einigen Versionen von Turbo-Pascal benötigt. Sie ersetzt die Routine "Delay", die bei schnelleren Rechnern zu einem Runtime-Error 100 führt. Sie ist ebenfalls im Internet erhältlich (siehe Seite 3). |
Die Unit Interfac
Diese Unit muß ins Standard-Unit-Verzeichnis kopiert werden, und kann dann wie die Standard-Units mit dem USES-Befehl eingebunden werden. Sie reicht folgende Variablen, Funktionen und Prozeduren heraus:
SetupInf = RECORD Temp1: Real; Byte1: Real; Temp2: Real; Byte2: Real; PortAddr: Integer; END;Im Format dieses Records werden die Kalibrierungsdaten in die Setup Datei geschrieben. Außerdem werden sie in diesen Record eingelesen.
FUNCTION ExistFile(FileName: String): Boolean;Diese Funktion überprüft das Vorhandensein der Datei mit dem Namen FileName. FileName darf aus maximal 8 Zeichen sowie dem Punkt und einem Dateikürzel bestehen.
PROCEDURE ReadSetupData(FileName: String; VAR SetupData: SetupInf);Diese Prozedur ließt die Setup-Informationen aus der Datei FileName und speichert sie in der Variablen SetupData ab.
PROCEDURE WriteSetupData(FileName: String; SetupData: SetupInf);Diese Prozedur speichert den Inhalt der Variablen SetupData in der Datei FileName. Ist bereits eine Datei dieses Namens vorhanden, so wird sie ersetzt; ist noch keine Datei vorhanden, so wird eine neue erstellt.
PROCEDURE SetPort(PortAddr: Integer; PortValue: Byte);Diese Prozedur setzt die angegebene Interruptadresse PortAddr auf den Wert PortValue. Diese Prozedur wird z.B. bei der Kommunikation mit einer Schnittstelle benötigt.
FUNCTION GetPort(PortAddr: Integer): Byte;Diese Funktion ließt den Wert der Interrupt-Adresse PortAddr und gibt diesen zurück. Diese Funktion wird z.B. für die Kommunikation mit einer Schnittstelle verwendet.
FUNCTION MakeByte(Character: Char): Byte;Diese Funktion wandelt das Zeichen Character in einen numerischen Wert um und gibt diesen zurück.
FUNCTION ReadFrom(X, Y: Word): Real;Diese Funktion ließt einen numerischen Wert von der Position X, Y des Bildschirms ein und gibt diesen zurück.
PROCEDURE WriteTo(X, Y: Word; WriteText: String);Diese Funktion gibt die Zeichenfolge WriteText an der Position X, Y des Bildschirmes aus.
FUNCTION MakeString(Value: Real; Nach: ShortInt): String;Diese Funktion wandelt den numerischen Wert Value in eine Zeichenfolge mit Nach Nachkommastellen um und gibt diese zurück.
FUNCTION MakeDec(Hex: String): LongInt;Diese Funktion wandelt eine Zeichenfolge, welche einen hexadezimalen Wert darstellt, in einen numerischen dezimalen Wert um und gibt diesen zurück.
PROCEDURE ExitProgramm;Diese Prozedur bricht das Programm mit sofortiger Wirkung ab. Diese Prozedur kann z.B. benutzt werden, wenn eine benötigte Datei nicht vorhanden ist.
Sollten sich im Bezug auf diese Unit und die darin enthaltenen Parameter Fragen ergeben, so können diese an den Autoren dieses Buches gerichtet werden (siehe S. 2). Ebenso ist Feedback jeder Art immer willkommen!
© A. Härtel (2017)