Hallo zusammen!
Ich schlage mich seit längerem mit entwas merkwürdigen Fehlern herum, die mir Kopfzerbrechen bereiten und bei denen ich beim besten Willen nicht weiß, wie ich Sie umgehen soll.
Beispiel:
Ich habe eine Säge mit einer etwas komplizierten Ausgangssteuerung (ich programmiere in einer Methode, dass die in der Säge enthaltene BE auf dem danach folgenenden Förderband zwei mal kopiert wird (mit ein paar Sekunden Abstand), die Original-BE wird anschliessend gelöscht.
Die Methode dazu sieht in etwa so aus:
________________________________
for i:= 1 to 2 loop
.BEs.Fördergut.erzeugen (Förderstrecke6,10);
.modelle.testlinie.test.Förderstrecke6.inhalt.name:=a;
if i=1 then
Längen2.setzeZeiger(1,1);
Längen2.finden(@.name);
.modelle.testlinie.test.Förderstrecke6.inhalt.buchpkt:=1;
.modelle.testlinie.test.Förderstrecke6.inhalt.laenge := Längen2[2,Längen2.ZeigerY] ;
.modelle.testlinie.test.Förderstrecke6.inhalt.buchpkt:=(Längen2[2,Längen2.ZeigerY])/2 ;
else
Längen2.setzeZeiger(1,1);
Längen2.finden(@.name);
.modelle.testlinie.test.Förderstrecke6.inhalt.buchpkt:=1 ;
.modelle.testlinie.test.Förderstrecke6.inhalt.laenge := Längen2[3,Längen2.ZeigerY] ;
.modelle.testlinie.test.Förderstrecke6.inhalt.buchpkt:=(Längen2[3,Längen2.ZeigerY])/2 ;
end;
wait 15;
next;
@.deleteobject;
_________________________
Anschließend "fahren" die BEs ein bißchen auf dem Förderband6, bis sie an der Mitte angekommen sind. Dort ist ein Sensor, die eine Methode auslöst, die prüft, ob benachbarte Förderbänder belegt sind, und falls nicht, die BEs nach dorthin umlagert. Dafür gibts ein paar Bedingungen, beispielsweise kann das übernächste Förderband nur erreicht werden, falls das nächste frei ist, da die BE über das nächste hinweggeschoben werden muss um zum übernächsten zu gelangen.
Sind alle Förderbänder belegt, will ich mittels einer while-Schleifer warten, bis das Förderband3 frei wird, und dann dahin umlagern. Dazu setze ich vor der Schleife die Geschwindigkeit des Förderbands auf 0, warte dann mittels der While-Schleife, bis Förderband 3 frei ist, setze die Geschwindigkeit des Förderband6 wieder auf normal, und lager um. Das sieht in etwa so aus:
(Das BE wird nicht direkt auf ein Föderband umgelagert, sondern auf ein Quertransportband gesetzt, aber das ändert nichts am Sachverhalt)
___________________________
if Förderstrecke3.belegt then
if Förderstrecke4b.belegt then
.modelle.testlinie.test.förderstrecke6.speed:=0;
while not Förderstrecke3.leer loop;
wait 2;
end;
.modelle.testlinie.test.förderstrecke6.speed:=1.75;
@.umsetzen(Quertransport3);
else
if Förderstrecke5b.belegt then
@.umsetzen(Quertransport4b)
else
@.umsetzen(Quertransport5b);
end;
end;
else
@.umsetzen(Quertransport3);
end;
__________________________________
Das Problem was ich jetzt habe:
Manchmal, nach meinetwegen 100 gelungenen Umlagerungen, ensteht ein Stau, der sich auch bis zum Ende des Simulationsdurchlaufs nicht mehr auflöst, selbst wenn ALLE Förderbänder frei sind.
Wenn ich das ganz dann im Debugger analysiere (mit F9 Haltepunkt im Code setzen und dann Zeile für Zeile mit F11 durchgehen), stoße ich immer wieder auf eine ähnliche Problematik, wenn ich mit "wait" arbeite (unabhängig davon, dass ich wie hier in diesem Beispiel eine while-Schleife beutze):
Manchmal, wenn ein "wait" im code vorkommt, schliesst Tecnomatix wie geplant für 2 Sekunden das Code-Fenster, öffnet es aber nicht mehr und führt die Mehtode nicht mehr weiter aus. Das passiert, soweit ich das richtig beobachte, immer dann, wenn gleichzeitig zwei Funktionen nebenher laufen. In diesem Beispiel wird nämlich genau bei der problematischen BE, die diesen Stau verursacht, die Ausgangssteuerungsmethode beendet. Das sieht dann bei mir so aus, dass ich mich in Zeile 5 der zweiten oben angegebenen Funktion befinde, F11 drücke, das Funktionsfenster verschwindet, sich dann aber nicht mehr öffnet, sondern plötzlich die andere Funktion aupoppt (obwohl ich hier garkein Haltepunkt gesetzte habe), grade bei der Zeile "@.deleteobject" steht, und nach erneutem Drücken von F11 plangemäß die in der Säge befindliche BE löscht. Nur dass dann anschließend nicht mehr die andere Funktion aufpoppt...und das Forderband dann im Grunde dauerhaft auf die Geschwindigkeit 0 gesetzt bleibt und von da an blockiert.
Nochmal zusammengefasst sieht mein Problem so aus, dass der Ereignisverwalter durcheinander gerät, wenn zwei Funktionen mit dem Befehl "wait" gleichzeitig pausieren.
Weiß da jemand eine Lösung? Liegt das an dem "wait", was man in dieser Form nicht benutzen sollte? Gibts Alternativen? oder ist das ein bekanntes Problem von Plant Simulation? Oder liegts vielleicht doch in irgendeinder Weise an meinen Schleifen, die man so nicht anwenden darf?
Ich habe schon versucht, an mehreren Stellen Debugg-Funktionen einzubauen, die einfach von Zeit zu Zeit die Geschwindigkeit wieder auf den normalen Wert setzen, aber das erzeugt nur Chaos.
Das Problem habe ich an mehreren Stellen, teilweise wird auch durch eine ähnliche Situation einfach mal "vergessen", eine BE umzubenennen, obwohl es 10.000 mal vorher funktioniert hat. Einfach weil durch einen blöden Zufall zwei Funktionen gleichzeitig laufen und die eine dann anscheinend schlicht und ergreifend vergessen wird weiterzuführen, nachdem die andere beendet wurde.
Gruß und schönen Dank fürs Lesen, Julez.
P.S. benutze Plant Simulation 7.6.0
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP