Logische Gatter verbinden

  • Hallo zusammen.


    Ich habe mal eine etwas schwierige und sehr technische Frage. Ich komme da mit meiner Kopflogik einfach nicht weiter, vielleicht weil ich zu kompliziert denke.


    Ich bin unter anderem derzeit bei einem Projekt, mit dem ich logische Schaltungen überprüfen und ansehnlich machen kann. Das sieht wie folgt aus.


    Ich habe ein paar Gatter zur Verfügung die ich entsprechend mit "Kabeln" verbinden möchte. In diese Gatter speise ich ein Signal ein, und je nachdem welche Gatter aktiviert werden usw. kommt halt entsprechendes Ausgangssignal am Ende an. Also eigentlich möchte ich damit Schaltungen testen die ich aufbaue.


    Jetzt habe ich allerdings das Problem, das ich teilweise Logikgatter habe, eigentlich sind es sogar die meisten, wie AND-Gates, OR-Gates etc. die zwei Eingänge und einen Ausgang haben.


    Das als Modell darzustellen ist kein Problem. Nur wenn ich da quasi ein Kabel anschließe bedeutet es ja nicht, das ich den anderen Eingang ebenfalls verkabelt habe, geschweige denn, das durch den zweiten Eingang ebenfalls ein Signal bekomme.


    Hat irgendjemand eine Idee wie ich abfragen kann welcher Eingang angeschlossen ist, bzw. auf welchem Eingang ein Signal liegt?

  • Ich bin mir nicht sicher, wie ich mir das jetzt genau vorzustellen habe.

    Probieren kann ich es ja trotzdem.


    Kannst du nicht für jeden Input einfach 2 Boolean erstellen?

    Bool 1: Connected

    Bool 2: Power


    Am Ende des Gatters checkst du einfach alle (dann 4) Bools ob die True sind und kannst beim Output dann bestimmen was Sache ist.


    (Wenn ich mir das so angucke, ist das bestimmt nicht das, was du willst :D)

  • Kannst du nicht für jeden Input einfach 2 Boolean erstellen?

    Bool 1: Connected

    Bool 2: Power

    Ich glaube das ist etwas komplizierter.


    1.Du hast zb einen Generator oder Wasserpumpe der erzeugt strom oder pumpt Wasser

    2.Du hast einen Mast

    3.Du hast eine Leitung.

    4.Einen oder mehre Verbraucher


    Strom fließt nur wenn der Generator über die Leitung am mit dem Mast verbunden ist und der Generator läuft. Schaltet man den Generator aus, müssen im Prinzip alle Boolean auf false gesetzt werden.


    Ich würde das so machen:

    1.Der Erzeuger (Wasserpumpe oder Stromaggregat erzeugt eine bestimmte menge strom. (Kwh)

    2.Die Strommenge muss in jeder Leitung und Mast gespeichert werden. SIe ändert sich also wenn das aggregat ausgeschaltet wird. Hierdurch kannst du auch bestimmen ob ein oder zwei Aggregate angeschlossen sind und ob die Strommenge ausreicht um alle Verbraucher zu versorgen.

    Reicht die Strommenge nicht aus, wird ja wahrscheinlich auch nichts funktionieren. (Erst wenn man genug Generatoren hat)


    3.Leitung mit dem Stromaggregat verbunden True/False

    4.Leitung mit einem Verbraucher verbunden. True/False


    Ist die Leitung mit einem Verbraucher verbunden, wie viel Strom braucht dieser Verbraucher.

    Sind es mehre Verbraucher, wird der Verbrauch aller addiert ist die Menge kleiner als das was erzeugt wird, gibts einen Stromausfall.


    1.Strommenge (Erzeuger) (kwh)

    2.Verbrauch beim Verbraucher (Kwh)

    3.Ist die Leitung und/oder der Mast mit dem Erzeuger verbunden (True/false)

    4.Ist die Leitung und/oder der Mast mit der Verbraucher verbunden. (True/false)


    Daraus kannst du meiner Meinung nach so ziemlich alles berechnen wenn du diese Informationen überall speicherst und prüfst sobsobald etwas ans Stromnetz angeschlossen und gelöscht wird.

    You may love to play games, but that doesn’t make you a developer.
    I love to eat dinner, but that doesn’t make me a chef.

  • Sleepy da hast du bestimmt Recht, aber ich bin davon ausgegangen, dass er bereits ein System hat. Möglicherweise berechnet er in seinem Projekt keine Stromleistung und es geht rein um die Logik dahinter.

    Das als Modell darzustellen ist kein Problem. Nur wenn ich da quasi ein Kabel anschließe bedeutet es ja nicht, das ich den anderen Eingang ebenfalls verkabelt habe, geschweige denn, das durch den zweiten Eingang ebenfalls ein Signal bekomme.


    Wenn dem so ist, kann man 1 & 2 weg lassen (glaube ich :D) und durch "Power" ersetzen. Damit hätte man dann 3 Bools je Kabel die auf True sein müssen, damit eine Connection im Gatter ebenfalls auf True steht.

    3.Ist die Leitung und/oder der Mast mit dem Erzeuger verbunden (True/false)

    4.Ist die Leitung und/oder der Mast mit der Verbraucher verbunden. (True/false)

  • Wenn dem so ist, kann man 1 & 2 weg lassen (glaube ich :D) und durch "Power" ersetzen. Damit hätte man dann 3 Bools je Kabel die auf True sein müssen, damit eine Connection im Gatter ebenfalls auf True steht.

    Stell dir ein vor du würdest nur Strommasten und Leitungen bauen. Ohne Verbraucher und ohne Erzeuger. Der Durchfluss ist also = 0

    Kommt nur ein Verbraucher dazu zb eine Glühbirne dann ist der Verbrauch zb bei 40 wh sind es 2 Birnen sind 80 Wh

    Ist kein Generator angeschlossen oder ist er ausgeschlaten, dann brauchst du auch nichts rechnen.


    Bei einem Computer ist der Verbrauch nicht immer gleich er ist mal mehr und mal weniger. Der Verbrauch pro Tick aller Verbraucher ist also die Menge an Strom die insgesamt benötigt wird das alles auf True ist und läuft.


    Du kannst also unabhängig davon wie viel Strom du verbrauchst, alle Verbraucher addieren und per Tick abfragen. Das kann stark schwanken. zb 1000 kwh

    Gleichzeitig kannst du alle Generatoren die Strom erzeugen addieren. 11 Generaoren machen jeweils 100kwh.


    Den erzeugst du nicht genug Strom, dann gibts einen Stromausfall und dann wäre der Strom = 0 und das wohl du einen Generator dranhast und obwohl strom = True ist,


    Du musst also nicht nur messen ob Strom fließt sondern auch wie viel Strom fließt


    Den Verbrauch sekündlich per Tick neu ermitteln und mit den Generatoren vergleichen.


    Verstehst wie ich meine und warum ich das mit Power ON/Off nicht machen würde,

    You may love to play games, but that doesn’t make you a developer.
    I love to eat dinner, but that doesn’t make me a chef.

  • Verstehst wie ich meine und warum ich das mit Power ON/Off nicht machen würde,

    Na klar, aber da kommt es doch darauf an, ob es in seinem Projekt überhaupt relevant ist wieviel Strom generiert und verbraucht wird.


    Ist sein System für eine Stadt, einen Haushalt oder ähnliches, ist dein Vorschlag garantiert der Richtige.

    Möchte er aber einen Taschenrechner, Prozessor, Speicher simulieren, also irgendetwas wo nur der Ablauf, also die Logik ohne Stromverbrauch etc. wichtig ist, würde ich das anders machen.

    Oder übersehe ich da was?

  • Ich kann es ja mal versuchen mit Pictogrammen darzustellen.


    Dies ist das Symbol eines AND-Logikgatters, A und B sind die Eingänge, out, man kann es erahnen der Ausgang. Das Modell ist ebenfalls so aufgebaut. Also zwei Eingangsplugs und ein Ausgangsplug.


    Nun Plug ich ein "Kabel" an A und eins an B. Das Problem ist nun aber, wie frage ich ab ob eine Verbindung besteht? Also wie verfolge ich logisch die Linie. Das Signal kann ja von einem OR-Gate gesendet werden, von einem anderen AND-Gate oder was auch immer. Also ich habe ein wenig das Problem die Schlüssigkeit festzustellen und dann ein Signal durchlaufen zu lassen. Wobei Signal hier für alles steht. Es kann theoretisch Strom sein, aber in der Simulation passt Signal wohl besser.


    Wie kann ich das noch besser beschreiben?


    Vielleicht so... Es ist kein großes Problem ein Kabel anzuschließen, also dies darzustellen. Nur das Objekt muss es ja auch mitbekommen. Und am Ende muss die ganze Linie Kabel verfolgt werden und eben halt das Signal dem Kabel entlang gesendet werden.


    Jetzt habe ich es, während des Schreibens. Die meisten haben doch Minecraft bestimmt schon einmal gespielt. Redstone würde da vielleicht das am besten beschreiben. Nur halt etwas komplexer. Wobei ich die Redstonelogik bei Minecraft schon extrem komplex finde.

  • Sind deine Kabel Actors?


    Dann könntest du jedes mal wenn du ein Kabel anschließt eine Reference zum angeschlossenen Objekt speichern.

    Damit hätte ein Kabel 2 References.


    Wenn du allen Strom Actors (Kabel, And-Gate, Or-Gate etc.) ein Interface mit dem Event RecievedSignal (Als Input Variable einen Reference Actor) gibts, kannst du eine Kette bilden.


    Heute Abend kann ich es in der Engine zeigen :)

  • Ich versteh dein Problem noch nicht so ganz. Die Eingangsvariablen haben entweder keinen Wert oder 0 bzw. 1. Kein Wert bedeutet kein Anschluss. 0 bedeutet kein Signal, 1 bedeutet Signal. Damit bildest du die typischen Logikgates ab. du musst doch nur isValid prüfen und wenns das ist, schauen obs 0 oder 1 ist.

    Das Problem liegt in der Verkettung.


    Nehmen wir mal an ich habe eine Linie bestehend aus, 2 Signalgebern (Schalter), Ein AND-Gate, Ein Signalausgang (Zum Beispiel Lampe), diverse Kabel dazwischen.


    Ich baue also auf, Schalter A, mache eine lange Linie bis zum Eingang A im AND-Gate. Dann Schalter B und eine Verkabelung zu Eingang B im AND-Gate. Da fängt schon das Problem an, ich habe ja nur die Technisch/Optische Verknüpfung mit den Eingängen, ich kann aber im Code des AND-Gates nicht unterscheiden was Eingang A oder Eingang B ist, geschweige denn welcher davon jetzt ein Signal bekommt oder nicht. Das richtige Durchführen des Signals, das ist das Problem.


    Ich muss dann ja auch noch Situationen abfangen, wo eventuell eine Brücke eingebaut wurde, sprich nur ein Schalter geht gleichzeitig in A und B, auch wenn das wahrscheinlich nur aus Versehen passiert. Also kann ich dem Signal selber nicht unbedingt eine Kennung geben oder so.

  • Im AND Gate gibt es 3 Variablen A / B und O. Variable A und B können nur 0 oder 1 sein und sind standard auf 0. Folglich ist O (output) immer 0. Ist eine Variable 1 ist etwas angeschlossen und ein Signal vorhanden. Sind beide Variablen 1 dann sind beide angeschlossen und O ist 1.


    Wenn du das mit Kablen machen willst, brauchst du noch die Abfrage isValid. Ist kein Kabel angeschlossen, dann ist die Variable leer. Ist ein Kabel angeschlossen dann hat die Variable einen Wert (meist 0).


    Beim Schalter gibt es nur O (output). Ist die Variable leer dann ist kein Kabel drann. Wenn ein Kabel drann ist, dann ist die Variable o = 0 und wenn du den Schalter einknippst, dann ist die Variable O =1.


    Dein Kabel hat zwei Anschlüsse. Einen Input I und einen Output O. Wenn du den Schalter umlegst und beide Anschlusse verbunden sind, dann erhalten beide Variablen I/O den Wert 1 und dein Kabel leitet den geänderten Wert an das nächste Kabel oder das nächste Gate weiter.

  • Ich denke mal ganz OOP, dein Logikgatter muss ein Objekt sein und die für die Eingänge und evtl Ausgänge müssen 3 States berücksichtigten statt nur die Üblichen 2 States:

    NotConnected, ConnectedNoSignal und ConnectedSignal.


    Is kein Kabel angeschlossen ist der State an z.B. Eingang B NotConnected. wird ein Kabel angeschlossen wechselt Eingang B entweder auf ConnectedNoSignal oder ConnectedSignal je nach dem ob ein Signal ankommt oder nicht. Intern kann das Gatter durchaus dann eine entsprechende boolsche Operation durchführen und das Signal dann entsprechend an deinen Ausgang weiterleiten.


    Bei den Signalen muss ich mich noch was einfallen lassen...

  • Schon klar. Die Abfrage der Logik ist auch kein Problem. Die Logik ist mit rund 5-6 Nodes auch erledigt.


    Nur stell dir halt vor, ich habe ein Gate als Modell. An diesem Gate ragen hinten zwei Anschlüsse als Input raus, und einer als Output.


    Die Inputsockets benenne ich Cable_01 und Cable_02. Das muss ich bisher so machen, da der Anwender halt nur Kabel anschließen können soll. Den Output, da ich ja keine Sockets gleich benennen kann, halt Cable_03.


    Die Verbindungskabel haben auf einer Seite halt Cable_01 und auf der anderen Cable_02.


    Und Cable zu Cable kann man eben halt andocken. Wenn jetzt ein Socket XY_01oder so heißen würde kann man nicht andocken.


    Nun habe ich zwei Probleme. Das erste ist, ich muss natürlich durch einen Kabelstrang das Signal durchschleifen. Und das zweite ist, es darf natürlich nur der Anschluss reagieren an dem das Kabel gerade hängt. Von daher denke ich das ich die Überprüfung, ob überhaupt ein Kabel angeschlossen ist auch weglassen kann, weil ist keins angeschlossen kann ja auch kein Signal reingehen, bzw. beim Kabel wäre dann halt am Ende der Linie Schluss und das Signal würde ins Nirwana laufen.


    Ich glaube schlichtweg das ich ein Fehler im Interface habe, welches dafür sorgt, dass die ganze Kette quasi als eine Einheit erkannt wird. Das habe ich noch nicht ganz raus.

  • Hast du mal Mediator Pattern versucht?


    Dann wäre das Kabel halt der Vermittler, der das Signal vom Ausgang abholt zum Eingang durchschleift.

    Die Bauteile kennen sich ja nicht und sie müssen ja auch nicht wissen mit wem sie verbunden sind, außer mit dem Kabel


    Geht bestimmt auch irgendein anderes Pattern z.B. Observer. Ist ja auch nur eine Idee...