Einzelnen Beitrag anzeigen

Benutzerbild von PaddyL
PaddyL

Registriert seit: 23. Nov 2007
Ort: Lautertal
34 Beiträge
 
#1

[Theorie] Stromkreise

  Alt 8. Jul 2008, 19:37
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
Angehängte Dateien
Dateityp: rar toolbox_131.rar (283,4 KB, 44x aufgerufen)
Patrick
  Mit Zitat antworten Zitat