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.
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:
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
Land | Inbetrieb-nahme | ||||||
Zuse Z3 | Deutschland | Mai 1941 | Ja | Ja | Nein | Ja, mit Lochstreifen | jein |
USA | Sommer 1941 | Nein | Ja | Ja | Nein | Nein | |
USA | 1944 | Nein | Nein | Nein | Ja, mit Lochstreifen | Ja | |
Deutschland | März 1945 | Ja | Ja | Nein | Ja, mit Lochstreifen | Ja | |
USA | 1946 | Nein | Nein | Ja | Teilweise, durch Neuverkabelung | Ja | |
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. |
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.
Ø 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:
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:
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.
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.