Cancel
Showing results for 
Search instead for 
Did you mean: 

Alternative zu Try-Catch - Tipp/Trick

Creator
Creator

Hallo zusammen,

immer mal wieder stolpert man über die Stelle, dass man den von Hochsprachen bekannten Try-Catch-Block vermisst..

 

Im Folgenden Fall sollen aus einem Netzwerk durch eine Methode BE´s (Anzahl einstellbar) auf mehrere Ausgänge gleichverteilt werden. Die Problematik ist, dass zu Laufzeit nicht bekannt ist welche Ausgänge mit Kanten verbunden wurden (benutzt werden).

 

Die Gleichverteilung fängt bei Ausgang1 an und wird bis Ausgang3 gezählt. Dann fängt die Verteilung wieder bei Ausgang1 an.

(Es soll bei der Gleichverteilung keine Flusssteuerung verwendet werden)

 


[..]
    if(AnzahlProGleichverteilungsschritt_Counter > AnzahlBEsGleichverteilung_Dropdown.Wert) then
        AnzahlProGleichverteilungsschritt_Counter := 1;
        NächsterAusgang := NächsterAusgang+1;        
       
        While(str_to_obj("Ausgang"+to_Str(NächsterAusgang)+".nf") = void) loop
                NächsterAusgang := NächsterAusgang+1;    
                if(NächsterAusgang = 4) then NächsterAusgang := 1; end;
        end;
        if(NächsterAusgang = 4) then NächsterAusgang := 1; end;
    end;    
        
    if(NächsterAusgang = 1) then
        BE.umlagern(Ausgang1.nf);
    elseif(NächsterAusgang = 2) then
        BE.umlagern(Ausgang2.nf);
    elseif(NächsterAusgang = 3) then
        BE.umlagern(Ausgang3.nf);
    end;
    
    AnzahlProGleichverteilungsschritt_Counter := AnzahlProGleichverteilungsschritt_Counter +1;

end;

Die Notlösung:

Um herauszufinden ob die Ausgänge verknüft sind, hab ich eine While-Schleife, die prüft ob es das Object "Ausgang3.nf" gibt. So die Theorie. Doch sobald es kein nf für Ausgang3 gibt, kommt die Fehlermeldung, dass str_to_Obj kein Pfad findet - Klar :/

 

Frage:

1.)

Hat jemand noch eine bessere Lösung?

Ich hatte auch schon die Idee mit '.isNameUnique()' zu experimentiert, aber da gibt es doch bestimmt eine bessere Lösung?

 

2.)

Hat jemand allgemein eine Lösung ein Try-Catch Konstrukt in SimTalk zu bauen?

 

 

Grüße Fabian

Siemens

5 REPLIES

Re: Alternative zu Try-Catch - Tipp/Trick

Gears Esteemed Contributor Gears Esteemed Contributor
Gears Esteemed Contributor
zunächst:
sie müssten z.B. auf str_to_obj("object").nf /= void prüfen, das sollte keine Probleme verursachen

SimTalk hat einen try catch Mechanismus: sehen Sie in der Hilfe unter ErrorHandler nach. Wenn Sie in der Methode ein Methoden-Attribut mit dem Namen ErrorHandler einfügen, dann ruft Plant Simulation bei Laufzeitfehlern diese Methode auf und übergibt Informationen zur Fehlerbehandlung.
Steffen Bangsow
freelance simulation specialist  
web: www.bangsow.eu
mail: steffen@bangsow.net

Re: Alternative zu Try-Catch - Tipp/Trick

Creator
Creator
Danke! Das ging ja schnell

Ist programmiertechnisch sicher nicht die schönste Lösung aber funktioniert. Dankeschön


Gruß Fabian

Betreff: Alternative zu Try-Catch - Tipp/Trick

Gears Phenom Gears Phenom
Gears Phenom

Also wenn ich bei dem Interface des Netzwerks die Ausgangstrategie "Cyclic/Reihum" einstelle und Blockierend aktiviere, dann habe ich automatisch eine Gleichverteilung, egal welche/wieviele Nachfolger das Netzwerk hat, ohne zu programmieren...? Smiley Happy

Viele Grüße,
Alex

____________________________________________________________
Alex Dilg, Consultant at SimPlan AG (www.SimPlan.de)
This post was good and/or helpful to you? Please provide some Kudos, thank you!

Betreff: Alternative zu Try-Catch - Tipp/Trick

Creator
Creator

Da hast du recht. Aber ich möchte immer zwei BE´s nach einander auf den entsprechenden Ausgang umlagern, bevor ich zum nächsten Ausgang wechsel. Wie löse ich das, ohne eine SimTalk Methode?

 

Gruß Fabian

Betreff: Alternative zu Try-Catch - Tipp/Trick

Gears Phenom Gears Phenom
Gears Phenom

OK, dafür war das

 

AnzahlBEsGleichverteilung_Dropdown.Wert

in der Methode, in der Beschreibung, was Du machen willst, stand das nicht dabei, daher wusste ich nicht, dass Du immer >1 BE zum selben Ausgang umlagern willst. Da kommt man dann wohl tatsächlich nicht ohne Programmieren aus.

 

Aber vielleicht ist es einfacher und eleganter (auf jeden Fall muss man dann nicht ständig mitzählen), wenn man einfach das Ausgangsverhalten "Zyklische Folge" verwendet und im Init jeden Nachfolger X-mal in der Folge einträgt, siehe Modell im Anhang. Hier die init-Methode:

 

is
	iaSuccArray	: integer[];
	
do
	-- prepare list with all successors of the network, and send X MUs to each successor
	iaSuccArray	:= SubFrame_Exit.ExitStrategySequence;
	
	-- clear the array
	while (iaSuccArray.Dim > 0) loop
		iaSuccArray.delete(1);
	end;
	
	-- re-fill the array
	for local i := 1 to SubFrame_Exit.numSucc loop
		for local j := 1 to v_iNumMUs loop
			iaSuccArray.append(i);
		next;
	next;
	
	-- apply the array to the exit interface
	SubFrame_Exit.ExitStrategySequence 	:= iaSuccArray;
	
	-- ensure "blocking" is active
	SubFrame_Exit.ExitStrategyBlocking	:= true;

end;

Viele Grüße,
Alex

____________________________________________________________
Alex Dilg, Consultant at SimPlan AG (www.SimPlan.de)
This post was good and/or helpful to you? Please provide some Kudos, thank you!