Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [Theorie] Stromkreise (https://www.delphipraxis.net/116923-%5Btheorie%5D-stromkreise.html)

PaddyL 8. Jul 2008 19:37


[Theorie] Stromkreise
 
Liste der Anhänge anzeigen (Anzahl: 1)
Eigentlich kein Delphi spezifisches Problem, mehr theoretisch. Ich programmiere gerade an einem Programm zur Simulation von elektrischen Stromkreisen in Delphi. Das Problem ist, dass ich erstmal testen muesste ob selbige geschlossen sind. Meine bisherige Loesung ist vom Minuspool der Battery einfach eine Funktion laufen zu lassen, die dann die selbe Funktion der nachsten Schaltungskomponente aufruft und wenn sie dann irgendwann mal am Pluspool der Battery ankommt true zurueckgibt (all den Weg bis zum Anfang) oder eben false falls es keine naechste Komponente gibt.
Nochmal zur Verdeutlichung:

Code:
[Battery.TestConnection]
Result := Lampe.Ping;

[Lampe.Ping]
if [...] exists then
  Result := [...].Ping
else
  Result := False;

bis irgendwann wieder

[Battery.Ping]
Result := True;
Geht Klasse, bei Reihenschaltungen natuerlich:
http://img75.imageshack.us/img75/9572/screen1aj7.png

Bei Parallelschaltungen ist das Problem das er sich jedesmal aufteilt, der Ping, und dann immer im Kreis laeft auf der Suche nach einem Rueckgabewert. Der Ping teilt sich auf und teilt sich erneut beim zweiten Multiconnector (Multiplug im Programm genannt), was eine Kettenreaktion ausloesen wuerde (siehe Screen unten). Bisher hab ich es mal so gemacht, dass Verbindungen auf denen bereits gesendet wurde nichts mehr empfangen koennen, damit es nicht staendig abstuerzt, aber ich braechte natuerlich ne richtige Loesung.

http://img514.imageshack.us/img514/2228/screen2ix5.png

Ich hab mal ne Binary des unfertigen Programmes angehaengt damit ihr euch es besser vorstellen koennt.

Hier noch ein paar Codeauszuege wenn auch, da es so offensichtlich nicht geht und ich neue Loesungen suche, nicht unbedingt noetig:
Delphi-Quellcode:
{ A Ping alwas emerges from the negative connector
  of a battery throught all the other components
  until it reaches the battery's positive connector }
function TPTElectronicComponent.Ping(Sender: TPort): Boolean;
var
  I: Integer;
  Results: array of Boolean;
begin
  // First we need to find the Sender's ID and then
  // send the Ping to all Ports with none or the streaming
  // attribute. The Sender's attribute will be set to streamed
  // and each none will become a streaming

  // Prepare the Results
  SetLength(Results, Length(ecConnectors));

  Sender.Connector.Flag := pfStreamed;

  for I := 0 to High(ecConnectors) do
  begin
    if (ecConnectors[I].Flag = pfNone) then
    begin
      if ecConnectors[I].Used then
      begin
        ecConnectors[I].Flag := pfStreaming;
        if ecConnectors[I].Used then
        begin
          Results[I] := ecConnectors[I].Connector.Parent.Ping(ecConnectors[I]);
        end;
      end;
    end;
  end;

  // Sum up the results
  Result := False;
  for I := 0 to High(Results) do
  begin
    Result := (Result or Results[I]);
  end;

  ecPingOk := Result;
end;
Delphi-Quellcode:
{ Start a ping from the negative connector }
procedure TPTBattery.StartPing;
begin
  baOwnTest := True;
  if ecConnectors[1].Used then
  begin
    ecConnectors[1].Connector.Parent.Ping(ecConnectors[1]);
  end;
  baOwnTest := False;
end;

{ A Ping alwas emerges from the negative connector
  of a battery throught all the other components
  until it reaches the battery's positive connector }
function TPTBattery.Ping(Sender: TPort): Boolean;
begin
  Result := False;
  if (Sender.Connector = ecConnectors[0]) and (baOwnTest) then
  begin
    Result := True;
  end
  else if Sender.Connector = ecConnectors[0] then
  begin
    if ecConnectors[1].Used then
    begin
      Result := ecConnectors[1].Connector.Parent.Ping(ecConnectors[1]);
    end;
  end;
end;
Hoffe jemand kann mir helfen :|

ich2 8. Jul 2008 20:50

Re: [Theorie] Stromkreise
 
Liste der Anhänge anzeigen (Anzahl: 1)
servus,

wollte das Programm mal ausprobieren, aber leider startet es erst gar nicht (Fehler im Anhang)!

Windows XP SP2

gruß

freak4fun 8. Jul 2008 20:59

Re: [Theorie] Stromkreise
 
Liste der Anhänge anzeigen (Anzahl: 1)
Bei mir läufts, aber die Verbindungen her zustellen ist mir zu fummelig. :( Naja, ohne Schalter gehts. Hab wahrscheinlich versucht die Kabel an den falschen Enden zu fixieren oder so.
Da gibts doch Algorithmen für (A*, Pathfinding). Das da alle Möglichen Wege abgegangen werden ...

Daniel G 8. Jul 2008 22:25

Re: [Theorie] Stromkreise
 
Moin, moin,

Gefällt mir, vielleicht solltest du aber die Funktion zum öffnen und schließen noch gleichzeitig mit in das Popup-Menü verfrachten, eildieweil nicht jeder eine mittlere Maustaste hat.. ;)

Bekommen die Leitungen, die du schon abgelaufen bist, einen Wert, der sagt, dass sie schon berücksichtig worden? Du musst ja sowas wie einen Fluss erzeugen...

sx2008 8. Jul 2008 23:14

Re: [Theorie] Stromkreise
 
Oha, da hast du dir ja gleich was Schwieriges ausgesucht.
Es gibt ja die Knotenregel und die Maschenregel in elektrischen Netzwerken.
Mit diesen Regeln wird ein lineares Gleichungssystem aufgestellt und gelöst.
http://www.uni-kassel.de/fb16/tet/ww...1_Seite_A4.pdf

freak4fun 9. Jul 2008 00:30

Re: [Theorie] Stromkreise
 
In der Tat, einfach sieht das nicht aus. Vielleicht hilft die das weiter. :)

_frank_ 9. Jul 2008 00:50

Re: [Theorie] Stromkreise
 
ich finde das programm schon ziemlich gut...evtl lässt sich das mit meinem circuitboard kombinieren ;)
auch wenn das herstellen meiner Meinung nach auch ziemlich fummelig ist

//edit: link korrigiert

Gruß Frank

oki 9. Jul 2008 07:57

Re: [Theorie] Stromkreise
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin,

jetzt auch nur ein theoretischer Ansatz zur Lösung. Ich würde bei der Erstellung der Verbindungen gleich eine Flussrichtung mit angeben. Das kann durchaus automatisch geschehen. Funzen tut das natürlich nur, wenn du mit der Stromversorgung beginnst. Sonnst mußt du vor dem Finden offener Verbindungen erst für alle Verbinder und Bauteile die Flussrichtung (Strom) ermitteln. Das kannst du natürlich einmal vom Plus und einmal vom Minuspol aus tun. Danach hast du mit der Recursion in Paralelschaltungen keine Probleme mehr, da gegen die Flussrichtung nicht weiter gesucht wird.

Praktisch gesehen erstellst du also für jeden Verbindungspunkt eines Elementes eine Polarität.

[Edit] siehe Anhang; mit Leerzeichen lassen sich keine Zwischenräume definiert ausfüllen und es ist kein Zusammenhang mehr zu erkennen [/Edit]

Weiter gesucht wird nur verbundenen Elementen, die unterschiedliche Polarität haben. Ob du das nun Spannungsquellen bezogen machst oder nicht, ist für den vorliegenden Fall dann eigentlich egal.

Gruß oki

[Edit] Meine Zeichnung sollte eigentlich so aussehen )siehe Anhang) [/Edit oki]

Nachtrag: Wenn du die Schaltung auch bei Aktionen wie Schalter auf/zu usw. prüfen willst macht es grundsätzlich Sinn den Stromfluss nach jeder Ändereung zu prüfen/definieren. Solltest du weitere Bauelemente wie Halbleiter mit einbauen, so halte ich das an der Stelle dann für unabdingbar, da durch diese Zweige ohne Stromfluss oder nach Betätigen von Schaltern mit umgekehrtem Stromfluss enstehen können.

PaddyL 9. Jul 2008 22:19

Re: [Theorie] Stromkreise
 
Liste der Anhänge anzeigen (Anzahl: 1)
@oki: Eigentlich keine so schlechte Idee. Ich lass vorher einen Algorithmus durchlaufen der den Multiplugs sozusagen im Voraus sagt wohin sie zu leiten haben damit alles passt, dann loest sich das Problem ganz gut und ich kann meinen bisherigen Ansatz mit etwas Erweitern beibehalten.
Ich werd mich aber nochmal in den anderen Vorschlag reinarbeiten, mal sehen wie ich das loesen kann.

@_frank_:
Fummelig? Naja ist ne ein 11x11 grosses Feld rund um den eigentlichen Connector, so problematisch fand ich es eigentlich nicht. Hab mal ne Option eingebaut um den gehoverten Connector hervorzuheben, sollte einfacher sein zum selektieren. Wahrscheinlich haette ich das Programm sowieso als Open Source freigeben wenn es ein wenig weiter entwickelt waere, deshalb mal der Source im Anhang (Delphi 7, BSD Lizenz). Was genau macht dein Circuitboard denn? Mein Programm soll wenn es fertig ist eklektische Schaltungen aller Art simulieren koennen (also im begrenzten Rahmen der verfuegbaren Komponenten wozu noch Transistoren, Dioden, Wiederstaende etc. dazukommen sollen, wenn ich Stromstaerke und Spannung eingebaut habe.

_frank_ 9. Jul 2008 22:29

Re: [Theorie] Stromkreise
 
was mir aufgefallen ist (warum es wohl so fummelig war) ist, dass start und endpunkt gleich sein können...also eine verbindung mit sich selbst...
daher hat es öfters nicht geklappt, aber man konnte per delete connection die (nicht sichtbare) verbindung löschen.weiterhin kam es mir so vor, als wenn man z.b. von einem pol der batterie nur einen pin des schalters anschließen konnte.

das drehen würde ich auch nur in 90° schritten machen, sonst dauerts ewig ;)

mein Circuitboard ist ein einfaches layoutprogramm für lochrasterplatinen. die idee war, dass man mit deinem Programm einen funktionsfähigen stromlaufplan entwickeln kann und diese daten in Circuitboard importieren kann, um gleich die passende platine zu erstellen.
du kannst das programm über den SVN-Tree downloaden (code->svn browse->trunk->exe+ini->download).

zu deinem eigentlichen Problem...
ich würde vielleicht versuchen jedem connectionpunkt (komisches Wort :) ) einen double-wert zu verpassen welcher das Spannungspotential darstellt.bei einer verbindung (auch über kreuz) ist das potential überall gleich. über einem widerstand kannst du so gleich die spannung ausrechnen, welche darüber abfällt, so sollte auch eine parallel-schaltung möglich sein. die lampe leuchtet, wenn der potentialunterschied größer als die benötigte spannung ist.
sind widerstände parallel geschaltet, musst du erst deren gesamtwiderstand berechnen um da potential ausrechnen zu können. aber prinzipell von plus nach minus.

ich hoffe, das hilft dir bisschen weiter...

Gruß Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:25 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz