Ich versuche, digitale Schaltungen zu simulieren. Das ist ganz einfach gehalten. Es gibt keine Spannungspegel oder so, sondern nur ob eine Leitung aktiv ist oder nicht.
Zur Veranschaulichung ein Beispiel:
Simple Schaltung:
Links oben ist eine Dauerversorgung. Dinge, die daran angschlossen sind, sind immer aktiv.
Rechts die roten Kreise sind LEDs die den Zustand der Leitung, an die sie angeschlossen sind, wiederspiegeln.
Ganz unten ist eine Verbindung zu was anderem in der Schaltung. Solche Verbindungen sind bidirektional.
In der Mitte ein Relais mit einem Wechslerkontakt (wovon nur der Öffner verwendet wird).
Man beachte, dass hier nirgends Masse-Leitungen eingezeichnet sind. Da alle Bauteile sowieso immer fix an Masse angeschlossen sind, ist es unnötig, diese Leitungen auch noch einzuzeichnen. Dass die LEDs eine andere Betriebsspannung als die Relais haben ist hier auch irrelevant. Es geht wie gesagt nur darum, festzustellen, ob eine Leitung bzw. ein Bauteil aktiv ist.
Eine Leitung ist dann aktiv, wenn mindestens ein Bauteil ein Signal "auf die Leitung sendet". Und das ist auch nicht wie z.B. bei TTL, dass zwei Ausgänge nicht direkt verbunden werden dürfen da sonst bei unterschiedlichen Ausgangszuständen ein Kurzschluss entsteht. Wenn eine Leitung nicht aktiv ist, dann bedeutet das hier, dass sie einfach nicht mit der Versorgungsspannung verbunden ist.
Hier wird links der Zustand der Schaltung gezeigt, wenn von der Verbindung unten kein Signal kommt. Die Leitungen C sind nicht aktiv, die rechte LED deshalb auch nicht, das Relais zeiht nicht an, verbindet dadurch die Leitungen A und B, es entsteht eine Verbindung von der Versorgung zur linken LED und somit ist diese aktiv.
Rechts daneben das Gegenteil. Von der Verbindung unten kommt ein Signal zu C, die rechte LED ist aktiv, das Relais auch und zieht an, trennt dadurch A und B und dadurch ist die linke LED nicht mehr aktiv.
Die Schaltung sollte "Schritt für Schritt" simulierbar sein. Das heißt, bei jedem Schritt wird zuerst der neue Zustand aller Bauteile und Leitungen berechnet und dann erst werden alle Zustände übernommen. Sinn der Sache ist der: Da auch "Rekursionen" wie diese vorkommen können:
, würde die Simulation hier nie fertig werden und je nach Implementierung eine Endlosschleife oder einen StackOverflow zur Folge haben.
Davon abgesehen möchte ich wissen, wie lange es dauert, bis sich in einer Schaltung keine Zustände mehr verändern.
Das sollte aber nicht so weit gehen, dass einzelne Leitunssegmente pro Simulationsschitt berechnet werden:
Es ist auch OK, wenn Leitungen sofort neu berechnet werden, sobald z.B. ein Relais einen Kontakt schaltet. Nur umgekehrt sollte es nicht sein: Bauteile sollten ihre Zustände nicht sofort verändern, wenn sich die Zustände von angeschlossenen Leitungen verändern.
Wichtig ist für mich auch, dass unnötige Updates vermieden werden. Wenn z.B. eien Leitung bereits aktiv ist und durch eine Veränderung eine Weitere Verbindung zu einer Versorgung hergestellt wird, dann sollen nicht nochmal alle Teile der Leitung und alle angeschlossenen Bauteile neu berechnet werden. Das System sollte nämlich auch bei größeren Schaltungen um die 20000 Objekte nicht mit Updates explodieren.
Eine Sache noch: Der gespeicherte Zustand soll möglichst nicht direkt in den Objekten, die die Bauteile und Leitungen repräsentieren, verpackt sein, sondern in separaten, klonbaren Datenstrukturen gespeichert sein. Sinn der Sache ist der: Ich möchte die Zustände zwischenspeichern können, ohne dabei alle Informationen der Bauteile mitzukopieren. Dadurch kann ich nach jedem Schritt prüfen, ob die neuen Zustände gleich den alten sind bzw. "Backups" von Zuständen machen und diese später wieder laden.
Dabei wird hilfreich sein, dass jedes Bauteil bzw. jede Leitung und jeder Anschluss eine GUID besitzt. Diese wird bereits zum Abspeichern verwendet und kann sicher auch verwendet werden, um festzustellen, welche Simulationszustände zu welchem Bauteil gehören.
Also wenn jemand Ideen hat, wie man sowas hinbekommt, dann immer her damit. Wenn irgendwas unklar bzw. nicht ausreichend erklärt ist, erkläre ich das gerne genauer.
Zur Veranschaulichung ein Beispiel:
Simple Schaltung:
Links oben ist eine Dauerversorgung. Dinge, die daran angschlossen sind, sind immer aktiv.
Rechts die roten Kreise sind LEDs die den Zustand der Leitung, an die sie angeschlossen sind, wiederspiegeln.
Ganz unten ist eine Verbindung zu was anderem in der Schaltung. Solche Verbindungen sind bidirektional.
In der Mitte ein Relais mit einem Wechslerkontakt (wovon nur der Öffner verwendet wird).
Man beachte, dass hier nirgends Masse-Leitungen eingezeichnet sind. Da alle Bauteile sowieso immer fix an Masse angeschlossen sind, ist es unnötig, diese Leitungen auch noch einzuzeichnen. Dass die LEDs eine andere Betriebsspannung als die Relais haben ist hier auch irrelevant. Es geht wie gesagt nur darum, festzustellen, ob eine Leitung bzw. ein Bauteil aktiv ist.
Eine Leitung ist dann aktiv, wenn mindestens ein Bauteil ein Signal "auf die Leitung sendet". Und das ist auch nicht wie z.B. bei TTL, dass zwei Ausgänge nicht direkt verbunden werden dürfen da sonst bei unterschiedlichen Ausgangszuständen ein Kurzschluss entsteht. Wenn eine Leitung nicht aktiv ist, dann bedeutet das hier, dass sie einfach nicht mit der Versorgungsspannung verbunden ist.
Hier wird links der Zustand der Schaltung gezeigt, wenn von der Verbindung unten kein Signal kommt. Die Leitungen C sind nicht aktiv, die rechte LED deshalb auch nicht, das Relais zeiht nicht an, verbindet dadurch die Leitungen A und B, es entsteht eine Verbindung von der Versorgung zur linken LED und somit ist diese aktiv.
Rechts daneben das Gegenteil. Von der Verbindung unten kommt ein Signal zu C, die rechte LED ist aktiv, das Relais auch und zieht an, trennt dadurch A und B und dadurch ist die linke LED nicht mehr aktiv.
Die Schaltung sollte "Schritt für Schritt" simulierbar sein. Das heißt, bei jedem Schritt wird zuerst der neue Zustand aller Bauteile und Leitungen berechnet und dann erst werden alle Zustände übernommen. Sinn der Sache ist der: Da auch "Rekursionen" wie diese vorkommen können:
, würde die Simulation hier nie fertig werden und je nach Implementierung eine Endlosschleife oder einen StackOverflow zur Folge haben.
Davon abgesehen möchte ich wissen, wie lange es dauert, bis sich in einer Schaltung keine Zustände mehr verändern.
Das sollte aber nicht so weit gehen, dass einzelne Leitunssegmente pro Simulationsschitt berechnet werden:
Es ist auch OK, wenn Leitungen sofort neu berechnet werden, sobald z.B. ein Relais einen Kontakt schaltet. Nur umgekehrt sollte es nicht sein: Bauteile sollten ihre Zustände nicht sofort verändern, wenn sich die Zustände von angeschlossenen Leitungen verändern.
Wichtig ist für mich auch, dass unnötige Updates vermieden werden. Wenn z.B. eien Leitung bereits aktiv ist und durch eine Veränderung eine Weitere Verbindung zu einer Versorgung hergestellt wird, dann sollen nicht nochmal alle Teile der Leitung und alle angeschlossenen Bauteile neu berechnet werden. Das System sollte nämlich auch bei größeren Schaltungen um die 20000 Objekte nicht mit Updates explodieren.
Eine Sache noch: Der gespeicherte Zustand soll möglichst nicht direkt in den Objekten, die die Bauteile und Leitungen repräsentieren, verpackt sein, sondern in separaten, klonbaren Datenstrukturen gespeichert sein. Sinn der Sache ist der: Ich möchte die Zustände zwischenspeichern können, ohne dabei alle Informationen der Bauteile mitzukopieren. Dadurch kann ich nach jedem Schritt prüfen, ob die neuen Zustände gleich den alten sind bzw. "Backups" von Zuständen machen und diese später wieder laden.
Dabei wird hilfreich sein, dass jedes Bauteil bzw. jede Leitung und jeder Anschluss eine GUID besitzt. Diese wird bereits zum Abspeichern verwendet und kann sicher auch verwendet werden, um festzustellen, welche Simulationszustände zu welchem Bauteil gehören.
Also wenn jemand Ideen hat, wie man sowas hinbekommt, dann immer her damit. Wenn irgendwas unklar bzw. nicht ausreichend erklärt ist, erkläre ich das gerne genauer.
"Luckily luh... luckily it wasn't poi-"
-- Brady in Wonderland, 23. Februar 2015, 1:56
Desktop Pinner | ApplicationSettings | OnUtils
-- Brady in Wonderland, 23. Februar 2015, 1:56
Desktop Pinner | ApplicationSettings | OnUtils