Hallo zusammen,
ich programmiere derzeit an einem PickAndPlace-Roboter, welcher BEs aus Einzelnstationen entnimmt und in Lager legt. Zwischen den Einzelstationen, dem PickAndPlace und den Lagern gibt es keine Kanten, was ja aber im Eigentlichen kein Problem darstellen sollte (Winkel + Zeitentabellen sind gesetzt).
Das Programmieren der Zielsteuerung war soweit kein Problem. Der Roboter entimmt brav im Round-Robin-Prinzip aus den Einzelnstationen und legt im richtigen Lager ab.
Tricky wird es aber jetzt im Bezug auf die Ziehensteuerung. Der Quellcode hierfür sieht recht einfach aus. Es sei erwähnt, dass die BEs eine Eigenschaft names transportTarget vom Typ objekt haben, welches das Transportziel angibt. Zudem ist dafür gesorgt, dass immer mindestens ein Lager nicht voll, da BEs über einen später ausgeführten Code (mit Hilfe einer Tablle auf jedem Lager: expectedObjects) weiterbewegt werden:
Code:
is
blockList : table;
nextObject : object;
do
-- initializing
nextObject := void;
blockList.create;
?.fwBlockList(blockList); -- choose next MU to move
for local counter := 1 to blockList.yDim loop
if (blocklist[1, counter].transportTarget.empty) then
nextObject := blocklist[1, counter];
exitloop;
end;
next;
-- unblocking MU
if (NOT (nextObject = VOID)) then
-- adding object to movement queue
local expectedObjects := ref nextObject.transportTraget.expectedObjects;
expectedObjects.insertRow(expectedObjects.yDim +1);
expectedObjects[1, expectedObjects.yDim] := nextObject;
?.unblock(nextObject);
end;
end;
Nachdem der erste Transport mit dieser Methode gut klappt ist es jetzt jedoch so, dass die Ziehensteuerung nach jedem Transport noch einmal aufgerufen wird - und kein Transport durchgeführt wird (Zielsteuerung wird nicht aufgerufen, obwohl ja ein BE unblocked wurde), was dazu führt, dass expectedObjects mehr BEs enthält als es eigentlich sollte. Es scheint dabei keine Rolle zu spielen, ob "Standardwinkel anfahren" gesetzt ist, oder nicht. Ich bin mir nun nicht sicher warum die zweite Ausführung durchgeführt wird und wie ich jetzt erkenne, ob danach tatsächlich ein Transport druchgeführt wird, oder nicht. Gibt es hier eine gute Methode? Kann ich von "Hand" einen Transport antriggern?
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP