9 Anschuß von Magnetkartengeräten



Nachdem die Grundlagen der Magnetkarten und -geräte diskutiert worden sind, widmen wir uns den Anschlußmöglichkeiten von Lese- und Schreibgeräten. Zuerst wird der einfache Anschluß eines Magnetkartenlesers an die Druckerschnittstelle eines PCs besprochen. Danach folgt die Beschreibung, wie ein Magnetkartencodierer an der seriellen Schnittstelle eines Computers angeschlossen wird. Der Aufbau und die Befehle des dazu notwendigen Kontrollers werden ausführlich besprochen. Zu jedem Befehl wird eine kurze Programmumsetzung angegeben. In einem weiteren Abschnitt wird eine Interface-Schaltung zwischen einem Magnetkartenleser und der senellen Schnittstelle vorgeschlagen. Mit dieser ist es möglich eine Spur der Magnetkarte zu lesen und seriell zu senden. Damit ist man dann nicht mehr nur auf einen PC angewiesen, sondern kann die gelesenen Daten auch z.B. zu einer Workstation senden. Als ein weiteres Beispiel wird eine Zutnttskontrolle vorgestellt. Diese arbeitet als ,,stand-alone" Lösung. Als Identifikationskarten können bereits vorhandene Magnetkarten benutzt werden, da das Gerät einen Lernmodus für zugangsberechtigte Karten besitzt. Beide Schaltungen erfordern nur wenige Bauteile und sind leicht nachzubauen.



Die einfachste Art einen Magnetkartenleser anzuschließen ist, eine bereits vorhandene Schnittstelle am Computer auszunutzen. Bei PCs bieten sich die parallelen Druckerschnittstellen an. Zusätzlich benötigt man dann noch ein Programm zum Lesen der Daten, die vom Lesegerät bereitgestellt werden. Als Magnetkartenleser haben wir für diese Anwendung den Durchzugleser der HNR-Sene von Omron gewählt. Dieser bietet einige Vorteile. Die Elektronik ist in CMOS-Technologie ausgeführt, wodurch die Stromaufnahme nur 6 mA beträgt, die durch die Datenleitungen der Druckerschnittstelle bereitgestellt werden können. Der Lesekopf läßt sich durch das Lösen von Schrauben auf jede beliebige ISO-Spur einstellen. Ferner kann die Bit-Dichte über einen Schiebeschalter zwischen 75 bpi und 210 bpi eingestellt werden (siehe Abschnitt 7.1).
Zur Erzeugung der Versorgungsspannung setzt das Leseprogramm die Datenleitungen DO bis D3 auf high. Diese Datenleitungen werden über vier Dioden zusammengelegt. Die Dioden sollten eine gennge Schleusenspannung haben, damit eine genügend hohe Spannung für den Magnetkartenleser zur Verfügung steht. Bewährt haben sich die Schottky-Dioden des 5ps BAT-42. Sollte ein anderes Gerät angeschlossen werden, kann eine externe Stromversorgung notwendig werden. Die Ausgänge CLS, RCP und RDP des Magnetkartenlesers werden mit den Statusleitungen der Druckerschnittstelle verbunden, da diese, im Gegensatz zu den Datenleitungen, mit Sicherheit bidirektional sind. An den Leitungen befinden sich noch pull-up Widerstände, die bei dem gewählten Magnetkartenleser nicht erforderlich sind, da dieser komplementäre Ausgangsstufen hat. Möchte man aber ein Gerät mit open-collector Ausgängen benutzen, sind diese Widerstände erforderlich (Abbildung 9-1; Tabelle 9-1).

Abb.9-1

Abb. 9-1:Schaltplan zum Anschluß des HNR-Magnetkartenlesers an die parallele Druckerschnittstelle


Halbleiter
D1...D4 Schottky-Diode BAT-42
Sonstiges
Sub-D-Stecker 25pol. male Durchzugleser Omron 3S4YR-HNR4
Widerstände
R1...R3 10 k Ohm
Tabelle 5-2:
Werte für den Widerstand R1, und die Kondensatoren C1 und C2 für unterschiedliche Bit-Dichten

Das Programm zum Lesen der Daten hat folgende Aufgabe: Es überwacht die Acknowledge (Ack)-Leitung der Druckerschnittstelle, um einen Wechsel des RCP-Signals zu erfassen. Bei einer abfallenden Flanke (negative Logik beachten!) liegen am Ausgang RDP gültige Daten, die vom Programm über die Busy-Leitung übernommen werden. Das geschieht solange der Ausgang CLS auf,,low" liegt, was an der PE (Paperend)-Leitung überwacht wird. Sind alle Datenbits eingelesen, wird nach den Start- und Stopzeichen gesucht. Anschließend werden die eingelesenen Bits nach dem 5- bzw. 7-Bit Zeichensatz decodiert, das Paritäts-Bit gepriift und in ASCII-Zeichen umgewandelt. Auf dem Bildschirm erscheinen dann die Daten der Magnetspur in Klarschrift.
Das folgende Programm ,,LESEN.PAS" erledigt die hier beschriebenen Aufgaben. Durch die Übergabe von Parametern kann es sowohl die 5-Bit- als auch die 7-Bit-Codierung lesen. Das Lesen selbst erfolgt unabhängig von der Bit-Dichte. Die Adresse der Druckerschnittstelle kann dem Programm ebenfalls übergeben werden. Es ist in Turbo Pascal 6.0 geschrieben und kann leicht für eigene Bedürfnisse modifiziert werden.

PROGRAM lesen;
{***************************************************************
 * Programm zum Auslesen von Magnetkarten nach ISO 3554        *
 * Programmierer: Francesco P. Volpe und Safinaz Volpe         *
 * Version 0.99                                                *
 * Der Magnetkartenleser OMRON HNR wird an die Drucker-        *
 * schnittstelle angeschlossen.                                *
 * Die Belegung lautet:                                        *
 * Magnetkartenleser           Druckerschnittstelle            *
 *           RDP (4)  <---->   Busy                            *
 *           RCP (5)  <---->   Ack                             *
 *           CLS (6)  <---->   PE                              *
 ***************************************************************}

{$N- G- X+}
USES Crt, Dos;

CONST Max                 = 3000;
      Startzeichen5       : BYTE    = $1A;  {  11010 Startzeichen rckw}
      Stopzeichen5        : BYTE    = $1F;  {  11111 Stopzeichen rckw}
      Startzeichen7       : BYTE    = $51;  {1010001 Startzeichen rckw}
      Stopzeichen7        : Byte    = $7C;  {1111100 Stopzeichen rckw}
      Bitcode5            : BYTE    = $30;  {Offset zur ASCII-Umwandl}
      Bitcode7            : BYTE    = $20;  {Offset zur ASCII-Umwandl}
      Lpt1                : INTEGER = $0378;{Basisadr. 1. Druckerschn.}
      Lpt2                : INTEGER = $0278;{Basisadr. 2. Druckerschn.}
      Herc                : INTEGER = $03BC;{Basisadr. Herculeskarte}
      Lpt1_status         : INTEGER = $0379;
      Lpt2_status         : INTEGER = $0279;
      Herc_status         : INTEGER = $03BD;
VAR   i                   : LONGINT;
      j                   : INTEGER;
      ch                  : CHAR;
      bit_anzahl,
      parity_err,
      start,ende,
      anzahl,
      LPT,LPT_status      : INTEGER;
      s,
      RDP, RCP,
      CLS, CLS_alt,
      import,parity,code,
      zeichenoffset,
      startzeichen,
      stopzeichen         : BYTE;
      clocks,
      databits,data       : ARRAY[1..Max] OF BYTE;
      dec_data            : ARRAY[1..Max] OF CHAR;

PROCEDURE Initialisiere;
{***************************************************************
 * Initialisiert die Schnittstelle in Abh„ngigkeit der         *
 * bergebenen Parameter. Default-Werte sind LPT1 ($378) und   *
 * Codel„nge 5. šber D0 bis D3 'high' wird die Versorgungs-    *
 * spannung des Lesers eingeschaltet.                          *
 ***************************************************************}
BEGIN
  anzahl        := 0;                              {* Default *}
  LPT           := LPT1;
  LPT_status    := LPT1_status;
  startzeichen  := Startzeichen5;
  stopzeichen   := Stopzeichen5;
  code          := 5;
  zeichenoffset := Bitcode5;
  IF ((ParamCount > 0) AND (ParamCount <= 2))  THEN
    FOR i := 1 TO ParamCount DO
      BEGIN
        IF (ParamStr (i) = '378') THEN
          BEGIN
            LPT        :=  LPT1;
            LPT_status :=  LPT1_status;
          END;
        IF (ParamStr (i) = '278') THEN
          BEGIN
            LPT := LPT2;
            LPT_status :=  LPT2_status;
          END;
        IF (ParamStr (i) = '3BC') THEN
          BEGIN
            LPT := Herc;
            LPT_status :=  Herc_status;
          END;
        IF ((ParamStr (i) = 'c5') OR (ParamStr (i) = 'C5')) THEN
          BEGIN
            code :=  5;
            zeichenoffset := Bitcode5;
            startzeichen  := Startzeichen5;
            stopzeichen   := Stopzeichen5;
          END;
        IF ((ParamStr (i) = 'c7') OR (ParamStr (i) = 'C7')) THEN
          BEGIN
            code :=  7;
            zeichenoffset := Bitcode7;
            startzeichen  := Startzeichen7;
            stopzeichen   := Stopzeichen7;
          END;
      END;
  Port[LPT] := $0F;      {* Spannungsversorgung einschalten (D0-D7)*}
END;

PROCEDURE Lieskarte;
{****************************************************************
 * Liest eine Spur der Magnetkarte und schreibt die Bits in das *
 * Feld 'databits'. Zur Kontrolle werden die Clock-Bits in  das *
 * Feld 'clocks' geschrieben.                                   *
 * RDP = Busy-bit => Read Data Pulse                            *
 * RCP = ACK -bit => Read Clock Pulse                           *
 * CLS = PE-bit   => Card Load Signal                           *
 * RCP_alt > RCP  => abfallende Flanke                          *
 * RCP_alt < RCP  => ansteigende Flanke                         *
 ****************************************************************}
VAR RCP_alt : BYTE;
BEGIN
  bit_anzahl :=  0;
  FOR i := 1 TO Max DO BEGIN clocks[i] :=  0; databits[i] :=  0;
  END;
  i :=  0;
  j :=  1;
  RCP_alt :=  1;
  import :=  0;
  CLS := 1;
  REPEAT
    ASM cli END;
    import :=  Port[LPT_status];
    CLS_alt := CLS;
    CLS := (import AND $20) SHR 5; { PE-Bit ausmaskieren }
    RCP := (import AND $40) SHR 6; { ACK-Bit ausmaskieren }
    RDP := (import AND $80) SHR 7; { Busy-Bit ausmaskieren }
    IF RCP_alt > RCP THEN  { auf abfallender Flanke von RCP lesen }
      BEGIN
        clocks[j] := RCP ;
        databits[j] := RDP ;
        RCP_alt :=  RCP;
        Inc (j);
      END
    ELSE
      RCP_alt :=  RCP;
    ASM sti END;
  UNTIL (CLS > CLS_alt);
  bit_anzahl :=  j;
END;

PROCEDURE Findstart;
{***************************************************************
 * Sucht im Feld 'databits[i]' nach dem Startzeichen und       *
 * Stopzeichen.                                                *
 * Die Bitposition des Startzeichens wird in 'start' und       *
 * die Bitposition des Stopzeichens wird in 'ende' gespeichert *
 ***************************************************************}
VAR    bitoffset : INTEGER;
       k         : INTEGER;
CONST  b         : ARRAY[1..7] OF BYTE =(1, 2, 4, 8, 16, 32, 64);
BEGIN
  FOR bitoffset := 1 TO Max DO data[bitoffset]  := 0;
  bitoffset := 1;
  start :=  0;
  ende :=  0;
  REPEAT
    FOR k :=  0 TO code-1 DO
        data[bitoffset] :=  data[bitoffset]+
                            databits[bitoffset+k]*b[code-k];
    IF ((data[bitoffset] = startzeichen) AND (start = 0))  THEN
       start :=  bitoffset;
       Inc (bitoffset);
  UNTIL ((bitoffset >= bit_anzahl) OR (start <> 0));
  bitoffset := bitoffset + code-1;
  REPEAT
    FOR k :=  0 TO code-1 DO
        data[bitoffset] :=  data[bitoffset]+
                            databits[bitoffset+k]*b[code-k];
        IF (data[bitoffset] = stopzeichen)  THEN
           ende :=  bitoffset + code;
           bitoffset := bitoffset + code;
  UNTIL ((bitoffset >= bit_anzahl) OR (ende <> 0)) ;
END;

PROCEDURE Liesrueckwaerts;
{***************************************************************
 * Liest aus dem Datenfeld 'databits[i]', beginnend ab dem     *
 * Startzeichen, bis zum Stopzeichen (rckw„rts)               *
 ***************************************************************}
VAR i, j, k      : INTEGER;
    parity_mod_2 : BYTE;
CONST          b : ARRAY[0..6] OF BYTE =(1, 2, 4, 8, 16, 32, 64);
BEGIN
  FOR i := 1 TO Max DO data[i] :=  0;
  i :=  start;
  j :=  1;
  parity_err := 0;
  WHILE i < ende DO
    BEGIN
      parity := 0;
      FOR k :=  0 TO code-2 DO
        BEGIN
          data[j] :=  data[j]+databits[i+k]*b[k];
          IF databits[i+k] = 1 THEN parity :=  parity+1;
        END;
      parity_mod_2 := parity MOD 2;
      IF (parity_mod_2  = databits[i+code-1]) THEN
         Inc (parity_err);
      Inc (j);
      i :=  i+code;
    END;
  anzahl :=  j-1;
END;

PROCEDURE Decodiere;
{***************************************************************
 * Wandelt die eingelesenen Zeichen in ASCII-Zeichen um.       *
 * Das geschieht durch die Addition des 'zeichenoffset'.       *
 ***************************************************************}
VAR j :INTEGER;
BEGIN
  FOR j := 1 TO 1000 DO dec_data[j] :=  ' ';
  j :=  1;
  REPEAT
    dec_data[j] :=  Chr (data[j]+zeichenoffset);
    Inc (j);
  UNTIL ((dec_data[j-1] = '?') OR (j > anzahl));
END;

{***************************************************************
 * Hauptprogramm                                               *
 ***************************************************************}
BEGIN
  ClrScr;
  Initialisiere;
  REPEAT
    ClrScr;
    Write   ('Bitte die Magnetkarte durchziehen ');
    WRITELN (' (CLS-Signal wird erkannt) ');
    Lieskarte;
    IF bit_anzahl > 1 THEN
       BEGIN
         WRITELN('Databits:');   { Hilfslineal }
         WRITE  ('         1');
         WRITE  ('         2');
         WRITE  ('         3');
         WRITE  ('         4');
         WRITE  ('         5');
         WRITE  ('         6');
         WRITE  ('         7');
         WRITE  ('         8');
         WRITE  ('1234567890');
         WRITE  ('1234567890');
         WRITE  ('1234567890');
         WRITE  ('1234567890');
         WRITE  ('1234567890');
         WRITE  ('1234567890');
         WRITE  ('1234567890');
         WRITELN('1234567890');  { Ende Hilfslineal }
         FOR i := 1 TO j DO
             Write (databits[i]);
         WRITELN;
         WRITELN ('Die Auswertung beginnt');
         Findstart;
         IF start >= 1 THEN
            BEGIN
              Liesrueckwaerts;
              WRITELN ('Startzeichen ab Position     : ', start:5);
              WRITELN ('Stopzeichen ab Position      : ', ende:5);
              WRITELN ('Parity-Error                 : ', parity_err:5);
              WRITELN ('Anzahl der gelesenen Zeichen : ', anzahl:5);
              Decodiere;
              WRITELN ('Kartendaten: ');
              FOR i :=  1 TO anzahl DO
              WRITE (dec_data[i]);
              WRITELN;
              WRITELN;
            END
        ELSE WRITELN ('Startzeichen nicht gefunden');
      END
    ELSE
      BEGIN
        WRITELN ('KARTE konnte nicht gelesen werden');
      END;
    WRITELN('Wiederholen  oder abbrechen ?');
    ch :=  ReadKey;
    ch := UpCase (ch);
    UNTIL ch = 'Q';
  Port[LPT] :=  0;  {* Versorgungsspannung des Lesers ausschalten *}
  ClrScr;
END.
Das Programm wird durch die Eingabe von ,,LESEN" gestartet. Übergibt man keine Parameter, werden für die Codierung der Daten und für die Adresse der Druckerschnittstelle die Defaultwerte angenommen. Für die Codierung ist das 5-Bit und für die Adresse $378. Möchte man z.B. die Spur 1 mit der 7-Bit-Codierung lesen und befindet sich die Druckerschnittstelle an der Adresse $278 lautet der Aufruf:,,lesen c7 278". Der folgende Ausdruck ieigt das Leseergebnis einer Testkarte, die auf Spur 3 mit ,,01020304050607080900" beschrieben ist.
Man erkennt, daß insgesamt 22 Zeichen korrekt gelesen wurden. Diese Zahl setzt sich aus den 20 Zeichen sowie einem Start- und einem Stopzeichen zusammen. Zur Diagnose werden die gelesenen Daten auch bitweise dargestellt. Das ermöglicht, eine unbekannte Magnetkarte auf Startzeichen zu durchsuchen, falls diese nicht ISO-konform codiert ist.



Im folgenden wird die Ansteuerung eines Magnetkartencodierers über einen universellen Kontroller zum Lesen und Schreiben von Magnetkarten beschneben. Dieser Kontroller wird über eine senelle Schnittstelle mit dem Personal Computer angesteuert. Auf dem Markt existieren lediglich eine handvoll unterschiedliche Kontroller, deren Befehlssätze kompatibel oder zumindest sehr ähnlich sind. Exemplansch ist ein Kontroller zur Ansteuerung eines Magnetkartencodierers der MKW-Sene der Firma Omron ausgewählt worden, ohne damit eine Wertung vorzunehmen. Dieser Kontroller wird u.a. zusammen mit einem MKW-Magnetkartencodierer, Datenblättern und einem Demo-Programm in einem Koffer angeboten. Damit steht potentiellen Entwicklern ein Entwicklungs-Tool zur Verfügung, das eine hervorragende Starthilfe darstellt.

Das Demo-Programm zur Ansteuerung des Magnetkartencodierers befindet sich in dem Archiv, in dem auch diese Files waren. Eine Beschreibung folgt in Abschnitt 9.2.6



In Abschnitt 9.1 wurde aufgezeigt, wie es ohne großen Hardwareaufwand möglich ist, einen Einspur-Magnetkartenleser an die Druckerschnittstelle eines Personal Computers anzuschließen. Zum Betrieb von Magnetkartencodierern bedarf es etwas mehr Elektronik. Die handelsüblichen Kontroller sind in der Lage, alle drei Spuren einer Magnetkarte gleichzeitig zu lesen bzw. zu beschreiben. Dazu muß man das Timing der Magnetkartencodierer genau einhalten. Der hier beschnebene Kontroller verfügt über eine 280 CPU mit eigenem Betnebssystem in einem EPROM. Dieses Betriebssystem stellt dem Anwender komplette Befehle zur Steuerung des Magnetkartencodierers bereit. Zur Programmierung müssen diese Befehle zum Lesen oder Beschreiben einer Magnetkarte vom Anwender als Stnngs dem Kontroller übermittelt werden. Etwaige Statusriickmeldungen oder gelesene Daten von der Magnetkarte werden vom Kontroller ebenfalls als Strings übertragen. Eine Beschreibung der Kontroller-Befehle folgt im nächsten Abschnitt. Zur asynchronen Übertragung zwischen Computer und Kontroller, ist dieser mit einer 8251-UART ausgestattet. Über DIP-Schalter lassen sich die Übertragungsrate, die Anzahl der Daten- und Stop-Bits sowie die Pantät auf gerade (even) oder ungerade (odd) einstellen. Der Magnetkartencodierer ist über einen parallelen Port mit dem Kontroller verbunden. Über weitere parallele Ports können Leuchtdioden LEDs zur Anzeige des jeweiligen Status (Read, Write, Error und Ready), ein Drucker, eine 4x4-Tastatur und eine LCD-Anzeige angeschlossen werden (Abbildung 9-3).

Abb.9-3

Abb. 9-3:Vereinfachtes Blockdiagramm des Kontrollers zur Ansteuerung eines Magnetkartencodierers der MKW-Serie


Ein am Kontroller angeschlossener Drucker oder eine angeschlossene Anzeige können über den Kontroller angesprochen werden. Dazu stehen entsprechende befehle zur Verfügung.



Der Befehlssatz des Kontrollers umfaßt 40 Befehle, die in zwei Gruppen eingeteilt wer- den können. Dies sind zum einen Befehle ohne Daten und zum anderen Befehle mit Daten. Die Formate der Befehlsgruppen sehen wie folgt aus
  1. Befehlsformat ohne Daten
    <Befehlscode> <Spur-Nr.> CR LF
  2. Befehlsformat mit Daten
    <Befehlscode> <Spur-Nr.> <Daten> CR LF
Für den Befehlscode, die Spur-Nummer und die Daten erwartet der Kontroller ASCII-Zeichen. Beide Befehlsgruppen müssen mit einem Camage Return (CR, 0x0A) und Line Feed (LF, PxOD) abgeschlossen werden. In der Regel überträgt der Personal Computer diese Abschlußsequenz. Einige Compiler schließen die Übertragung zur seriellen Schnittstelle nicht automatisch mit CR/LF ab. In diesen Fällen darf nicht vergessen werden, nach der Spur-Nummer beim 1. Befehlsformat bzw. nach den Daten beim 2. Befehlsformat, die beiden Bytes OxOA und OxOD zum Kontroller zu übertragen. Der Befehlscode besteht aus ASCII-Zeichen, die eine zweistellige Zahl darstellen. Für die Spur-Nummer sind die ASCII-Zeichen '1','2' und '3' zulässig, die derjeweiligen ISO-Spur zugeordnet sind. Bei Befehlen, die kelner speziellen Spur zugeordnet sind, wird für das ASCII-Zeichen 'O' übergeben. Bei den Daten sollte man sich an den Zeichenvorrat der 5- und 7-Bit-Codierung (vgl. Abschnitt 4.5.1 und 4.5.2) halten. Insbesondere sollte kein Stopzeichen geschneben werden, wenn es sich nicht wirklich um ein gültiges Stopzeichen an der entsprechenden Stelle handelt. Der Lesevorgang wird nämlich beim Antreffen des ersten Stopzeichens unterbrochen. Das erste Zeichen nach diesem falschen Stopzeichen würde als LRC-Zeichen interpretiert, was mit größter Sicherheit nicht zum gelesenen Datensatz paßt.



Nachfolgend wird die Befehlsübersicht des Kontrollers mit einer Beschreibung des Befehlsformates und der Umsetzung in einem kurzen Beispielprogramm in der Programmiersprache BASIC angegeben.


Befehlscode: 00 Leerbefehl (NOP)
Format: '00' CR LF
Beschreibung Führt einen Leerbefehl (NOP) durch. Für muß ASCII-Zeichen '0' eingesetzt werden.
--------------------
Beispiel
10 OPEN "COMl :9600,E, 7 ,1,CS,DS,LF" AS #1 initialisiert die serielle Schnittstelle COM1
20 PRINT #1, "000" sendet den Befehlscode '000' for NOP zur COM1



Befehlscode: 01 RESET
Format: '01' CR LF
Beschreibung Führt einen Warmstart durch. Für muß das ASCII-Zd- chen '0'eingesetzt werden.
--------------------
Beispiel
10 OPEN "COMl :9600,E, 7 ,1,CS,DS,LF" AS #1 initialisiert die serielle Schnittstelle COM1
20 PRINT #1, "010" sendet den Befehlscode '010' for RESET zur COM1



Befehlscode: 04 Startzeichen setzen
Format: '04' CR LF
Beschreibung Setzt das zu verwendende Startzeichen für die unter angegebene Spur.
--------------------
Beispiel Das Startzeichen von Spur 1 soll auf ';' gesetzt werden
10 OPEN "COMl :9600,E, 7 ,1,CS,DS,LF" AS #1 initialisiert die serielle Schnittstelle COM1
20 PRINT #1,"041"; sendet den Befehlscode ' 041' zur COM1
30 PRINT #1,";" sendet das zu verwendende Startzeichen ';'



Befehlscode: 05 Stopzeichen setzen
Format: '05' CR LF
Beschreibung Setzt das zu verwendende Stopzeichen für die unter angegebene Spur.
--------------------
Beispiel Das Stopzeichen von Spur 2 soll auf '?' gesetzt werden
10 OPEN "COMl :9600,E, 7 ,1,CS,DS,LF" AS #1 initialisiert die serielle Schnittstelle COM1
20 PRINT #1,"052"; sendet den Befehlscode '052' zur COM1
30 PRINT #1,"?" sendet das zu verwendende Startzeichen '?'



Befehlscode: 06 Anzahl der Bit pro Zeichen setzen
Format: '06' CR LF
Beschreibung Setzt die Anzahl der zu verwendenden Bit pro Zeichen einschließ- lich dem Paritäts-Bit für die unter angegebene Spur.
--------------------
Beispiel Die Anzahl der Bit pro Zeichen für Spur 1 soll 5 betragen
10 OPEN "COMl:9600,E,7,1,CS,DS,LF" AS #1 initialisiert die serielle Schnittstelle COM1
20 PRINT #1,"061"; sendet den Befehlscode ' 061' COM1
30 PRINT #1, "5" sendet den Wert '5' for die Bit/Zeichen



Befehlscode: 07 Wiederholungszähler setzen
Format: '07' CR LF
Beschreibung Setzt den Wert des Wiederholungsz'ahlers, der beim Auftreten eines Fehlers die Anzahl der Versuche angibt, wie oft die Magnetkarte er- neut gelesen bzw. beschrieben wird. Zulässig ist ein Wert zwischen ' 1' und '9'.
--------------------
Beispiel Der Wert des Wiederholungsz'âhlers soll auf 3 gesetzt werden
10 OPEN "COMl :9600,E, 7 ,1,CS,DS,LF" AS #1 initialisiert die serielle Schnittstelle COM1
20 PRINT #1,"070"; sendet den Befehlscode ' 070' zur COM1
30 PRINT #1, "3" sendet den Wert ' 3' für den Wiederholungszfihler



Befehlscode: 08 Norm setzen
Format: '08' CR LF
Beschreibung Setzt die Norm, nach der der Magnetkartencodierer die Magnetkarte lesen bzw. beschreiben soll. Mögliche Angaben für sind 'B' für BIT-Norm, 'I' für ISO-Norm und 'S' für SIPASS-Norm.
--------------------
Beispiel Den Kontroller auf ISO-Norm setzen
10 OPEN "COMl:9600,E,7,1,CS,DS,LF" AS #1 initialisiert die serielle Schnittstelle COM1
20 PRINT #1,"080"; sendet den Befehlscode '080' zur COM1
30 PRINT #1, "I" sendet den Wert 'I' für die ISO-Norm



Befehlscode: 09 Magnetkartentyp setzen
Format: '09' CR LF
Beschreibung Setzt den Magnetkartencodierer auf den Magnetkartentyp ein, falls dieser HiCo-Karten beschreiben kann. Standardm'ißig werden von Magnetkartengeräten LoCo-Karten verarbeitet. Mögliche Typen sind 'H' für HiCo- und 'L' für LoCo-Karten.
--------------------
Beispiel Den Magnetkartencodierer auf LoCo-Karten setzen
10 OPEN "COMl :9600,E, 7 ,1,CS,DS,LF" AS #1 initialisiert die serielle Schnittstelle COM1
20 PRINT #1,"090"; sendet den Befehlscode '090' zur COM1
30 PRINT #1,"L" sendet den Wert 'L' für LoCo-Karten



Befehlscode: 12 Abfrage, ob Magnetkarte im Gerät
Format: ' 12' CR LF
Beschreibung Es wird abgefragt, ob sich eine Magnetkarte im Magnetkartenco- dierer befindet. Der Kontroller gibt als Rückmeldung den Status zurück. Der Status ist '00', falls sich eine Karte im Gerät befindet und '08', falls nicht (vgl. Abschnitt 9.2.5).
--------------------
Beispiel Abfragen, ob sich eine Magnetkarte im Magnetkartencodierer befin- det (Annahme: Karte befindet sich im Gerät)
10 OPEN "COMl:9600,E, 7,1,CS,DS,LF" AS #1 initialisiert die serielle Schnittstelle COM1
20 PRINT #1,"120" sendet den Befehlscode '120' zur COM1
30 INPUT #l,status$ liest den zurückgemeldeten Status
40 PRINT status$ druckt den Status, der in diesem Fall '00' ist



Befehlscode: 15 Magnetkarte einziehen
Format: '15' CR LF
Beschreibung Magnetkartencodierer zieht die Magnetkarte ein, indem sie durch das Gerät transportiert und nach hinten ausgeworfen wird.
--------------------
Beispiel Die Magnetkarte einziehen
10 OPEN "COMl:9600,E,7,1,CS,DS,LF" AS #1 initialisiert die serielle Schnittstelle COM1
20 PRINT #1, "150" sendet den Befehlscode ' 150' zur COM1



Befehlscode: 16 Magnetkarte einziehen und in hintere Ruheposition ablegen
Format: '16' CR LF
Beschreibung Magnetkartencodierer zieht die Magnetkarte ein und legt sie in die hintere Ruheposition ab, d.h die Karte wird nicht an der Rückseite des Gerätes ausgeworfen und kann somit wieder nach vorne trans- portiert werden
--------------------
Beispiel Die Magnetkarte einziehen und hinten ablegen
10 OPEN "COMl:9600,E,7,1,CS,DS,LF" AS #1 initialisiert die serielle Schnittstelle COM1
20 PRINT #1,"160" sendet den Befehlscode '160' zur COM1



Befehlscode: 17 Magnetkarte vorne auswerfen
Format: '17' CR LF
Beschreibung Magnetkartencodierer wirft eine bereits im Gerät befindliche Ma- gnetkarte vorne wieder aus.
--------------------
Beispiel Die Magnetkarte vorne auswerfen
10 OPEN "COMl:9600,E,7,1,CS,DS,LF" AS #1 initialisiert die serielle Schnittstelle COM1
20 PRINT #1, "170" sendet den Befehlscode ' 170' COM1



Befehlscode: 18 Magnetkarte einziehen, lesen und in hintere Ruheposition ablegen
Format: ' 18' CR LF
Beschreibung Der Magnetkartencodierer zieht die Magnetkarte ein, liest die unter angegebene Spur und legt die Karte in die hintere Ru- heposition ab.
--------------------
Beispiel Spur 1 lesen und Karte hinten ablegen (Annahme: auf Spur 1 steht 'HEISE^VERLAG')
10 OPEN "COMl :9600,E, 7 ,1,CS,DS,LF" AS #1 initialisiert die serielle Schnittstelle COM1
20 PRINT #1, "181" sendet den Befehlscode '181' zur COM1
30 INPUT #1,lesens Zeichenkette der Spur 1 einlesen
40 PRINT lesens Inhalt ' HEISE^VERLAG' ausgeben



Befehlscode: 19 Magnetkarten beschreiben, verifizieren und vorne auswerfen
Format: ' 19' CR LF
Beschreibung Der Magnetkartencodierer beschreibt eine bereits im Gerät befindli- che Magnetkarte mit den in Zeichen angegebenen Daten auf der unter angegebenen Spur. Der Kontroller hängt das Start- und Stopzeichen, bei Verwendung der ISO-Norm auch das LRC-Zeichen, automatisch an. Anschließend wird die Karte vorne ausgeworfen.
--------------------
Beispiel Die Magnetkarte mit 'HALLO' auf Spur 1 beschreiben
10 OPEN "COMl :9600,E, 7 ,1,CS,DS,LF" AS #1 initialisiert die serielle Schnittstelle COM1
20 PRINT #1,"191"; sendet den Befehlscode '191' zur COM1
30 PRINT #1,"HALLO" sendet die Zeichen 'HALLO', die geschrieben werden sollen



Befehlscode: 20 Magnetkarte lesen und in hintere Ruheposition ablegen
Format: '20' CR LF
Beschreibung Der Magnetkartencodierer liest die unter angegebene Spur einer bereits im Gerät befindlichen Magnetkarte und legt sie in die hintere Ruheposition ab.
--------------------
Beispiel Spur 1 lesen und Karte hinten ablegen (Annahme: auf Spur 1 steht 'HEISE^VERLAG')
10 OPEN "COMl :9600,E, 7 ,1,CS,DS,LF" AS #1 initialisiert die serielle Schnittstelle COM1
20 PRINT #1,"201" sendet den Befehlscode '201' zur COM1
30 INPUT #1,lesens Zeichenkette der Spur 1 einlesen
40 PRINT lesens Inhalt 'HEISE^VERLAG' ausgeben



Befehlscode: 21 Magnetkarte beschreiben, verifizieren und in hintere Ruheposi- tion ablegen
Format: '21' CR LF
Beschreibung Der Magnetkartencodierer beschreibt eine bereits im Gerät befindli- che Magnetkarte mit der in Zeichen angegebenen Daten auf der unter angegebenen Spur. Der Kontroller hängt das Start- und Stopzeichen, bei Verwendung der ISO-Norm auch das LRC-Zeichen, automatisch an. Anschließend wird die Karte in die hintere Ruheposition abgelegt.
--------------------
Beispiel Die Magnetkarte mit 'HALLO' auf Spur 1 beschreiben
10 OPEN "COMl :9600,E, 7 ,1,CS,DS,LF" AS #1 initialisiert die serielle Schnittstelle COM1
20 PRINT #1,"211"; sendet den Befehlscode '211' zur COM1
30 PRINT #1,"HALLO" sendet die Zeichenkette 'HALLO'



Befehlscode: 22 Magnetkarte einziehen, lesen und vorne auswerfen
Format: '22' CR LF
Beschreibung Der Magnetkartencodierer zieht die Magnetkarte ein, liest die unter angegebene Spur und wirft sie vorne aus.
--------------------
Beispiel Spur 3 lesen und Karte vorne ausweden (Annahme: auf Spur 3 steht '30625')
10 OPEN "COMl :9600,E, 7 ,1,CS,DS,LF" AS #1 initialisiert die serielle Schnittstelle COM1
20 PRINT #1,"223" sendet den Befehlscode '223' zur COM1
30 INPUT #1,lesens Zeichenkette der Spur 3 einlesen
40 PRINT lesens Inhalt '30625' ausgeben



Befehlscode: 23 Magnetkarte einziehen, beschreiben, verifizieren und vorne auswerfen
Format: '23' > CR LF
Beschreibung Der Magnetkartencodierer zieht die Magnetkarte vorne ein, be- schreibt sie mit den in Zeichen angegebenen Daten auf der unter angegebenen Spur. Der Kontroller hängt das Start- und Stopzeichen, bei Verwendung der ISO-Norm auch das LRC-Zei- chen, automatisch an. Anschließend wird die Karte vorne ausge- worfen.
--------------------
Beispiel Die Magnetkarte mit 'HALLO' auf Spur 1 beschreiben
10 OPEN "COMl :9600,E, 7 ,1,CS,DS,LF" AS #1 initialisiert die serielle Schnittstelle COM1
20 PRINT #1,"231"; sendet den Befehlscode '231' zur COM1
30 PRINT #1,"HALLO" sendet die Zeichenkette 'HALLO', die geschrieben werden sollen



Befehlscode: 24 Magnetkarte einziehen, lesen und hinten auswerfen
Format: '24' CR LF
Beschreibung Der Magnetkartencodierer zieht die Magnetkarte ein, liest die unter angegebene Spur und wirft sie an der Rückseite des Ger'es aus.
--------------------
Beispiel Spur 3 lesen und Karte hinten auswerfen (Annahme: auf Spur 3 steht ' 30625')
10 OPSâ "COM1:9600, E, 7,1,CS,DS,LF" AS #1 initialisiert die serielle Schnittstelle COM1
20 PRINT #1, "243" sendet den Befehlscode '243' zur COM1
30 INPUT #1,lesens Zeichen der Spur 3 einlesen
40 PRINT lesens Inhalt "30625" ausgeben



Befehlscode: 25 Magnetkarte einziehen, beschreiben, verifizieren und hinten auswerfen
Format: '25' CR LF
Beschreibung Der Magnetkartencodierer zieht die Magnetkarte vorne ein, be- schreibt sie mit den in Zeichen angegebenen Daten auf der unter angegebenen Spur. Der Kontroller hängt das Start- und Stopzeichen, bei Verwendung der ISO-Norm auch das LRC-Zei- chen, automatisch an. Anschließend wird die Karte an der Rückseite des Gerätes ausgeworfen.
--------------------
Beispiel Die Magnetkarte mit 'HALLO' auf Spur 1 beschreiben
10 OPEN "COMl :9600,E, 7 ,1,CS,DS,LF" AS #1 initialisiert die serielle Schnittstelle COM1
20 PRINT #1, "251"; sendet den Befehlscode '251' zur COM1
30 PRINT #1, "HALLO" sendet die Zeichenkette 'HALLO', die geschrieben werden sollen



Befehlscode: 26 Magnetkarte lesen und hinten auswerfen
Format: '26' CR LF
Beschreibung Der Magnetkartencodierer liest die mit angegebene Spur einer im Gerät befindlichen Magnetkarte und wirft sie an der Rückseite des Gerätes aus.
--------------------
Beispiel Spur 1 lesen und hinten auswerfen (Annahme: auf Spur 1 steht , HEiSE^VERLAG,)
10 OPEN "COMl :9600,E, 7 ,1,CS,DS,LF" AS #1 initialisiert die serielle Schnittstelle COM1
20 PRINT #1,"261" sendet den Befehlscode '261' zur COM1
30 INPUT #1,lesens Zeichen der Spur 1 einlesen
40 PRINT lesens Inhalt 'HEISE^VERLAG' ausgeben



Befehlscode: 27 Magnetkarte beschreiben, verifizieren und hinten auswerfen
Format: '27' CR LF
Beschreibung Der Magnetkartencodierer beschreibt eine bereits im Gerät befindli- che Magnetkarte mit der in Zeichen angegebenen Daten auf der unter angegebenen Spur. Der Kontroller hängt das Start- und Stopzeichen, bei Verwendung der ISO-Norm auch das LRC-Zeichen, automatisch an. Anschließend wird die Karte an der Rückseite des Gerätes ausgeworfen.
--------------------
Beispiel Magnetkarte mit 'HALLO' auf Spur 1 beschreiben
10 OPEN "COMl :9600,E, 7 ,1,CS,DS,LF" AS #1 initialisiert die serielle Schnittstelle COM1
20 PRINT #1,"271"; sendet den Befehlscode '271' zur COM1
30 PRINT #1, "HALLO" sendet die Zeichenkette 'HALLO', die geschrieben werden sollen



Befehlscode: 28 Magnetkarte lesen und in vorderer Ruheposition ablegen
Format: '28' CR LF
Beschreibung Der Magnetkartencodierer liest die unter angegebene Spur einer bereits im Gerät befindlichen Magnetkarte und legt sie in die vordere Ruheposition ab.
--------------------
Beispiel Spur 1 lesen und Karte vorne ablegen (Annahme: auf Spur 1 steht 'HEISE^VERLAG')
10 OPEN "COMl :9600,E, 7 ,1,CS,DS,LF" AS #1 initialisiert die serielle Schnittstelle COM1
20 PRINT #1,"281" sendet den Befehlscode '281' zur COM1
30 INPUT #1,lesens Zeichen der Spur 1 einlesen
40 PRINT lesens Inhalt 'HEISE^VERLAG' ausgeben



Befehlscode: 30 Bit-Speicher lesen
Format: '30' CR LF
Beschreibung Die Bit-Positionen 001 bis 200 des Bit-Speichers werden gelesen. Im Bit-Speicher befinden sich die Daten des letzten Lese- bzw. Ve- rifikationsvo, rgangs. Dieser Befehl dient zur Kartendiagnose.



Befehlscode: 31 Bit-Speicher lesen
Format: '31' CR LF
Beschreibung Die Bit-Positionen 201 bis 400 des Bit-Speichers werden gelesen. Im Bit-Speicher befinden sich die Daten des letzten Lese- bzw. Ve- rifikationsvorgangs. Dieser Befehl dient zur Kartendiagnose.



Befehlscode: 32 Bit-Speicher lesen
Format: '32' CR LF
Beschreibung Die Bit-Positionen 401 bis 600 des Bit-Speichers werden gelesen. Im Bit-Speicher befinden sich die Daten des letzten Lese- bzw. Ve- rifikationsvorgangs. Dieser Befehl dient zur Kartendiagnose.



Befehlscode: 33 Bit-Speicher lesen
Format: '33' CR LF
Beschreibung Die Bit-Positionen 601 bis 800 des Bit-Speichers werden gelesen. Im Bit-Speicher befinden sich die Daten des letzten Lese- bzw. Ve- rifikationsvorgangs. Dieser Befehl dient zur Kartendiagnose.



Befehlscode: 34 Bit-Speicher lesen
Format: '34' CR LF
Beschreibung Die Bit-Positionen 001 bis 800 des Bit-Speichers werden gelesen. Im Bit-Speicher befinden sich die Daten des letzten Lese- bzw. Ve- rifikationsvorganges. Dieser Befehl dient zur Kartendiagnose.



Befehlscode: 40 Shutter-Modus setzen
Format: '40' CR LF
Beschreibung Setzt den Betriebsmodus des Shutters, falls einer vorhanden ist. Mögliche Moduswerte sind 'D', um den Shutter zu deaktivieren (disable) oder 'E' um ihn zu aktivieren (enable). Ferner kann mit der Übergabe des Moduswertes 'M' eine Magnetspurüberprüfung aktiviert bzw. mit 'N' deaktiviert werden.
--------------------
Beispiel Shutters des Magnetkartencodieres aktivieren
10 OPEN "COMl :9600,E, 7 ,1,CS,DS,LF" AS #1 initialisiert die serielle Schnittstelle COM1
20 PRINT #1, "400"; sendet den Befehlscode '400' zur COM1
30 PRINT #1, "E" sendet den Wert 'E' zur Aktivierung des Shutters



Befehlscode: 41 wartezeit für einen Befehl setzen
Format: '41' CR LF
Beschreibung Setzt die Wartezeit des Kontrollers, auf die er für einen Befehl war- tet bis ein TIME-OUT Fehler gemeldet wird. Der Wert Zeit gibt die Wartezeit in Sekunden an. Zulässige Werte sind von '00' bis '99' Sekunden.
--------------------
Beispiel Wartezeit des Kontrollers auf 3 Sekunden setzen
10 OPEN "COMl :9600,E, 7 ,1,CS,DS,LF" AS #1 initialisiert die serielle Schnittstelle COM1
20 PRINT #1,"410"; sendet den Befehlscode '410' zur COM1
30 PRIN #1,"03" sendet den Wert '03' für 3 Sekunden Wartezeit



Befehlscode: 50 Warten auf eine Magnetkarte
Format: '50' CR LF
Beschreibung Magnetkartencodierer wartet darauf, daß eine Magnetkarte an der Rückseite des Gerätes eingesteckt wird. Der Kontroller gibt als Rückmeldung den Status zurück. Der Status ist '01', falls eine Karte eingesteckt wird (vgl. Abschnitt 9.2.5).
--------------------
Beispiel Kontroller wartet auf eine Karte an der Rückseite
10 OPEN "COMl :9600,E, 7 ,1,CS,DS,LF" AS #1 initialisiert die serielle Schnittstelle COM1
20 PRINT #1,"500" liest den rückgemeldeten Status des
30 INPUT #1,status$ Kontrollers ein



Befehlscode: 52 Magnetkarte von der Rückseite einziehen, lesen und vorne aus- werfen
Format: '52' CR LF
Beschreibung Der Magnetkartencodierer zieht die Magnetkarte von der Rückseite des Gerätes ein, liest die unter angegebene Spur und wirft sie vorne aus.
--------------------
Beispiel Spur 3 lesen und Karte vorne auswerfen (Annahme: auf Spur 3 steht '30625')
10 OPEN "COMl :9600,E, 7 ,1,CS,DS,LF" AS #1 initialisiert die serielle Schnittstelle COM1
20 PRINT #1,"523" sendet den Befehlscode '523' zur COM1
30 INPUT #1,lesens Zeichen der Spur 3 einlesen
40 PRINT lesens Inhalt '30625' ausgeben



Befehlscode: 53 Magnetkarte von der Rückseite einziehen, beschreiben, verifi- zieren und vorne auswerfen
Format: '53' CR LF
Beschreibung Der Magnetkartencodierer zieht die Magnetkarte von der Rückseite des Gerätes ein, beschreibt sie mit den in Zeichen angegebenen Daten auf der unter angegebenen Spur. Der Kontroller hängt das Start- und Stopzeichen, bei Verwendung der ISO-Norm auch das LRC-Zeichen, automatisch an. Anschließend wird die Karte vorne ausgeworfen.
--------------------
Beispiel Magnetkarte mit 'HALLO' auf Spur 1 beschreiben
10 OPEN "COMl :9600,E, 7 ,1,CS,DS,LF" AS #1 initialisiert die serielle Schnittstelle COM1
20 PRINT #1,"531"; sendet den Befehlscode '531' zur COM1
30 PRINT #1,"HALLO" sendet die Zeichen 'HALLO', die geschrieben werden sollen



Befehlscode: 62 Status der Druckerschnittstelle einlesen
Format: '62' CR LF
Beschreibung Der Kontroller liest den Status der Druckerschnittstelle ein. Die Länge des Status ist 8 Byte, da der Status aus 8 ASCII-Werten aus '0' und '1' besteht.
--------------------
Beispiel Status der Druckerschnittstelle einlesen (Annahme: Status ist '11101001')
10 OPEN "COMl :9600,E, 7 ,1,CS,DS,LF" AS #1 initialisiert die serielle Schnittstelle COM1
20 PRINT #1,"620" sendet den Befehlscode '620' zur COM1
30 INPUT #1,status$ Status einlesen
40 PRINT status$ Inhalt '11101001' ausgeben



Befehlscode: 63 Bit-Muster an Druckerschnittstelle ausgeben
Format: '63' CR LF
Beschreibung Der Kontroller gibt die unter Bit-Muster angegebene Informationen an die Druckerschnittstelle aus. Das Bit-Muster muß eine Länge von 8 Byte haben und setzt sich aus ASCII-Zeichen von '0' und ' 1' zusammen.
--------------------
Beispiel Bit-Muster '01001001' an Druckerschnittstelle ausgeben
10 OPEN "COMl :9600,E, 7 ,1,CS,DS,LF" AS #1 initialisiert die serielle Schnittstelle COM1
20 PRINT g1,"630" sendet den Befehlscode '630' zur COM1
30 PRINT #1,"01001001" sendet die Bit-Kombination '01001001' an die Druckerschnittstelle



Befehlscode: 65 Zeichen auf der LCD-Anzeige ausgeben
Format: '65' CR LF
Beschreibung Der Kontroller gibt die in Zeichen angegebene ASCII-Werte auf der LCD-Anzeige (falls vorhanden) des Kontrollers aus. Die Länge der Daten darf maximal 32 Zeichen betragen.
--------------------
Beispiel Zeichenkette 'FACHBUCH' auf der LCD-Anzeige ausgeben
10 OPEN "COMl :9600,E, 7 ,1,CS,DS,LF" AS #1 initialisiert die serielle Schnittstelle COM1
20 PRINT #1,"650" sendet den Befehlscode '650' zur COM1
30 PRINT #1,"FACHBUCH" sendet das Zeichen 'FACHBUCH' an die LCD- Anzeige



Befehlscode: 70 Karte in die hintere Ruheposition transportieren
Format: '70' CR LF
Beschreibung Der Magnetkartencodierer transportiert eine bereits im Gerät be- findliche Magnetkarte in die hintere Ruheposition.
--------------------
Beispiel Magnetkarte in die hintere Ruheposition transportieren
10 OPEN "COMl :9600,E, 7 ,1,CS,DS,LF" AS #1 initialisiert die serielle Schnittstelle COM1
20 PRINT #1,"700" sendet den Befehlscode '700' zur COM1



Befehlscode: 71 Karte in die vordere Ruheposition transportieren
Format: '71' CR LF
Beschreibung Der Magnetkartencodierer transportiert eine bereits im Gerät be- findliche Magnetkarte in die vordere Ruheposition.
--------------------
Beispiel Magnetkarte in die vordere Ruheposition transportieren
10 OPEN "COMl :9600,E, 7 ,1,CS,DS,LF" AS #1 initialisiert die serielle Schnittstelle COM1
20 PRINT #1, "710" sendet den Befehlscode '710' zur COM1



Befehlscode: 73 Karte in die MM-Modulposition transportieren
Format: '73' CR LF
Beschreibung Der Magnetkartencodierer transportiert eine bereits im Gerät be- findliche Magnetkarte in die MM-Modulposition.
--------------------
Beispiel Magnetkarte in die vordere Ruheposition transportieren
10 OPEN "COMl :9600,E, 7 ,1,CS,DS,LF" AS #1 initialisiert die serielle Schnittstelle COM1
20 PRINT #1,"730" sendet den Befehlscode '730' zur COM1



Befehlscode: 99 Versionsnummer des Betriebssystems abfragen
Format: '99' CR LF
Beschreibung Der Kontroller sendet die aktuelle Versionsnummer des Betriebssystems
--------------------
Beispiel Versionsnummer
10 OPEN "COMl :9600,E, 7 ,1,CS,DS,LF" AS #1 initialisiert die serielle Schnittstelle COM1
20 PRINT '1,"990" sendet den Befehlscode '990' zur COM1
30 INPUT '1, version$ die Versionsnummer in verson$ einlesen




Nachdem der Kontroller die Ausführung eines Befehls beendet hat, sendet dieser eine Rückmeldung. Diese beinhalten den Status des Kontrollers, die Spur auf der sich der Befehl bezieht und eventuelle Daten. Die Übertragung wird vom Kontroller mit einem CR/LF abgeschlossen. Die Formate der Rückmeldungen sind ähnlich wie die Befehlsformate aufgebaut, und sehen wie folgt aus
  1. Rückmeldung ohne Daten
    <Status> <Spur-Nr.> CR LF


  2. Befehlsformat mit Daten
    <Status> <Spur-Nr.> <Daten> CR LF




Die Tabelle 9-2 faßt die Statuswerte zusammen, die der Kontroller als mögliche Rückgabemeldungen sendet.

Status Bedeutung Erläuterung
00 Übertragung o.k.
01 LED-1 aktiv LED zeigt an, daß die Karte eingesteckt ist
03 time-out Beim Empfangen der Daten ist eine Zeitüberschreitung aufgetreten
04 Übertragungsfehler Beim Empfangen der Daten ist ein Übertragungsfehler aufgetreten
05 Syntax Error Befehl ist nicht bekannt oder fehlerhaft angegeben
06 Es wurden mehr als 1024 Daten empfangen
07 Spurangabe falsch Es wurde keine gültige Spurnummer angegeben
08 Fehler beim Umgang mit der Karte
09 Shutter-Error Shutter ist nicht vorhanden oder klemmt
11 LRC-Zeichen falsch LRC-Zeichen paßt nicht zum Datensatz
12 Verify-Error Beim Vergleich der Daten nach Schreibvorgang ist ein Fehler aufgetreten
14 Parity-Error Es ist ein Fehler beim Pantäts-Bit aufgetreten
17 Bitspeicher Überlauf Beim Lesen ist der Bitspeicher übergelaufen
18 Stopzeichen fehlt Im Datensatz fehlt ein gültiges Stopzeichen
19 Karte leer Beim Lesen wurde festgestellt, daß die Karte nicht beschrieben ist
20 Startzeichen falsch Es wurde kein gültiges Startzeichen im Datensatz gefunden
21 Kartenende unerwartet erreicht Dieser Fehler tritt auf, wenn der zu schreibende Datensatz zu lang ist

Tabelle 9-2: Statusübersicht



In dem Archiv, aus dem diese Dateien stammen, befindet sich das Programm ,,CARD.EXE" der Firma Newtec Ebert GmbH, welches unter dem Betriebssystem MS-DOS auf einem PC lauffähig ist. Mit dem Programm ,,CARD" kann man den in Abschnitt 9.2 beschnebe- nen Kontroller ansteuern. Das Programm ist menügesteuert, so daß die Bedienung kei- nerlei Schwiengkeiten bereiten sollte. Neben Menüpunkten, mit denen man eine kom- plette Spur auf der Magnetkarte lesen bzw. beschreiben kann, gibt es einen Testmodus für die einzelnen Kontrollerbefehle, die in Abschnitt 9.2.3 besprochen wurden. Ferner kann man jede der drei Spuren im Bit-Modus untersuchen.



In diesem Abschnitt wird ein einfaches Interface vorgestellt, mit dem es möglich ist, eine Spur einer Magnetkarte zu lesen und über die senelle Schnittstelle einem Rechner zu übertragen. Damit ist man nicht mehr wie in Abschnitt 9.1 auf einen Rechnertyp festgelegt. Das Interface ist in der Lage sowohl die 5-Bit- als auch die 7-Bit-Codierung zu verarbeiten. Kernstück des Interfaces ist ein Mikrokontroller PIC16C58A der Firma Microchip (siehe Abbildung 9-4; Tabelle 9-3). Dieser besitzt einen internen 2Kx12 Bit EPROM Speicher für das Programm und einen 72x8 Bit Speicher für Daten. Im Programmspeicher ist das Programm zum Lesen der Magnetkarte untergebracht. Die Umstellung von der 5- auf 'i~-Bit-Codierung erfolgt durch die Brücke Brl. Bei gesteckter Briicke wird mit 5-Bit gelesen, ansonsten mit 7-Bit. Die Abfrage erfolgt nur beim Einschalten des Gerätes. Möchte man also die Codierung ändern mit der gelesen werden soll, muß man das Interface durch Aus- und wieder Einschalten reseten. Eine Umstellung der zu lesenden Bit-Dichte ist nicht erforderlich, da unabhängig davon gelesen wird. Das Protokoll für die Übertragung der gelesenen Daten über die senelle Schnittstelle ist softwaremäßig ebenfalls im Programmspeicher des Mikrokontrollers untergebracht. Die Pegelanpassung zwischen Mikrokontroller und seneller Schnittstelle übernimmt ein Schnittstellentreiber MAX232, der hier in seiner Standardbeschaltung laut Datenblatt Verwendung findet. Übertragen werden mit den Parametern 9600 Baud, 8 Daten-Bits, ohne Pantät und einem Stop-Bit.

Abb.9-4

Abb. 9-4:Schaltplan des Magnetkartenleser-Interfaces mit serieller Schnittstelle


Halbleiter
IC1 Mikrokontroller PIC16C58A(programmiert)
IC2 MAX232
Widerstände
R1 47 k Ohm
Kondensatoren
C1...C5 4.7 mü F/35V
C6,C7 20 pF
 
Sonstiges
Br1 Jumper
Xt1 Quarz 8 MHz
J1 Pfostenleiste 9-polig
J2 Sub-D-Stecker 9-polig female
IC-Fassung 18-polig
IC-Fassung 16-polig
Platine
Durchzugleser Omron 3S4YR-HNR4

Das Interface ist für einen Magnetkartenleser der Serie HNR entwickelt worden. Die Wahl fiel auf diesen 5p, da man einen HNR Magnetkartenleser auf jede beliebige Spur und Bit-Dichte stellen kann. Prinzipiell kann jeder Magnetkartenleser am Interface betneben werden. Man sollte aber darauf achten, daß bei Venvendung eines Einstecklesers, die gesamte Spur gelesen werden kann (vgl. dazu Kapitel 7), da das Programm des Mikrokontrollers ein gültiges Endzeichen erwartet. Sollte der verwendete Magnetkartenleser über Ausgangstreiber mit ,,open collector" verfügen, so werden drei ,,pull up" Widerstände an den Signalen RCP, RDP und CLS nötig.



Ein weiteres Beispiel für den Einsatz der Magnetkarte ist die Zugangs- bzw. die Zutrittskontrolle. Im folgenden wird eine einfache Schaltung vorgestellt, mit der die Realisierung einer solchen Kontrolle leicht möglich ist. Dabei können bereits vorhandene Magnetkarten, wie EC- oder Kreditkarte, benutzt werden. Als Magnetkartenleser ist ein Einsteckleser der Sene SBR gewählt worden. Damit man sowohl EC- und Kreditkarte verwenden kann, muß man die Daten der Spur 2 lesen können. Die Auswahl der Spur 2 für die zu lesenden Daten bietet zudem den Vorteil, daß bei beiden Magnetkartentypen die Spur 2 mit 5-Bit codiert ist. Das Programm des Mikrokontrollers braucht also nicht zwischen zwei unterschiedlichen Codierungen zu unterscheiden. Die vorgestellte Schaltung (siehe Abbildung 9-5; Tabelle 9-4) ist in der Lage, die Daten von maximal vier Magnetkarten zu lesen und anschließend als berechtigte Karten zu identifizieren.

Abb.9-5

Abb. 9-5:Schaltplan der Zutrittskontrolle mit Magnetkarte


Halbleiter                             Kondensatoren
IC1   Mikrokontroller PIC16C58A        C1,C2        20 pF
      (programmiert)
IC2   EEPROM 93LC46                    Sonstiges
T1    Transistor BC 547                XT1          Quarz 4 MHz
D1    Diode IN4148                     S0...S2      DIL-Schalter
D2    Leuchtdiode                      J1           Pfostenleiste 10-polig
                                       IC-Fassung 18-polig
Widerstände                            IC-Fassung 8-polig
R1...R7   47 k Ohm                     Relais 5V
R8        270 Ohm                      Platine
R9        1 k Ohm                      Einsteckleser Omron 3S4YR-SBR4-20
Das geschieht sehr einfach: Durch das Schließen des Schalters S2 wird die Schaltung in den Lernmodus gebracht. Anschließend wird mit den Schaltern SO und S1 binär eine von vier Speicherstellen ausgewählt, in der die berechtigten Daten der Magnetkarte gespeichert werden sollen. Die Daten der Magnetkarte, die dann eingeschoben wird, werden in einem seriellen EEPROM gespeichert, und bleiben auch nach Ausschalten der Versorgungsspannung erhalten. Zum Abschließen des Programmiervorgangs muß der Schalter S2 wieder geöffnet werden. Für die Programmierung einer weiteren Karte wird der Vorgang einfach wiederholt. Damit ist es möglich, gezielt eine Speicherstelle im EEPROM anzusprechen und mit den gewünschten Daten zu beschreiben. Das gezielte Löschen der Daten einer Magnetkarte, die keine Berechtigung mehr haben soll, ist ebenfalls möglich. Dazu wird der Schalter S2 geschlossen und die entsprechende Speicherstelle mit den Schaltern SO und S1 ausgewählt. Es wird diesmal keine Magnetkarte eingeschoben, sondern nur der Schalter S2 geöffnet. Die Daten der ausgewählten Speicherstelle sind somit gelöscht. Im normalen Betriebsmodus (S2 geöffnet) haben die Schalter SO und S1 eine weitere Funktion. Wird eine Magnetkarte als berechtigt erkannt, zieht ein Relais an. Die Zeit wie lange das Relais angezogen bleiben soll kann mit den Schaltern SO und S1 binär in Stufen von jeweils einer Sekunde eingestellt werden. Tabelle 9-5 faßt die Funktionen der Schalterstellungen zusammen. Auskunft über den Status der Schaltung gibt eine Leuchtdiode. Tntt während der Programmierung oder im normalen Betnebsmodus ein Fehler auf, blinkt die Leuchtdiode schnell für eine Zeit von 2 Sekunden. War ein Programmierversuch erfolgreich, leuchtet sie für 1 Sekunde auf. Wird im normalen Betnebsmodus eine Magnetkarte als berechtigt erkannt, leuchtet die Diode solange auf, wie das Relais anzieht.


S2 S1 S0 Funktion
1 0 0 Programmierung der Speicherstelle 0
1 0 1 Programmierung der Speicherstelle 1
1 1 0 Programmierung der Speicherstelle 2
1 1 1 Programmierung der Speicherstelle 3
    
S2 S1 S0 Funktion
1 0 0 Relais zieht 1s an
1 0 1 Relais zieht 2s an
1 1 0 Relais zieht 3s an
1 1 1 Relais zieht 4s an