Ausgabe 24, März 1999
Seit das Relais-Interface in CompaS 22 vorgestellt wurde, haben es zahlreiche Anwender in verschiedenen Programmiersprachen verwendet. Für manchen ist jedoch der erste Anfang nicht leicht. Hier soll deshalb ein Beispielprogramm in Turbo Pascal gezeigt werden.
Grundlagen
Für die Ansteuerung in Turbo Pascal benötigt man zunächst einen Zugang (Basisprozeduren) zur seriellen Schnittstelle. Hier wurde von einem Programmbeispiel zum CompuLAB [1] ausgegangen. Zu beachten ist allerdings, daß das Relais-Interface mit 9600 Baud arbeitet. Die Baudrate und alle anderen Parameter werden in der INIT-Prozedur festgelegt. Zusätzlich wird nur noch die SENDE-Prozedur benötigt, weil das Interface keinerlei Rückmeldung benötigt.
Ansteuerung
Das Programm RELAIS.PAS steuert ein Interface über die Schnittstelle COM2 an. Die Geräteadresse nach der Auslieferung des Geräts ist 1. Das Programm verwendet die Prozedur AUSGABE zur Realisierung eines einfachen Lauflichts. Außerdem wird über PROGRAMMSTOP sichergestellt, daß kein autonomes Programm im Interface aktiv ist.
Alle speziellen Ansteuerprozeduren zum Relais-Interface senden fünf Bytes an das Gerät. Als erstes wird ein ESC-Byte (27) gesendet. Dann folgt die Geräte-Adresse. Das dritte Byte ist ein Interface-spezipifisches Kommando. Alle Kommandos wurden bereits in CompaS 22 vorgestellt und befinden sich auch in der Hilfedatei zum Relaisinterface. Die beiden letzten Bytes sind notwendige Parameter oder Füllbytes (0).
Das Listing zeigt die Grundprozeduren und ein Lauflicht-Beispiel
Program Relais; uses DOS, CRT; const COM1: Integer=$03F8; COM2: Integer=$02F8; COM3: Integer=$03E8; COM4: Integer=$02E8; var BA: Integer; procedure Init (COM: Integer); var i, Dummy: Byte; begin BA:= COM; Port[BA+3]:=128; Port[BA+0]:=12; {9600 Baud} Port[BA+1]:=0; Port[BA+3]:=7; {8 Bit, n-Parity, 2 Stopbits} Port[BA+1]:=0; {keine Interrupts} Port[BA+4]:=0; {DTR=0, RTS=0} for i:= 1 to 3 do Dummy:= Port[BA]; {UART leeren} end; procedure Sende (Zeichen:Byte); begin while (Port[BA+5] AND 32)=0 do; {bereit?} Port[BA]:= Zeichen; end; procedure Adresse_zuweisen (Adr: Byte); begin Sende (27); Sende (255); {Senden an alle} Sende (72); {Kommando: ID-Adresse Zuweisen} Sende (Adr); Sende (0); end; procedure Ausgabe (Adr, Dat: Byte); begin Sende (27); Sende (Adr); Sende (64); {Kommando: Direktausgabe} Sende (Dat); Sende (0); end; procedure Programmiere (Adr, EEadr, Dat: Byte); begin Sende (27); Sende (Adr); Sende (66); {Kommando: EEPROM programmieren} Sende (EEadr); Sende (Dat); end; procedure Programmstart_Endlos (Adr: Byte); begin Sende (27); Sende (Adr); Sende (68); {Kommando: Start, endlos} Sende (0); Sende (0); end; procedure Programmstop (Adr: Byte); begin Sende (27); Sende (Adr); Sende (70); {Kommando: Stop} Sende (0); Sende (0); end; procedure Programmstart_Einfach (Adr: Byte); begin Sende (27); Sende (Adr); Sende (74); {Kommando: Start, einfach} Sende (0); Sende (0); end; procedure Lauflicht; begin Ausgabe (1,1); Delay (250); Ausgabe (1,2); Delay (250); Ausgabe (1,4); Delay (250); Ausgabe (1,8); Delay (250); Ausgabe (1,16); Delay (250); Ausgabe (1,32); Delay (250); Ausgabe (1,64); Delay (250); Ausgabe (1,128); Delay (250); end; begin; Init(COM2); Programmstop (1); writeln ('Relais-Interface, ID-Adresse 1'); writeln ('Lauflicht-Test'); repeat Lauflicht until KeyPressed; end.
Steuerprogramm
Ein zweites Beispiel (RELAISST.PAS) demonstriert die Verwendung eines autonomen Steuerprogramms im Relais-Interface. Die erforderlichen Daten werden in das interne EEPROM des Interfaces übertragen. Der prinzipielle Aufbau des internen Programms wird ebenfalls in der Hilfe-Datei erläutert. Jeder Programmschritt wird mit einem Bitmuster und einer Zeit festgelegt. Zusätzlich sind Einstellungen zur verwendeten Zeiteinheit und eine Endemarkierung für die Endlosschleife zu berücksichtigen. Jedes einzelne Byte wird mit der Prozedur PROGRAMMIERE übertragen.
Das Beispiel verwendet zwei Programmschritte mit den Bitmustern 01010101 und 10101010 mit Dauern von jeweils 0,5 s. Die Programmschritte werden in einer Endlosschleife ausgeführt. Das Programm bleibt auch nach dem Trennen der Verbindung zum PC aktiv und startet mit jedem neuen Einschalten des Relais-Interface wieder neu, bis es mit PROGRAMMSTOP abgebrochen wird. Ein laufendes Programm wird übrigens von Direktausgaben nicht abgebrochen, sondern führt diese zusätzlich aus.
Das Listing zeigt die Programmierung eines autonomen Programms.
procedure ProgrammTest; begin ProgrammStop (1); Programmiere (1,2,0); {Zeitbasis Highbyte} Programmiere (1,3,8); {Zeitbasis Lowbyte, 1/2 s} Programmiere (1,4,85); {Bitmuster 1} Programmiere (1,5,1); {1 Zeiteinheit} Programmiere (1,6,170); {Bitmuster 2} Programmiere (1,7,1); {1 Zeiteinheit} Programmiere (1,8,170); {Bitmuster 1} Programmiere (1,9,0); {Ende der Schleife} end; begin; Init(COM2); writeln ('Relais-Interface, ID-Adresse 1'); writeln ('TestProgramm starten'); ProgrammTest; Programmstart_endlos(1); end.
Download
Die Programmbeispiele zeigen den grundlegenden Umgang mit dem Relais-Interface.
Die Umsetzung in weitere Programmiersprachen dürfte damit relativ
einfach sein. Die Beispielprogramme können als Quelltext und als ausführbare
Programme geladen werden (7 KB).