6. FUNK.TAG in Kassel am 27.04.2024

Simulation der Zuse Z3, Teil1

 

Roland Brüstle DL3NDR                                                                              Datum:1.7.2015

Siegertsbühl 9

91077 Neunkirchen a.B.

 

 

 

 

Unter Einhaltung der GNU GPL3-Lizenz kann das Programm und die Dokumentation weiterverwendet werden.

 

 

 

 

 

Einleitung

Es soll auf einem PC ein Programm erstellt werden mit dem es möglich ist den Rechner „Zuse Z3“ zu simulieren. Dabei werden aus den Originalschaltplänen die einzelnen Bauteile in eine Bauteilliste und die Verdrahtung dieser Bauteile  in eine Verdrahtungsliste übertragen. Die Simulation diser Bauteiltypen, wie Relais oder Schrittwähler, wird innerhalb eines Simulationsprogramms  durchgeführt. D.h. die Umsetzung der Schaltpläne soll weitgendst  ohne spezielle Kenntnisse der  Schalt- und Computertechnik möglich sein. Für den anschließenden Test der Verdrahtung stehen entsprechende Protokollroutinen zur Verfügung.

Von der Idee bis zur Realisierung

Die Idee hierzu wurde bereits 1995 geboren. Mein Sohn Matthias hatte das Buch von Konrad Zuse „Der Computer mein Lebenswerk“ gekauft. Neben ausführlicher Beschreibung seines Lebens und den Grundprinzipien seiner Rechenmaschinen war auch das Prinzip eines Additionswerks mit Hilfe von Relais dargestellt.

 

Teil 1-2

To top

Das obige Schaltbild ist identisch mit dem Schaltbild Bild 15 aus dem Buch von Konrad Zuse „Der Computer mein Lebenswerk“

****Alle hier verwendeten  Schaltpläne können unter der Adresse zuse.zib.de heruntergeladen werden****

 

 

 

Das erzeugte bei mir gleich die Vorstellung, dass man das doch sehr gut auf einem modernen Rechner simulieren könnte. Bei  dieser Z3-Simulation sollten Funktionsbauteile, im wesentlichen Relais, innerhalb einer der Simulationsfunktion möglichst naturgetreu nachgebildet werden, zB.  auch die Relais-An- und -Abfallverzögerung. Diese Simulationsbausteine werden dann mittels Verdrahtungslisten verdrahtet. Die Verdrahtungslisten eine 1:1 Umsetzung der Original-Schaltpläne dar. Für das Umsetzen soll keine elektrotechnische Erfahrung notwendig sein. Es soll sozusagen jeder machen können.

Aber woher bekommt man diese Schaltpläne? Es gab verschiedene Ideen. Eine davon war, dass mein Sohn bei Konrad Zuse direkt nachfragte. Freundlicher Weise hat Herr Zuse uns prompt geantwortet. Hier das Antwortschreiben von Konrad Zuse:

Brief von Konrad Zuse:

 

Teil 1-3

To top

Wir hatten damals den Brief so interpretiert, dass die Schaltbilder nicht verfügbar sind und das Projekt wurde aufgegeben. War wahrscheinlich eine Fehlinterpretation. Leider gab es damals noch kein GOOGLE.

 

Im April dieses Jahres gab es die zweite Gelegenheit. Die Universität Erlangen feierte die Restaurierung der Z23. Dieser Rechner ist nun wieder voll funktionsfähig und wurde einem großen Publikum vorgeführt. Professor Hort Zuse hat hierzu einen Vortrag über den von ihm durchgeführten Nachbau der Z3 gehalten. Da sah ich meine Chance und habe nach dem Vortrag  Professor Zuse angesprochen ob er mir ob er mir einen Tipp geben kann wie man sich die Schaltbilder der Zuse Z3 besorgen kann. Seine Empfehlung war das von Prof. Rojas heraus gebrachtes neues Buch „Die Rechenmaschinen von Konrad Zuse  “. Nach Nachforschungen im Internet bekam ich den Eindruck, dass hier im Wesentlichen die Teilschaltungen aus Zuses Patenanmeldungen beschrieben werden und keine Gesamtschaltung der Z3 . Nachdem mir mein Funkfreund Klaus DJ6LB das Buch aus der Uni-Bibliothek besorgt hatte wurde dies bestätigt. Das Buch war für einen direkten Nachbau nicht ausreichend. Hilfreich ist das Buch trotzdem, da viele Erklärungen der Funktionen vorhanden waren.

Nun der 3. Versuch, ich brauche die kompletten Schaltungsunterlagen. Inzwischen gibt es ja das Internet, und da hatte Horst DL1HO einen vollständigen Satz der Z3-Schaltpläne gefunden. Diese Schaltpläne wurden gezeichnet als Konrad Zuse einen Nachbau der Z3 für das Deutsche Museum in München erstellte. Die originale Rechner Z3 wurde während des 2.Weltkrieges 1943 samt allen Schaltunterlagen zerstört. Konrad Zuse musste nach seinen Erinnerungen die Schaltpläne neu erstellen. Hilfreich dabei  waren, die bereits oben erwähnten, ausführlichen Patentanmeldungen von 1936 bis 1944.

Nun konntw mich nichts mehr an der Realisierung der Zuse Z3 hindern.

Aber vorher ein paar Worte über Konrad Zuse und seinen Rechner.

Konrad Zuse

Konrad Zuse hatte sein Studium als Bauingenieur abgeschlossen und arbeitete als Statiker bei den Henschel-Flugzeug-Werken in Berlin-Schönefeld. Da bei seiner Tätigkeit viele gleichartige Berechnungen durchzuführen waren, kam er zu der Überzeugung, dass dies automatisiert werden sollte. Sein erster Rechner die Z1 entwickelte er ab 1936 und er wurde 1938 fertig gestellt. Er hatte ein rein mechanisches Rechenwerk. Um Platz für die Konstruktion und Aufbau des neuen Rechners zu bekommen, haben seine Eltern ihr Wohnzimmer ausgeräumt. Der erste Rechner die Zuse Z1 war voll mechanisch realisiert. Das Rechenprogramm wurde über einen 35mm-Filmstreifen mit 8-Lochkodierung in den Rechner eingelesen und die Berechnung mit verschiebbaren Blechen durchgeführt. Die Rechenoperationen wurden in Festpunkt-Arithmetik durch geführt. Bereits dieser ersten Rechner enthielt alle Grundprinzipen, die auch bei den nachfolgenden Rechnern mit Relais beibehalten wurden und auch heute noch ihre Gültigkeit haben. Leider war die Z1 relativ unzuverlässig. Nun baute Konrad Zuse Z2, die bereits elektromechanisch war und aus gebrauchten Postrelais bestand. Die nachfolgende Z3 gilt als erster voll funktionsfähiger programmierbarer Rechner. Es gibt es jedoch Gegenmeinungen, hautsächlich aus England und den USA.

Die Frage dabei ist, welche Eigenschaften muss ein richtiger Rechner erfüllen, darf ein Rechner mit elektromechanischen Relais aufgebaut sein oder müssen es elektronische Bauteile (Röhren) sein?

 

Funktionsvergleich der frühesten Rechner

Computer

Land

Inbetrieb-nahme

Gleitkomma-
arithmetik

Binär

Elektronisch

Programmierbar

Turingmächtig

Zuse Z3

Deutschland

Mai 1941

Ja

Ja

Nein

Ja, mit Lochstreifen

jein

Atanasoff-Berry-Computer

USA

Sommer 1941

Nein

Ja

Ja

Nein

Nein

Mark I

USA

1944

Nein

Nein

Nein

Ja, mit Lochstreifen

Ja

Zuse Z4

Deutschland

März 1945

Ja

Ja

Nein

Ja, mit Lochstreifen

Ja

ENIAC

USA

1946

Nein

Nein

Ja

Teilweise, durch Neuverkabelung

Ja

ENIAC

USA

1948

Nein

Nein

Ja

Ja, mit einer Matrix aus Widerständen

Ja

 

Ein weiterer wesentlicher Streitpunkt ist ob die Z3 turningmächig (bedingte Sprünge) ist. Erst im Nachhinein wurde festgestellt, dass mit der Z3 mittels eines Tricks bedingte Abbrüche möglich sind. Dieser Umstand war von Zuse nicht geplant und nie ausgenutzt. Was mich an der Z3 begeistert, ist der Umstand, dass sie binär rechnet und dass sie fortschrittliche Gleitkomma-Operationen ausführen kann. Gerade das sind Eigenschaften, die bei den anderen Rechnern erst viele Jahre später realisiert wurden.  Auch der Siemensrechner 2002 von 1958 hat noch dezimal gerechnet.

Bei der Fa.  Zuse wurden bis 1956 nur  Rechner mit Relais gebaut. 1957 kam die Zuse Z22 mit elektronischen Röhren und einem Kernspeicher auf dem Markt. 1958 wurde der erste Rechner Z23 mit Halbleitern ausgeliefert.

An diesem Rechner Z23 konnte ich 1968 während meines Studiums am Ohm-Polytechnikum Nürnberg programmieren.

Die Rechner Z1, Z2 und Z3 wurden währen des Krieges in Berlin durch Bomben zerstört. Die Z4 konnte noch rechtzeitig in Süddeutschland in Sicherheit gebracht werden. Sie wurde ab 1950 in der Schweiz kommerziell eingesetzt.Leider ist die Fa. Zuse 1967in Konkurs gegangen. Sie Wurde im Endeffekt von Siemens übernommen. Der Name Zuse als Firma ist damit verschwunden.

 

Realisierung der Z3

Nun komme ich zurück zu dem Objekt meines Interesses, die Zuse Z3.

Datenblatt

 

der Zuse Z3

 

 

 

Technik

 

600 Relais Rechenwerk,

1600 Relais im Speicherwerk einschließlich Adressdecodierer

Taktfrequenz

 

5 Hertz

Rechenwerk

Operationszeiten

 

Gleitkommarechenwerk

3 Takte Addition, 0.7 Sek

bis 5 Takte Subtraktion, bis 1 Sek

16 Takte Multiplikation, 3.2 Sek

18 Takte Division, 3.6 Sek

20 Takte Quadratwurzel, 4 Sek

bis 42 Takte Konvertierung von Dezimal nach Binär, bis 8.4 Sek

 

 

 

Eingabe

 

Dezimaltastatur  4 Dezimalstellen mit Kommaeingabe

Ausgabe

 

Lampenanzeige, 4 Dezimalstellen mit Kommaanzeige

Wortlänge

 

22 Bit, Mantisse 14Stellen, Exponent 7 Stellen, 1 Stelle VZ

 

 

 

Anzahl Schrittschalter

 

8 für Mikroprogrammsteuerung im Gleitkommarechenwerk

Speicheraufbau

 

1400 Relais, 64 Worte à 22 Bit

Leistungsaufnahme

 

Ca. 4000 Watt

Gewicht

 

Ca. 1000 kg

Einsatzgebiet

 

Flugzeug-Flügelberechnungen (Flatterproblem)

 

 

 

 

 

 

Kommentare

 

Die Z3 ist der erste funktionierende programmgesteuerte Rechner der Welt. Die Z3 wurde 1944 durch Bomben zerstört, Methfesselstraße 7/10 in Berlin-Kreuzberg. Ein Nachbau der Z3 steht im Deutschen Museum in München.

 

 

Teil 1-4

To top

 

Meine Vorstellungen

 

Der Wusch eine Z3 auf einem modernen Rechner zu simulieren wurde wahrscheinlich auch dadurch gestärkt, dass ich im Studium ein Wahlfach „Programmieren an der Zuse Z23 mit der Programmiersprache Algol (1968)“ belegt hatte. Nach dem Durchlesen des Buches „Der Computer mein Lebenswerk“ im Jahre 1995 hatte ich sofort ein Progrämmchen mit einen Relaissimulator geschrieben.

 

Eigenschaften des Simulation?

1.      Direkte Übertragung des Schaltplans in Listen welche vom Simulator abgearbeitet werden

2.      Die Simulation soll sich genauso verhalten wie das Original

3.      Deshalb müssen die simulierten Bauteile das gleiche Verhalten wie das Originalbauteile haben. ZB. soll die Zeitverhalten der Simulation mit dem des Original identisch sein.

4.      Relais müssen verzögert Ansprechen und Abfallen. Zu kurze Impulse dürfen zu keinem Ansprechen eines Relais führen

5.      Die Signalkette muss mit der Originalgeschwindigkeit durch eine Bauteilkette weiter geleitet werden.

6.      Der Zustand aller Bauteile und der Signale müssen zu jedem Zeitpunkt dargestellt werden können.

7.      Die oben geforderten Bedingungen ermöglichen, dass alle Relais- und Signalzustände zeitgerecht dargestellt und damit auch demonstriert werden können. Weiterhin wird dadurch eine Fehlersuche  unterstützt.

8.      Die beste und einfachste Lösung erscheint mir zu sein, wenn bei der Simulation alle Bauteile zyklisch, mit einer genügend hoher zeitlichen Auflösung (ca. 0.1…1mSek), abgearbeitet werden.

9.       Die zeitabhängigen Funktionen werden mittels nummerischer Integration dargestellt.

 

Realisierung des Simulators  Z3  

1.      Das Simulations-Programm wird in C programmiert.

2.      Zumindest alle binären Funktionen wie Rechenwerk, Planwerk und Speicherwerk sollen in der Simulation das direkte Abbild des Originals darstellen

3.      Binär-Dezimalumsetzung für die Eingabe und Anzeige werde zuerst in C programmiert

4.      Die Ein- und Ausgabe wird während der Testphase über die Windows-Konsole durchgeführt.

5.      Das Rechenprogramm wird nicht mittels Lochstreifenleser sondern als Textfile vorgegeben.

6.      Die Z3-Eingabe und -Ausgabe kann durch Graphikfunktionen am PC-Bildschirm erfolgen oder wie beim Original mittels Taster und Lampen. Bei einer endgültigen Variante kann es Sinn machen, dass die Binär-Dezimalumsetzung doch mit simulierten Relais realisiert wird.

7.      Es ist eine ausführliche Protokollierung erforderlich.

8.      Die Realisierung, Parametrierung und der Test wird auf dem Windows-PC durchgeführt.

9.      Später kann das System auf eine andere Plattform  portiert werden. Interessant wäre dafür ein kleiner Rechner wie ein Raspberry, zusammen mit der gleichen Bedientafel wie das Original. Es ist hierfür eine CPU-Leistung von mindesten 1GHz erforderlich.

 

Was kann man mit dieser Z3 gemacht werden?

1.      Eigentlich das Gleiche wie mit dem Original und damit einfach damit Vorführungen, Schulungen, Tests usw. machen, oder auch nur einfach Spielen.

2.      Man könnte eine Z3 mit erweiternden Funktionen realisieren. Was mich am meisten interessieren würde ist die Implementation von bedingten Sprüngen.

 

Z3 mit bedingten Sprüngen

Konrad Zuse hat so viel interessante Ideen entwickelt was man mit einem Rechner alles anfangen könnte.

Insofern wundert es mich, dass er bei der Z3 keine bedingten Sprünge realisiert hat. Der Zusatzaufwand scheint gering. Funktional ist fast alles vorhanden. Ich könnte mir vorstellen, dass als 1. Variante sinngemäß IF A<B angeschlossen mit ENDIF realisiert wird. Dh., wenn die Bedingung erfüllt ist werden alle Folgeanweisungen unterdrückt bis eine ENDIF-Kennung erkannt wird.

 

 

 

 

 

Wie bauen wir eine Z3?

Was brauchen wir dazu?

Ø    Schaltpläne der Z3:

Die Originalschaltpläne sind im Bombenhagel in Berlin zusammen mit dem Rechner Z3 zerstört worden. Konrad Zuse hat 1962 begonnen eine Rekonstruktion der Z3 und der zugehörigen Schaltbilder durchzuführen. Dabei haben ihm seine umfangreichen Patentanmeldungen sowie sein umfangreiches Wissen sehr geholfen. So dass man davon ausgehen kann, dass die entstandenen Schaltplänen kaum von den Originalen abweichen.

Teil 1-5

To top

 

Ø    Schaltschrank (Simulations-Programm):

Das Schaltschrank, enthält die Einbaurahmen für Relais, Schrittwähler usw. In unserem Fall einhält er auch die Simulationsroutinen  zu jedem Bauteiltyp und die itterative Abarbeitung aller in den Schaltschränken enthaltenen Bauteile. Über 90% der Bauteile sind Relais mit 6 Wechslern.

Momentan habe ich Simulationsroutinen für Relais mit 6 und 10 Wechsler  Relais mit 6 und 15 Schliesser sowie 6 und 15 Schließer erstellt. Weiterhin gibt es Schrittwähler (Schrittanzahl parametrierbar), Schrittgeber mit 5*40 mSek-Schritten {I, II, III, IV, V} für das ‚Spiel‘. Ein-, Ausgabegerätetypen für die Dezimalanzeige sind noch nicht enthalten. Ersatzweise wird diese Funktion in C programmiert. Die Ausgabe erfolgt auf der Windows-Console.

 

Ø    Bauteile in den Schaltschrank einbauen:

Das Einbauen ist sehr einfach. Bei den Schaltplänen sind auch die Belegungen der Schaltschränke vorhanden.

Ausschnitt-Beispiel einer Schaltschrankbelegung:

 

Teil 1-6

To top

Es sind die Bezeichnungen aller Bauteile in eine Bauteil-Liste eingetragen. Das heißt man kann die hier angegebenen Bezeichnungen direkt übernehmen.

Es sind  jedoch teilweise Relais mit der gleichen Bezeichnung mehrfach vorhanden. Unterschieden werden sie durch die eingekreiste Nummer. Zuse hat diese zusätzlichen Relais benutzt, wenn 6 Wechsler eines Relais nicht ausgereichen. Alle Relais werden dabei gleichzeitig angesteuert. Die Kreise können im Programm nicht  werden. In diesem Text wird eine Ziffer in einem Kreis mit „(1)“ dargestellt. Im Programm selbst musste eine noch weitergehende C-konforme Variante, hier „_1“, gewählt werden.

ZB. wird aus dem Bauteil Ae5(1) oder Ae5(2) ein Ae5_1 oder Ae5_2.

Bei einigen Relaisbezeichnungen  Apostroph „ ´ „ verwendet.  Dies ist bei C-Programmen ebenfalls nicht  zulässig. Ersatzweise wird hier ein Tiefstrich eingesetzt,  „ ´ „ wird zu „_“.

 

Bauteillisten-Erstellung

Bei der C-Programmierung wird als Liste oft vorteilhaft eine so genannte Enum-Listen verwendet. Der Pre-Compiler mach daraus eine Nummern-Liste. Dem Bauteilnamen wird hier grundsätzlich ein „E_“ vorangestellt.

Beispiel für den Exponenten-Addierer: 

enum { E_Ae7, E_Ae6, E_Ae5, E_Ae4, E_Ae3, E_Ae2,E_Ae0, usw…......};

 

Wir wissen, dass die Z3 über 2000 Relais hat. Die alle einzugeben ist eine schöne Knochenarbeit. Zum Glück sind die Suffixe bei vielen Relais nach einem Schema vergeben.

 

Vereinfachung

C bietet uns die Möglichkeit dies stark zu vereinfachen:

Definition des Schemas:

#define Ex9(a)  a##8, a##7, a##6, a##5, a##4, a##3, a##2, a##1, a##0   

 

Das “##” bedeutet, dass die anschließenden Zeichen (hier 8…0) an die Zeichenkette „E_Ae“ angehängt wird. Der Pre-Compiler geht durch das enum-Statement und ersetzt Ex9(E_Ae) durch E_Ae8, E_Ae7 … E_Ae_0. Aus einem Eintrag werden neun.

Der Eintrag für die Enum-Liste vereinfacht sich damit:

enum    {  Ex9(E_Ae), ……….};   //  für alle 9 Relais sind nur eine Abweisung erforderlich.

Das dabei erreichte Ergebnis ist für den Compiler mit dem weiter oben angegebenen Beispiel identisch.

 

Für die 1400 Relais des Speichers gibt es eine noch effektivere Vereinfachung.  Es sind daher nur 32 Bauteil-Einträge erforderlich.. Da dies nichts grundsätzlich Neues darstellt und die Relais bereits parametriert wurden,  wird hier nichtnäher darauf eingegangen.. Ein Beispiel kann im Header File des Programms Zuse Z3.h. angesehen werden.

 

Ø    Bauteile verdrahten:

Nun kennen wir alle zu verdrahtenden Bauteile. Jetzt müssen dessen Anschlüsse noch verdrahtet werden.

Die dafür notwendige Information entnehmen wir den Schaltplänen.

Ausschnitt-Beispiel des Exponenten-Addierers:

 

Teil 1-7

To top

Im nachfolgenden Beispiel soll die Verbindung

„ Relais Ac7…Ac0 Pin 31 nach Relais Ad7…Ad0 Pin 33“, sowie

„ Relais Ad7…Ad0 Pin 32 nachRel.Spule1 Ac7 Pin 0”

des Exponenten-Addierers  in die Bauteil-Verdrahtungsliste eingetragen werden.

 

Die erforderlichen Anweisungen in der "DrahtverbindungsListe"  sind wie folgend aufgebaut:

 

DrahtverbindungsListe[DrahtListeMax] = …..,

                        // Verbindung von Rel. Ac. Kontakt 31 nach Rel. Ad. Kontakt 33

            { E_Ac7, Ro31, E_Ad7, Rs33},              // Rel.Öffner Ac7 nach Rel.Schließer Ad7

            { E_Ac6, Ro31, E_Ad6, Rs33},              // Rel.Öffner Ac6 nach Rel.Schließer Ad6

            { E_Ac5, Ro31, E_Ad5, Rs33},              // Rel.Öffner Ac5 nach Rel.Schließer Ad5

            { E_Ac4, Ro31, E_Ad4, Rs33},              // Rel.Öffner Ac4 nach Rel.Schließer Ad4

            { E_Ac3, Ro31, E_Ad3, Rs33},              // Rel.Öffner Ac3 nach Rel.Schließer Ad3

            { E_Ac2, Ro31, E_Ad2, Rs33},              // Rel.Öffner Ac2 nach Rel.Schließer Ad2

            { E_Ac1, Ro31, E_Ad1, Rs33},              // Rel.Öffner Ac1 nach Rel.Schließer Ad1

            { E_Ac0, Ro31, E_Ad0, Rs33},              // Rel.Öffner Ac0 nach Rel.Schließer Ad0

            // Verbindung von Rel. Ad. nach Relais-Spule Ae. Kontakt

            { E_Ad7, Rk32, E_Ad7, Rl1},                 // Rel.Kontakt Ad7 nach Rel.Spule1 Ac7

            { E_Ad6, Rk32, E_Ad6, Rl1},                 // Rel.Kontakt Ad7 nach Rel.Spule1 Ac7

            { E_Ad5, Rk32, E_Ad5, Rl1},                 // Rel.Kontakt Ad7 nach Rel.Spule1 Ac7

            { E_Ad4, Rk32, E_Ad4, Rl1},                 // Rel.Kontakt Ad7 nach Rel.Spule1 Ac7

            { E_Ad3, Rk32, E_Ad3, Rl1},                 // Rel.Kontakt Ad7 nach Rel.Spule1 Ac7

            { E_Ad2, Rk32, E_Ad2, Rl1},                 // Rel.Kontakt Ad7 nach Rel.Spule1 Ac7

            { E_Ad1, Rk32, E_Ad1, Rl1},                 // Rel.Kontakt Ad7 nach Rel.Spule1 Ac7

            { E_Ad0, Rk32, E_Ad0, Rl1},                 // Rel.Kontakt Ad7 nach Rel.Spule1 Ac7

            usw.…..;

 

Dabei bedeutet:

E_A7    =  Bauteilbezeichnung A,           (siehe Bauteilliste)

Ro31    =  Anschluss-Nr A,                   (Ro = Öffner, 31 = Kontaktnummer)

nach

E_Ad7  =  Bauteilbezeichnung B,          (siehe  Bauteilliste)

Rs33    =  Anschluss-Nr B ,                  (Rs = Schließer, 33 = Kontaktnummer)

 

Im obigen Beispiel wird nicht nur die Verbindung für Bit 7 übernommen sondern auch die Verbindungen für die Bit6 bis Bit0. Dafür werden 8 Anweisungen benötigt. Bei der Mantisse sind es 16 Anweisungen.

 

Vereinfachung:

Um die Parametrierung wesentlich zu vereinfachen wurden Schleifenanweisungen eingeführt, die es ermöglichen mehrere Verbindungen mit einer Anweisung auszuführen. Dabei kann die Weiterschaltung zum nachfolgenden Bauteil oder/und nächsten Kontakt durchgeführt werden.

Die komplette Schleifenanweisung-Anweisung hat folgenden Aufbau:

DrahtverbindungsListe[DrahtListeMax] = …..,

                  {1,8,1,0},{2,8,1,0},                     // Schleifenanweisung

{ E_Ac7, Ro31, Ad7, Rs33},       // Verbindungsanweisung 1

{ E_Ad7, Ro32, Ae7, Rl1},         // Verbindungsanweisung 2

usw.…..;

 

            Satzstruktur der Schleifenanweisung:     …,{1,8,1,0},…

1.Zahl: 1 = Schleife des linkes Bauteils (A) ,      2 = Schleife des rechtes Bauteilts (B);

2.Zahl: 1…255  = Anzahl der Schleifenanzahl, 0 = bisherige Schleifenanzahl wird beibehalten;

            Hier bedeutet 8, dass insgesamt 8  Verbindungsanweisungen erzeugt werden.

3.Zahl: 0…255  = Schrittweite der BauteilNr. in der Bauteilliste, hier = 1.

4.Zahl: 0…3     = Schrittweite der PinNr., 0 = PinNr. Bleibt gleich

Wichtig! Die Bauteile müssen in der Bauteilliste sinnvoll aufeinanderfolgen.

 

Im obigen Beispiel können 16 Anweisungen auf 3 Anweisungen reduziert werden. Ein weiterer orteil ist, dass dabei weniger Fehler gemacht werden.

 

Besonders effektiv  ist die Schleifenverarbeitung bei der Verdrahtung der 1400 Speicherrelais wirksam.

Es sind ca.30 Einträge für die Speicherrelais erforderlich. Ohne Schleifenanweisung währen ca. 6000 Verdrahtungsanweisungen notwendig.

 

Ausnahmefall

Bisher ist die Verdrahtung eine 1:1–Übertragung vom Schaltplan zur Simulation.

Es gibt jedoch eine Ausnahme, wenn 2 Kontakte ein Signal für einen Eingang zur Verfügung stellen.

 

Teil 1-8

To top

Der Kontakt Bb6 Pin 34 und der Kontakt Bb6 Pin 33 soll mit Kontakt Ba6 Pin16 verbunden werden.

Bezüglich Signalfluss stellen Kontakt Bb6 Pin 34 und der Kontakt Bb6 Pin 33 einen Ausgang dar.

An dem Eingang Kontakt Ba6 Pin16 kann aber nur ein Drahtende und damit nur ein Ausgangspin angeschlossen werden. Außerdem wirken die beiden Ausgangskontakte von Bb6 zusammen mit dem Eingang von Ba6 Pin16 wir ein Oder. Deshalb muss dieses Oder zusätzlich simuliert werden.

Dafür wurde ein zusätzlicher Oder-Bauteiltyp, mit der Bezeichnung E_DOder, erstellt. Mit diesem E_DOder-Typ kann in der Bauteiliste ein DOder-Bauteil angelegt werden.

 

Beispiel der DOder-Anwendung:

Das DOder hat den Namen E_DOderA6 bekommen.

damit:

       {E_Bb6,Ro34,E_DOderA6,1},         // Kontakt Bb6 Pin34 an Eingang DOder Pin1

       {E_Bb6,Rs33,E_DOderA6,2},         // Kontakt Bb6 Pin33 an Eingang DOder Pin2

       {E_DOderA6,0,E_Ba6,Rs16},         // Ausgang DOder Pin0 an Kontakt Ba6 Pin16

 

Anschlusspins des DOders:

Pin 0        =   Oderausgang

Pin 1…5   =   Odereingänge 1…5

 

Durch das Einfügen des DOders wird nur eine Drahtverbindung und damit nur eine Anweisung mehr benötigt.

 

Im Umgekehrten Fall, wenn der Signalfluss von einem Kontakt auf die Eingänge beider Kontakte aufgeteilt werden soll,  wird kein DOder benötigt.

Bauteiltypen festlegen

Oben wurden die Namen der im Schaltschrank eingebauten Bauteile festgelegt. Nun muss noch zu jeden Bauteil der Bauteiltyp  definiert werden. Für die Zuordnung gibt es eine Zuordnungsliste „BTTYPEINTRAGLISTE“.  Hier wird zu jeden Bauteiltyp der Name des 1. und letzten Bauteils aus der Bauteilliste angegeben. Diese Zuordnung funktioniert nur so lange, wie die Bauteile in der Bauteilliste zum gleiche Bauteiltyp in einer Reihen stehen. Wenn das nicht durchgängig gegeben ist kann eine 2. und 3. Bauteiltyp-Zuordnung eingetragen werden. Unten ist ein Beispiel angegeben. Man kann am unteren Beispiel erkennen, dass im Allgemeinen mit nur sehr wenigen Einträgen auskommt.

 

// Bauteiltyp wird entsprechend dieser Liste in die Bauteilliste Eingetragen

//=======================================================

BTTYPEINTRAGLISTE BtTypEintragliste[BtTypEintraglisteMax] =

{

                        // Relais 6 Wechser

                        {E_RelL2W6,E_Rel6anf,E_RelW6end},   // bischer wurden nur Relais mit 6 Wechsler eingesetzt.

                        {E_SignalH,E_SigH,E_SigH},                 // ein fiktives Bauteil welches Signal = High liefert

                        {E_SignalL,E_SigL,E_SigL},                  // ein fiktives Bauteil welches Signal = Low liefert

                        // Draht-Oder-Verknüpfung

                        {E_DOder,E_DOderanf,E_DOderend},  // ein fiktives Bauteil für eine Oderverbindung

                        // Taktgeber

                        {E_StufenR40,E_Spiel,E_Spiel},// erzeugt 5*40mSek-Takte für ein Spiel

                        // Drehwähler

{E_DrehW_10,E_DdA,E_DdA},              // Drehwähler mit 10 Schaltschritte

usw  bis………………………

{E_DrehW_21,E_WdA,E_WdA},            // Drehwähler mit 21 Schaltschritte

                        // Speicherrrelais

                        {E_RelL2W6,Ca01,Ca022+64},              // Speicherrelias

{E_RelL2W6,Cc01,Cc05+64},                // Relais des Adderessdecodierers

{E_DOder,DOderS1,DOderS22+64},       // erforderkiche Oderanweisungen

                        {BtTypEintraglisteEnde,0,0}                   // Ende der BtTypzuweisungsliste

};

 

Oben sind die Anweisungen aufgeführt,  die zur Eintragung aller bisher verwendeten Bauteiltypen erforderlich sind.

Beispiel für die Eintragung der Relais mit 6 Wechsler:     {E_RelL2W6,E_Rel6anf,E_RelW6end},  

            E_RelL2W6      gibt den einzutragenden Bauteityp an

E_Rel6anf         gibt den Anfang des Eintrages in der Bauteilliste an

                        In der Bauteilliste wurde hierfür ein fiktives Bauteil für die Anfangskennung eingefügt

E_RelW6end     gibt das Ende des Eintrages in der Bauteilliste an

                        In der Bauteilliste wurde hierfür ein fiktives Bauteil für die Endekennung eingefügt

Durch diese Anweisung in der Bauteilliste werden vom Simulationsprogram ca. 500 mal der Relaistyp „E_RelL2W6“ eingetragen.

 

// Liste der vorhandenen BauteilTypen. Nur parametrieren, wenn neuer BauteilTyp erstellt wurde !!

//=================================================================================

enum {

            E_BauteilTypAnf,                      // Nr = 0 nicht verwenden

            E_SignalL, E_SignalH,              // liefert Signal = 0 bzw. Signal = 1        

            E_DOder,                                 // Oder-Verbindung, wird als zusätzliches Bt benötigt

            E_RelL1W6,                             // Relais mit 1 Rel.Spule und 6 Wechsler ( Anzahl parametrierbar)

            E_RelL2W6                              // Relais mit 2 Rel.Spulen und 6 Wechsler ( Anzahl parametrierbar)

            E_RelL1S6                               // Relais mit 1 Rel.Spule und 6 Schließer ( Anzahl parametrierbar)

E_RelL2S6                               // Relais mit 2 Rel.Spulen und 6 Schließer ( Anzahl parametrierbar)

            E_RelL1O6                               // Relais mit 1 Rel.Spule und 6 Öffner ( Anzahl parametrierbar)

            E_RelL2O6                               // Relais mit 2 Rel.Spulen und 6 Öffner ( Anzahl parametrierbar)

            E_DrehW_10,                           // DrehWähler mit 10 Schritte

E_DrehW_14,                           // DrehWähler mit 14 Schritte

E_DrehW_17,                           // DrehWähler mit 17 Schritte

E_DrehW_21,                           // DrehWähler mit 21 Schritte ( bis 29 Schritte parametrierbar)

            E_StufenR40,                           // erzeugt 5*40mSek-Takte für ein Spiel

            E_TaktR40,                              // erzeugt einen 40mSek-Takt ( Takt paramertierbar)

            E_BauteilTypEnde                    // Kennung Listenende

};

// Kontakt-Nummerierung  der verwendeten Bauteile entsprechend den Zuse-Schaltplänen

//*****************************************************************************************************

// Relais mit 6 Wechsler

//-------------------------

#define Rl1        0                      // Relaisspule 1

#define Rl2        1                      // Relaisspule 2

#define Ro11     4                      // Öffner

#define Rk12     2                      // Mitte W1

#define Rs13     3                      // Schließer

#define Ro14     7                      // Öffner

#define Rk15     5                      // Mitte  W2

#define Rs16     6                      // Schließer

#define Ro21     10                    // Öffner

#define Rk22     8                      // Mitte  W3

#define Rs23     9                      // Schließer

#define Ro24     13                    // Öffner

#define Rk25     11                    // Mitte  W4

#define Rs26     12                    // Schließer

#define Ro31     16                    // Öffner

#define Rk32     14                    // Mitte  W5

#define Rs33     15                    // Schließer

#define Ro34     19                    // Öffner

#define Rk35     17                    // Mitte  W6

#define Rs36     18                    // Schließer

 

// Drehwähler

//-----------------

// Für die Schaltstufen des Drehwählers werden wie im Schaltplan nur die Stufen-Nr. angegeben.

// weiterhin gibt es die Kontakte für:

#define DWl1    31                    // Erregerspule,  nur bei Schalterebene A wirksam

#define DWk1   30                    // Verteilerkontakt (Eingang), für alle Schalterebenen A...F

 

// DrahtOder

//-----------------

// Anschlusspins des DOders:

// 0       =   Oderausgang

// 1…5              =   Odereingänge 1…5

 

// Stützpunkte für Taktkombinationen innerhalb eines Spiels

//---------------------------------------------------------

#define SP_I                             E_Spiel,1                                

#define SP_II                            E_Spiel,2

#define SP_III                           E_Spiel,3

#define SP_IV                           E_Spiel,4                                

#define SP_V                           E_Spiel,5                                

#define SP_I_II                          E_DOder_I_II,0

#define SP_I_II_III                      E_DOder_I_II_III,0         

#define SP_II_III            E_DOder_II_III,0           

#define SP_IV_V                       E_DOder_IV_V,0

#define SP_III_IV_V                   E_DOder_III_IV_V,0

#define SP_V_I_II                      E_DOder_V_I_II,0         

Im Schaltplan wird dabei für SP_I_II_III nur I_II_II angegeben.

 

// Stützpunkte mit Pegel = 1

//-----------------------------

#define SP_G                           E_SigH,0                                 //

#define SP_G1                         E_SigH,0

#define SP_G2                         E_SigH,0

#define SP_G3                         E_SigH,0

#define SP_G4                         E_SigH,0

#define SP_G5                         E_SigH,0

#define SP_G6                         E_SigH,0

#define SP_G7                         E_SigH,0

#define SP_G8                         E_SigH,0

#define SP_G9                         E_SigH,0

Im Schaltplan wird dabei für SP_G1 nur G1 angegeben.

 

SimulationsProgramm

Wird in Teil 2 fortgeführt.

Das Simulationsprogramm hat folgende Aufgaben:

-          Die oben beschriebene Parametrierung wird optimiert für die Anwendung der Simulation aufbereitet.

-          Die zu Bauteile werden zyklisch im 0.2mSek-Takt entsprechend einer Abarbeitungsliste, den Bauteiltaten, der Bauteilverdrahtung und den jeweils aktuellen Bauteilstatus simuliert.

-          Für die Testphase gibt es eine Ein-, Ausgabe-Konsole.

-          Protokolldaten werden in eine Datei abgespeichert oder in einem Protokollfenster angezeigt.

-          Das Einlesen des Rechenprogramms wird nicht wie beim Original nicht vom Lochstreifen sondern aus einer Textdatei eingelesen.

-          Die endgültige Ein-, Ausgabe-Oberfläche  wird  weitgehend  gleich der Bedienoberfläche des Originals sein.

Bedienoberfläche

Wird in Teil 2 fortgeführt.

Projektfortschritt

26. 4.2015   Konzepterstellung

  1. 4.2015   Beginn der Z3-Simulations-Programms

15. 4.2015   Beginn der Mantissen-Addition

20. 4.2015   Umstellung auf vereinfachte Parametereingabe

24. 4.2015   Exponenten-Addition fertig

  8. 5.2015   Große Wechselstraße fertig

14. 5.2015   einfache Konsolenbedienung fertig

24. 5.2015   Bauteil-Kontaktnummernbezeichnung entsprechen Zuse Schaltplänen umgestellt

27. 5.2015   Implementierung des Speicherwerks einschließlich der Adressdekodierung (nicht getestet)

Resümee

-          Mit dem oben beschriebenen Verfahren ist man in der Lage die von Konrad Zuse bereitgestellten Schaltbilder der Zuse Z3 für die Simulation, durch Erstellung von Listen, aufzubereiten.

-          Das Simulationsprogramm wandelt die oben erstellten Listen in eine für die Simulation geeignete Form um.

-          Bisher wurden alle Relais parametriert und die Verdrahtung für die

o       Mantissen-Addition, Exponenten-Addition entsprechen Schaltbild 3/004 teilweise 3/002 und 3005

o       Große Weichenstraße entsprechend Schaltbild 3/003, sowie für den

o       Datenspeicher mit Adressdecodierer entsprechend Schaltbild 3/010, 3/011 und 3/013

realisiert.

-          Alle Funktionen bis auf den Speicher sind getestet.

-          Im Simulationspragramm sind bereits alle Simulationsroutinen realisiert die für das Rechenwerk und den Speicher erforderlich sind, zB. auch der Drehwähler .

-          Für den Test wurde eine Eingabefunktion in C sowie eine ausführliche Testprotokollierung erstellt.

-          Die Realisierung der Binär/Dezimal-Kodierung zur Eingabe und Anzeige werden erst realisiert, wenn alle anderen  Funktionen getestet sind.

-          Mit diesem Simulationskonzept kann das Schalten (Knacken) aller Relais mittels Analog- oder Digitalausgabe am Lautsprecher hörbar gemacht werden.

 

Ich würde mich sehr freuen, wenn sich jemand bei der Fertigstellung der Verdrahtung oder an der Erstellung einer „originalen“ Z3-Ein-/ Ausgabe-Konsole beteiligen würde.

 

Diese Website nutzt ausschließlich technisch erforderliche Cookies. Wir benutzen keine Cookies, die eine Einwilligung erfordern würden. Weitere Informationen finden Sie in unserer Datenschutzerklärung. X