Förderstrecke

buenne

Level-1
Beiträge
13
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Servus!
Ich möchte eine Förderstrecke , die aus mehreren Knoten und Verzweigungen besteht(Beispiel Anhang), von einem vorgebenen Startknoten zu einem vorgebenen Zielknoten durchlaufen.

Wenn das Ziel gefunden worden ist, dann gehe den gewählten Weg wieder zurück.
Das Einfachste wäre, wenn ich nach dem Verfahren der Tiefensuche (siehe Algorithmus) vorgehe.
Für das zurück gehen muss ich mir Informationen der einzelnen Knoten irgendwie abspeichern (merken).
Für die Einzelnen Knoten lege ich Datenbausteine an.

Algorithmus:
· Zunächst wird ein Startknoten ausgesucht
· Expandiere den Knoten und speichere alle Nachfolger in einem Stack(Stapelspeicher).
· Rufe rekursiv für jeden der Knoten in dem Stack die Methode „Tiefensuche“ auf.
o Falls der Stack leer sein sollte, tue nichts
o Falls das gesuchte Element gefunden worden sein sollte, brich die Suche ab und lieferet ein Ergebnis

Tiefensuche(Knoten, Ziel) //Methode zur Tiefensuche
{
if (Knoten == Ziel) //Wenn Knoten gleich dem Zielknoten
//dann verlasse die Methode und gebe
return Knoten; //den Knoten zurück
else
{

Stapel := expand (Knoten); //Nachfolgenden Knoten auf den Stack

While (Stapel nicht leer ist) //solange der Stack nicht leer ist
{
Knoten := pop (Stapel); //Vom Stapel nehmen
Tiefensuche(Knoten,Ziel); //Rekursiver Aufruf der Methode
}
}
}

Wie kann ich den Algorithmus umsetzen ?
Mit welchen Bausteinen (FB mit DB,...) mache ich das am besten ?


Gruß
Buenne
 

Anhänge

  • Algorithmus.zip
    9,1 KB · Aufrufe: 132
Da du von FB und DB schreibst vermute ich mal, du willst das mit Step7 machen ;). An 1. Stelle steht genau für deinen Fall eigentlich SCL als Programmiersprache. Da du ja schon mit if, the, else und while in deiner Prinziperklärung hantierst, kannst du diese in SCL gleich weiterverwenden. Außerdem kannst du in SCL mit Array's und Indizes arbeiten, ohne dich mit indirekter Adressierung herumschlagen zu müssen. Leider ist SCL zusätzlich zum Standardpaket zu erwerben bzw. erst in der Step7-Prof.-Version enthalten. Soweit ich mich erinnere funktioniert aber auch ein SCL ohne Authorisierung problemlos, es erscheint beim Start immer eine etwas lästige Meldung. Zum ausprobieren, ob das das Richtige für dich ist, reicht das sicherlich. Ansonsten beleibt dir nur der Weg über AWL/FUP, wobei FUP wohl eher nicht unbedingt für so etwas geeignet sein wird.

Mir sind im Moment keine Bausteine bekannt, die direkt können, was du benötigst.

Zuerst solltest du die grundsätzliche Struktur der DB festlegen und welche Möglichkeiten es gibt, deinen gesamten Baum dann in den DB abzulegen, er wird dich ja in Zukunft auch mal ändern. Bei Fragen oder wenn du den Zwischenstand mal diskutieren willst, können wir das gerne hier weiterführen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
awl....

ich denke auch in awl sollte das zu realisieren sein, und wäre nicht unbedingt zu komplex. es ist zumindest ein rekursiver funktionsaufruf möglich.

Ich denke auch das wichtigste erstam ist die Datenbaustein struktur festzulegen (Wie sieht ein Konoten im DB aus, woran erkennt man ob noch unterknoten existieren und wo sind diese dan gepeichert).

Danach kannst du ja weitere fragen stellen...
 
Föderstrecke

@ Ralle!

Im Anhang findest du eine Beispielzeichnung für eine Förderstrecke.

Es geht um folgendes:

Ich möchte ein Produkt von S1 über die Weiche W1 und die Weichen W2 und W3 in den Zielbehälter Z3 befördern. In diesem Fall stehen die Weichen (Grundstellung) schon richtig.
Jetzt kann es aber sein, das die Strecke schon belegt ist, z.B über S3,W4,W1,Z1.
Um dies herauszufinden, lege ich für jede Weiche, Startbehälter,Zielbehälter einen Datenbaustein an, indem Informationen über z.B die aktuelle Stellung der Weiche, ob die Weiche schon von einer anderen benutzt wird usw.
Jede Weiche behandle ich wie einen einfachen Knoten, der gewisse Informationen enthält.

Wenn ich eine Strecke anfordere, suche ich zunächst vom Startbehälter aus den Zielbehälter, wenn der gefunden ist, gehe vom Ziel zum Start zurück und überprüfe, ob die Strecke frei ist(weiche belegt). Ist Sie frei, dann stelle die Weichen für den angeforderten Fahrbefehl.

Datenbaustein Weiche (32Bit: Weiche gestellt, Weiche gestört, Weiche frei)

Für den Startbehälter, Zielbehälter, Klappe, Gebläse wird ebenfalls ein Datenbaustein angelegt.

Irgendwie brauche ich einen Stack (FI-LO) auf den ich den Weg mit Hilffe der Datenbaustein praktisch ablege. Das Suchverfahren (rekursive Tiefensuche) habe ich zu Anfang ja schon beschrieben

Gruß
Buenne
 

Anhänge

  • Zeichnung.zip
    4,4 KB · Aufrufe: 123
ich kann das nicht so ganz nachvollziehen was du machen willst.

wenn du von s1 nach z3 willst, gibt es doch nur einen weg.
oder sollen die teile wenn z3 nicht erreichbar ist irgendwo in einem anderen z gepuffert werden?

ich denke mal, das die teile die von einem s kommen in einem z abgelegt werden sollen, oder?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich gebe einen Startpunkt (s) vor und möchte es zu einem
ausgewählten Ziel (z) befördern. Naja als nächstes wird die
Route vom Startpunkt zum Zielpunkt gesucht. Wenn die Stercke schon belegt ist, dann breche ab, wenn die Strecke nicht belegt ist, dann Stelle
die Weichen so, das das Produkt in den ausgewählten Zielbehälter befördert wird.

Gruß
Buenne
 
Hallo Leute,

greife mal wieder ein altes Thema aus der Schublade, da es für mich recht interessant anhört und es auch für mich vielleicht in betracht kommt. Allerdings fehlt mir momentan irgendwie der Ansatz, wie ich sowas in der SPS umsetze.
Wenn ich mal von dem Beispiel mit den Weichen ausgehen, da muss ich mir in jeder Weiche die Information habe, was alles vor dieser Weiche kommt. Das soll heißen. Wenn ich z.B. von S2 nach Z3 gehe. Jetzt wenn ich von Z3 zurück gehe, dann muss ich in der Weiche W3 die Information habe, das nach dieser W3 (W2, W4, S1, S2, S3 und S4) stehen oder? Dann wäre es bei Weiche W2 (W4, S1, S2, S3 und S4) usw. oder? Die Informationen pro Weiche werden somit immer weniger. Oder habe ich das was falsch verstanden?
Hat jemand von euch schon mal sowas in der Art mit einer SPS realisiert?

Für mich ist die Sache vor allem interessant, da wir momentan recht viel Fördertechnik machen, bei der viel Förderkombinationen herauskommen und somit jeder Förderweg einzeln getestet werden muss und das erhöht somit die IBN-Zeit. Mit dieser Möglichkeit könnte man sich viel Automatiktest ersparen, wenn man mal eine sauberer Struktur hat.

Wäre für jede Information zu diesem Thema dankbar.
 
Wenn ich mal von dem Beispiel mit den Weichen ausgehen, da muss ich mir in jeder Weiche die Information habe, was alles vor dieser Weiche kommt.

Ich verstehe es so, dass jede Weiche nur ihren Nachbarn kennt. Der Algorithmus sucht sich selber einen Weg. Sehr interessanter Ansatz, aber ehrlich gesagt hoffe ich, dass ich nie eine Fördertechnik damit umsetzen muss.

Gruß
Dieter
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich verstehe es so, dass jede Weiche nur ihren Nachbarn kennt. Der Algorithmus sucht sich selber einen Weg. Sehr interessanter Ansatz, aber ehrlich gesagt hoffe ich, dass ich nie eine Fördertechnik damit umsetzen muss.

Bin halt in der Forumsuche auf diesem Thema gestoßen und klang halt recht interessant. Bin halt auf er Suche nach eine Alternative zu dem sehr Fehleranfälligen System von jetzt. Aber ich denke mir auch auf der anderen Seite, das wenn jede Weiche nur seinen Nachbarn kennt, wird die Suche schon relativ lange dauern. Wenn es nicht wie hier nur ein paar Weichen sind.
 
ich denke auch in awl sollte das zu realisieren sein, und wäre nicht unbedingt zu komplex. es ist zumindest ein rekursiver funktionsaufruf möglich.
Man beachte die arg begrenzte maximale Baustein-Schachtelungstiefe.
Der TE wird wohl das "rekursiv" auf "Schleife" umschreiben müssen oder die Wegsuche je OB1-Zyklus auf einen Knoten beschränken müssen.

Harald
 
Ich habe selbst in einer gelangweilten Minute einen Baustein geschrieben, der den Weg für LHM's durch eine Fördertechnik sucht. Dieser Baustein ist auf dem Dijkstra-Algorithmus aufgebaut.

http://de.wikipedia.org/wiki/Dijkstra-Algorithmus

Allerdings ist dieser Baustein sehr allgemein gehalten, weil eine Fördertechnik immer anders aussieht.

Wenn ich deine Zeichung richtig interpretiere geht es dabei um eine Art Rohrpostanlage.

Wobei geht es um eine Wegverfolgung? Wer bin ich, wo bin ich und wo muss ich hin.

Was ich bei der Sache noch nicht ganz verstehe:
- wird vor jeder Weiche identifiziert und danach die Weiche gestellt
- werden die LHM's identifiziert auf die Reise geschickt (Barcode, RFID, ...) oder sind sie nicht identifiziert
- muss bei einem Start die ganze Strecke reserviert werden? Wenn ich ein LHM von S1 nach Z5 schicke, muss ich dann sofort alle Weichen stellen, oder erst dann, wenn ich vor der Weiche stehe?
- Warum muss ich wissen, woher ich komme, und den gleichen Weg wieder zurückgehen?

Gruß
Stipo
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

ich habe schon einmal auf dieser Art und Weise eine Förderanlage mit ca. 400 Stellgliedern und 400 Motoren realisiert. In der SPS lief eine Art Autorouter die rekursiv aufgerufen wurde. Hierbei musste man lediglich aufpassen, dass die Zykluszeit nicht überschritten wird. Diese Kontrolle wurde durch einen Abbruch der Schleife realisiert. Die Route konnte in einer Excelliste erstellt werden, aus der wiederum ein Strecken-DB kreiert wurde. In diesem, Strecken-DB wurden die Knoten als Vorgänger und Nachfolger gespeichert. Für Anlagen mit vielen Antrieben und Stellgliedern halte ich die Art für sehr gut. Die Funktionalität kann bereits im Büro getestet werden.
 
Morgen miteinander,

also ich will mal einen anderen Denkansatz in den Raum werfen.
Wenn ich sowas programmiere, dann versuche ich die Förderstrecke mit den Packeten in einem Schieberegister abzubilden. Voraussetzung dafür ist die Verfolgbarkeit der Packete. Dafür braucht man eine Förderstrecke mit einem Geber und die Packete dürfen nicht verrutschen (ihre Position unkontrolliert verändern).
Wenn diese Voraussetzung gegeben sind, dann lege ich ein Schieberegister mit folgenden Positionen an:
1. Aufgabeposition
2. Position an der Weiche 1
3. Position nach Weiche 1
4. Position an der Weiche 2
5. position nach Weiche 2
....

(je nach Abstand zwischen den Weiche und Größe der Packete muß man noch Zwischenpositionen einfügen)

Wird nun ein Packet aufgegeben, dann schreibe ich in das Registerfach "Aufgabeposition" : Packet vorhanden, Abwerfen an Weiche x, Position des Packetes
Das Packet wird befördert (Position wird immer aktualisiert), erreicht es die Position vor der Weiche 1, dann werden im Schieberegister die Daten aus dem Fach "Aufgabeposition" in das Fach "Position an der Weiche 1" verschoben.
Das Packet wird weiter befördert, erreicht es die Position nach der Weiche 1, dann werden im Schieberegister die Daten aus dem Fach "Position an der Weiche 1" in das Fach "Position nach der Weiche 1" verschoben.
Vorteil von diesem System: es können mehrere Packete auf der Strecke sein. Jede Weiche muß immer nur ihr eigenes Registerfach kontollieren
"Position an der Weiche x". Ist nun ein Packet an der Weiche x vorhanden, so wird die Weiche gestellt und die Daten von diesem Packet nach dem ausschleusen gelöscht.
Wenn ihr eine schnelle Mechanik habt und die Packete sind verfolgbar könnt ihr Packete im Sekundentakt aufgeben, egal wie lange die Strecke ist.

Gruß
spskarl
 
also ich will mal einen anderen Denkansatz in den Raum werfen.
Wenn ich sowas programmiere, dann versuche ich die Förderstrecke mit den Packeten in einem Schieberegister abzubilden.

Dein Ansatz hat wenig mit dem hier genannten zu tun. Hier geht es um automatische Zielfindung bzw Wegefindung. Du machst Teileverfolgung. Bei dir muss jede Weiche "wissen", wie sie alle nachfolgende Ziele handeln muss. Beim hier vorgestellten Verfahren, wird ein Weg vom Ziel ausgehend zur aktuellen Weiche gesucht.

Gruß
Dieter
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

ich habe schon einmal auf dieser Art und Weise eine Förderanlage mit ca. 400 Stellgliedern und 400 Motoren realisiert. In der SPS lief eine Art Autorouter die rekursiv aufgerufen wurde. Hierbei musste man lediglich aufpassen, dass die Zykluszeit nicht überschritten wird. Diese Kontrolle wurde durch einen Abbruch der Schleife realisiert. Die Route konnte in einer Excelliste erstellt werden, aus der wiederum ein Strecken-DB kreiert wurde. In diesem, Strecken-DB wurden die Knoten als Vorgänger und Nachfolger gespeichert. Für Anlagen mit vielen Antrieben und Stellgliedern halte ich die Art für sehr gut. Die Funktionalität kann bereits im Büro getestet werden.

Hallo user007,
das sieht aber nach einer mächtigen Anlage aus, die du da nach diesem Prinzip gemacht hast. Hab jetzt über Ostern etwas pausiert und mir nun wieder etwas den Kopf zubrochen. So wie ich das sehe, hast du die mal alle möglichen Wege in Excel zusammengestrickt und daraus eine DB mit den möglich Routen erstellt oder? Was mich aber jetzt noch etwas irritiert, ist die Speicherung der ganzen Informationen und die Dauer der Wegsuche. Du bist also im SPS Programm jeden wegen vom Ziel ab durchgegangen, bis du den Startpunkt erreicht hast? Diesen weg hat du wieder wo anders gespeichert oder? Wenn du den Weg nun gefunden hat, hast du deine Förderkette gestart. Darf man fragen, welche CPU du für diese Sache verwendet hast?

Wie ich das so sehe wird das noch ein recht interessantes Thema, da es immer wieder Anwendung für sowas gibt.
 
Hallo Hubert,

ich muss zugeben, dass war bisher unsere größte Anlage. Im Normalfall liegen wir bei ca. 150 Stellgliedern und ca. 150 Antriebe sowie ein paar Waagen. Aber zu Deiner Frage. Wir setzen mindestens eine 412´er ein. In sehr aufwendigen Anlagen kommt eine 416´er zum Einsatz.

Die Wegsuche hat Ähnlichkeit mit dem Dijkstra-Algorithmus. Der Knoten ist nicht der Antrieb/Stellglied, sonden die Kante (Verbindung von einem Aktor zum nächsten) der gesamte Strang wird wie ein Potential angesehen und wird durchnummeriert. Antriebe und Waagen kennen nur einen Nachfolger, Stellglieder maximal zwei. Sobald ein Stellglied festgestellt wird, wird ein Weg weiter verfolgt, bis ein Ziel erreicht ist. Ist dieses Ziel nicht das richtige, dann wird bis zum letzten Stellglied zurückgegangen und der andere Weg beschritten. Der zuvor beschrittene Weg wird markiert. Dieser Vorgang wird solange durchgeführt, bis das richtige Ziel erreicht ist. Im Fall der größten Anlage die wir bisher damit umgesetzt haben, benötigten wir im ungünstigsten Fall ca. 10 Sekunden mit einer 416´er CPU und 6 Komponenten. Der Anwender wurde über eine Visualisieung (WinCC) darüber informiert, dass der Weg berechnet wird. Zum Zeitpunkt der Umsetzung kannten wir den Dijkstra-Algorithmus noch nicht. Würden wir diesen Standard noch einmal umsetzen, dann würden wir wahrscheinlich den o.g. Algorithmus programmieren. Der Vorteil liegt darin, dass durch eine Parametrierung der Kanten in Abhängigkeit der Situation flexibler auf Anlagenspezifikationen (z.B. Weg sperren bis gereinigt oder bestimmte Materialien dürfen nur über einen bestimmten Weg gefördert werden) eingegangen werden kann.

In der Exceldatei wird eine Art Landkarte von der Anlage abgebildet und mit einem eigens dafür geschriebenen Programm ein DB generiert. Damit die SPS nicht in die Zyklusüberwachung läuft, unterbrechen wir je nach Anlagenumfang nach 50-100 Schritte die Berechnung. Ein Schritt entspricht ein Sprung von einem Knoten zum nächsten bzw. wieder zurück. Pro Startknoten wird ein Weg berechnet, so dass pro Auftrag (mehrere Komponenten) mehrere Wege berechnet werden müssen. Ein übergeordneter Koordination-FB sorgt für die Synchronisierung (z.B. gleichzeitige Freigabe der ersten Schieber unter den Silos, Anhalten alle Wege bei Störungen usw.) der unterschiedlichen Wege. Schließlich muss sichergestellt werden, dass alle Komponenten in der richtigen Menge gefördert werden.
 
Hallo Leute,

bin momentan auch drüber, solch eine Förderwegssuche in Anlehnung an den Dijkstra-Algorithmus zu schreiben. Was ich aber bis jetzt ausgeklammert habe, war die Sache mit dem kürzesten Förderweg, da die ja recht komplex sein kann. Das System funktioniert bis jetzt sehr gut, nur bei einer Anlage macht jetzt die Sache ohne kürzesten Förderweg ein kleines Problem. In dieser Anlage sind einige Handschieber drinnen, von denen ich keine Meldung bekommen, in welcher Stellung sie sind. Der Betreibe stellt sie selbst und sucht sich natürlich den kürzesten Förderweg für sein Produkt aus. Was zu einem Problem wird. Er sucht sich halt bis jetzt immer den Fördweg mit den wenigsten Antriebe von der Quelle bis zum Ziel heraus und stellt dann die Handschieber, wie er sie braucht. Und hier ist das Problem, wie kann ich am einfachsten ermitteln, was der Weg von der Quelle über ein paar Zwischenziele bis zum Ziel ist? Bei mit stellt jeder einen Knoten mit teilweise bis zu 3 Abzweigen da (auch folge von Handschiebern). Ich müsste nach momentanen stand von jeden Abzweig das Ziel suche, was die SPS sehr stark beansprucht und somit auch die Förderwegssuche sehr lange dauern würde.
Ich hoffe ihr könnte mir ein paar tipps geben, wie ihr das Problem lösten könnt, da ich momentan mit meinem Latein, etwas am Ende bin.
Bin auch euere Vorschläge gespannt.

Es gibt da ja auch was von Siemens für PCS7 "Route Control", aber das wäre da schon recht heftig. Ich hoffe doch, das es auch eine Lösung gibt (abgespekt) die auch in einer größeren S7-300 bzw. 400er läuft.
Das wäre die Präsentation zum Siemensprodukt:
http://www.automation.siemens.com/m...nenten/wegesteuerung/Pages/wegesteuerung.aspx

Ich weis jetzt nur nicht, ob die bei ihrem System auch den kürzesten Weg berechnen?
Den so wie ich das auf den Videos gesehen habe, ist da nix von einem Abstand zwischen den einzelnen Punkten angegeben worden
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

scheinbar eine recht harte Nuss. Mit Längenangaben wäre es denk ich einfacher. Aber Siemens hat es auch irgendwie gelöst.
Bin mal gespannt auf euere Antworten.
 
Hallo Leute,

hat den keiner für mich eine Tipp, wie ich dieses Problem mit dem kürzesten Weg in den Griff bekomme?
Hab momentan auch noch das Problem mit dem Besuchtmarkierung der einzelen Knoten. Soll heiß, immer wenn ich zu einem Knoten komme, merk ich mir den als Besucht, so das bei mehreren Abzweigungen in einem Knoten nicht immer der erste besucht wird und die anderen frei bleiben. Hab das Problem nun, wenn ich die wege zurück gehe und über einen andere Knoten auf den Knoten komme, der schon über einen anderen Knoten besucht wurde, so wird abgebrochen, da ich ja nicht ans Ziel gekommen bin bzw. es zu einer Kollision mit einem anderen Förderweg gekommen ist.
Steh da momentan richtig auf dem Schlauch, wie ich das Problem löse. Ich hoffe die Profis unter euch können mir einen Tipp geben. Die Hauptproblem hab ich eigentlich nur durch die Option Zwischenziel.

Bin für jeden Tipp von euch sehr Dankbar.
 
Guten Abend!

Ich habe die Landkarte in einem DB angelegt.

Die Struktur ist im DB4 zu finden. Darin sind folgende Nodes angelegt:
- Node 1: Frankfurt
- Node 3: Würzburg
- Node 8: Nürnberg

Jede Kante besteht aus folgenden Informationen:
k00010002 : STRUCT
node : DINT := L#1; //Node-ID: Frankfurt - Mannheim
destination : DINT := L#2; //Destination
costs : INT := 85; //costs between source and destination
overhead : INT ; //costs because of traffic
calcosts : DINT ; //calculated costs of route --> cheapest way
checked : BOOL ; //node is checked
END_STRUCT ;

node, destination, costs und overhead müssen ausgefüllt werden, calcosts und checked wird vom FB bei der Berechnung ausgefüllt.

Die Kosten würde ich als Zeit hinterlegen, zB in Sekunden. Wie lange braucht ein LHM, um von A nach B zu kommen. Der Weg macht keinen Sinn, weil es einen Unterschied macht, ob man 10m mit 1m/s oder mit 5m/s zurücklegt. Somit ergibt die Wegsuche den schnellsten Weg (die kürzeste Zeit von A nach Z). Der FB arbeitet aus Zykluszeitgründen nur einen Knoten pro Zyklus ab.

Im ersten Durchgang werden die berechneten Kosten und die checked-Flags zurückgesetzt.

Im zweiten Durchgang wird die Beziehung geprüft zw. Node und Destination. Ist diese Kante interessant und muss diese berechnet werden. Wenn ja, werden die Kosten aktualisiert, und das checked-Flag gesetzt.

Sind alle interessanten Kanten geprüft, werden im 3. Durchgang nochmals alle Knoten durchgeprüft, und die Destination abhängig von den günstigsten calcosts wird ausgegeben.

Im Beispiel von Wikipedia wird von Frankfurt nach München gefahren und der ganze Weg berechnet. Dies ist im angehängten DB4 als Landkarte hinterlegt.
 

Anhänge

  • DB4.txt
    6,8 KB · Aufrufe: 40
  • Dijkstra_map.png
    Dijkstra_map.png
    14,3 KB · Aufrufe: 23
Zurück
Oben