TIA Abfrage Logik für ein Hochregallager

Imero

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hey Leute,
ich habe folgendes Problem--> Ich habe ein Hochregallager mit 5 Etagen. In jeder Etage sind 5 Plätze frei. Ich soll das System so programmieren das wenn die Anlage ein Kasten ansaugt, es in die erste Etage hochfährt und dann nach einem freien Platz von den 5 gegebenen suchen soll, sind alle Plätze schon belägt, dann soll die Anlage in die 2 Etage fahren und dort weiter suchen bis ein freier Platz gefunden wird. Ich habe im Moment kein Ahnung wie das aussehen sollte bzw programmiert wird. (Am besten in FUP).

Danke im Vorraus für Hilfe.
 
Hey Leute,
ich habe folgendes Problem--> Ich habe ein Hochregallager mit 5 Etagen. In jeder Etage sind 5 Plätze frei. Ich soll das System so programmieren das wenn die Anlage ein Kasten ansaugt, es in die erste Etage hochfährt und dann nach einem freien Platz von den 5 gegebenen suchen soll, sind alle Plätze schon belägt, dann soll die Anlage in die 2 Etage fahren und dort weiter suchen bis ein freier Platz gefunden wird. Ich habe im Moment kein Ahnung wie das aussehen sollte bzw programmiert wird. (Am besten in FUP).

Danke im Vorraus für Hilfe.
Dito hey,
in FUP (oje) kann ich das nicht...
Aber in SCL/ST ist es easy:
Xy-Array erzeugen und in das Feld belegt reinschreiben.
Dann mit 2 For/next schleifen das Array je Etage dursuchen und wenn frei dann rausspringen > fertig.
Warnung: Was ist bei Stromausfall ?
Hinweis: Wenn es mehr wird (Plätze, Informationen) dann würde ich das von einer externen Datenbank organisieren. Ist deutlich sicherer und flexibler

Gesendet von meinem ONEPLUS A3003 mit Tapatalk
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Achtung:
manche Lager können kippen wenn sie "einseitig" beladen werden.

Wie beim manchen Ausflugsdampfer nach der Durchsage : "auf der rechten Seite ist ein Blauwal"
 
Dito hey,
in FUP (oje) kann ich das nicht...
Aber in SCL/ST ist es easy:
Xy-Array erzeugen und in das Feld belegt reinschreiben.
Dann mit 2 For/next schleifen das Array je Etage dursuchen und wenn frei dann rausspringen > fertig.
Warnung: Was ist bei Stromausfall ?
Hinweis: Wenn es mehr wird (Plätze, Informationen) dann würde ich das von einer externen Datenbank organisieren. Ist deutlich sicherer und flexibler

Gesendet von meinem ONEPLUS A3003 mit Tapatalk

Geht es noch komplizierter?

1. Warum (fup) oje?

2. Wenn alle Lichtschranken belegt sind sperrst du die Etage mit einem Bit und gehst auf die nächste, wo ist das Problem?
 
Hallo Imero,

ernsthaft, soll der Waagen im Hochregal-Lager nach freien Plätzen suchen?
Dann ist das aber keine Industrie-Anwendung, sondern eine Hausaufgabe von einem sadistischen Lehrer, wenn es zudem in FUP sein muss… ? :rolleyes:

LG Cassandra
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

vllt. solltest du etwas mehr schreiben, was dir zur Verfügung steht. Wie kannst du denn ermitteln, ob in einer Etage Plätze frei sind? Hast du pro Etage von den Plätzen 1-5 Rückmeldungen via. Endschalter o.ä. ? Weiterhin bietet sich für sowas eine Graph 7 Schrittkette an. In der Schrittkette programmierst du den Ablauf und die Bedingungen (Transitionen) kannste dir in einem extra FC in FUP bilden.

Clyde
 
Ja ich habe das auch mit Graph gemacht also als Ablaufkette jedoch gibt es keine Sensoren für die Plätzte.
Ich soll es über Merker machen also Beispielsweise für (Etage1; Platz 2) verwende ich Merker0.1 und Setzte ihn wenn ich das werkstück einlagere.
Jedoch wird das ein großer Aufwand über die Schritkette.

Hier ist mein Programmablauf und ein Video:https://www.youtube.com/watch?v=eZ-753nVKeA&feature=youtu.be
20180516_110552.jpg
 
Kleine zwischenfrage:
Ist einer von euch aus dem Forum aus Berlin, der mir eventuell nachhilfe geben könnte???
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

das sieht aus wie ein Uni-Projekt, noch Student?
Ich würd das so machen: Das Ablagern und oder holen würd ich in der Schrittkette machen und einer der ersten Schritte heißt bestimme freie Position. Dieser Schritt löst dann einen FC aus in dem du die nächste freie Position suchst. Wenn du es mit Merkern machen willst dann nimmer .1 bis .5 für eine die jeweilige Position 1-5 und Bit .0 setzt du true wenn alle Positionen auf einer Ebene belegt sind. Wenn du einen freien Platz gefunden hast fährst du mit dem Teil dahin. Fragt sich nur wie du die Postition ansteuerst. Da würd ich vllt sogar in der Schrittkette dann 5 - Altverzweigungen für Position 1-5 machen und dann Hubarm anhand der Etage hochfahren lassen.

Mfg Clyde
 
Ja bin in der Ausbildung noch.
DIE Position bestimme ich über ein Impuls sensor, das ist kein Problem jedoch weis ich nicht wie meine Funktion im FC aussehen könnte um nach dem freien Platz zu suchen?
 
Bild1.jpg

Bild2.jpg

Bild3.jpg

Bezogen auf obriges Beispiel:

M4000.0 ist der Befehl zum Suchen des nächsten freien Platzes:
M4100.0 bis 4100.5 sind die Plätze für Etage 1, analog 4200.0 ... für Etage 2

Der Baustein hat 2 Ausgänge in Form von Integers iEtage und iPlatz.

P.S. In Netzwerk 8 ist die Überschrift nicht richtig, aber sollte klar sein was da stehen müsste.
P.S.S. Zwischen Netzwerk 8 und 9 müsste eigentlich noch ein Netzwerk um nach Etage 3 zu springen.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,
wie shrimps in #2 schon geschrieben hat, wäre das mit einem Platzdate-DB und einem zweidimensionalem Array sehr charmant zu lösen.
Dafür müsstest du als erstes einen DB bestehend aus Array[1..5,1..5] of Bool erstellen
Der erste Bereich des Arrays repräsentiert deine X-Koordinaten, der zweite deine Y-Koordinaten.
-> ist der Bool-Eintrag true, dann ist das Fach belegt.
Regalmatrix-DB.JPG
Dein FC müsste in SCL jetzt z.B. so aussehen, dass du zwei ineinander geschachtelte FOR-Schleifen verwendest, in der äußeren zählst du bspw. die Y-Koordinaten hoch, in der inneren die X-Koordinaten.
Hast du ein freies Feld gefunden, dann gibst du die Schleifenzähler als Koordinaten aus deinem Baustein heraus.
findeFreiesFach.JPG
Das wäre mal ein mögliches Vorgehen. Dazu kannst du deinen DB remanent machen, dann behält er auch beim Ausschalten, deine aktuelle Belegung.
Den FC könntest du noch mit einem Start-Eingang versehen, um ihn einmal vor deiner Positionierung zu starten.
Den Fall, wenn kein Fach frei ist, musst du gesondert behandeln -> was soll dann passieren (z.B. Störung "Lager ist voll" anzeigen)
 
Sowas hatte ich vor ganz langer Zeit in der Ausbildung auch mal zu automatisieren. Ich habe das so gelöst, dass ich einen Zähler hatte den ich Dividiert habe mit der Maximalzahl der Plätze pro Etage für die Bestimmung der Höhe und eine Modulodivison gemacht habe um den Platz in der Etage zu ermitteln. Das ganze hatte den Charme, dass ich so auch gleich die Sollwerte für die Impulszählung der Positionsbestimmung hatte.
Ich hoffe ich habe mich ein wenig verständlich ausgedrückt.

Gesendet von meinem SM-G930F mit Tapatalk
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Sowas hatte ich vor ganz langer Zeit in der Ausbildung auch mal zu automatisieren. Ich habe das so gelöst, dass ich einen Zähler hatte den ich Dividiert habe mit der Maximalzahl der Plätze pro Etage für die Bestimmung der Höhe und eine Modulodivison gemacht habe um den Platz in der Etage zu ermitteln. Das ganze hatte den Charme, dass ich so auch gleich die Sollwerte für die Impulszählung der Positionsbestimmung hatte.
Ich hoffe ich habe mich ein wenig verständlich ausgedrückt.

Gesendet von meinem SM-G930F mit Tapatalk

Das mit der Rechnung und Modulo ist natürlich sehr elegant, kurz und knackig :)
Lesbarkeit ist etwas gewöhnungsbedürftig :)

Man könnte mit der Rechung auch ein Kombination mit dem Array machen
Division den Reihen-, Module den Spalten Index und im Array dann einen UDT für den Lagerplatz "Inhalt"
 
Aber wenn du nu 3 rest 2 rausbekommst, weist du doch noch nicht welche Plätze frei sind. Ausser es wird explizit nacheinander eingelagert.
Was ist aber wenn in Etage 2 Platz 2 was rausgenommen wird? Ergäbe das nicht 1 Rest 4? Das sagt dann aber nichts über die freie Position, oder?
 
Das elegante an der ModuloLösung ist, dass sie anscheinend keiner versteht ;o)
Damit wird doch nur aus einer laufenden Numerierung die "SpaltenNr" extrahiert!
So, wie man durch Division und "Abschneiden" der NachkommaStellen die "ZeilenNr" isolieren würde.
Das Problem, sich ausserdem noch merken zu müssen, welche Plätze frei bzw. belegt sind, erledigt sich dadurch leider nicht.

Gruss, Heinileini
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vorschlag:
Für jede Etage ein Word reservieren (z.B.in DB_Regal), dann kannst du das bis max 16 Plätze je Etage erweitern.
Das machst du am besten als Array!

Dann machst du dir einen FC, der aus einem Word die erste Null in den Bits findet (das gibt' sicherlich fertig)
den rufst du 5x hintereinader mit dem entsprechenden WORD für die Etage auf.

Das Signal, dass der FC eine 0 gefunden hat auf einen Hilfsmerker,
mit diesem Hilfsmererker dann alle der nachfolgenden FC-Aufrufe blockieren.

das geht alles in FUP, wenn's denn unbedingt sein muss!
 
Hier eine Demo, hab ich zwar auf die Schnelle in Step7 gemacht, funktioniert aber in TIA genauso.

Hier noch der Code von FindFirstBit, (ist direkt aus TIA kopiert)
Ist noch AWL und geht daher nicht auf der 1200er

Code:
FUNCTION "m7a_FirstBit_INT" : Void
TITLE = sucht das erste gesetzte Bit in einem INT-Wert : BIE:= >0
{ S7_Optimized_Access := 'FALSE' }
AUTHOR :  
FAMILY :  
VERSION : 0.1
//
   VAR_INPUT 
      Wert : Int;   // zu prüfender Wert
   END_VAR

   VAR_OUTPUT 
      BitPos : Int;   // Position des ersten gesetzten Bits
   END_VAR


BEGIN
NETWORK
TITLE = Nr des ersten gesetzten Bits
      L #Wert;// zu prüfenden Wert in Akku
      L 0;// vergleichen ob Wert = 0
      <>I;// dann Ende, wenn nicht muss mind. 1 Bit gesetzt sein
      SAVE;// Anzahl Bits <> 0 in BIE-Bit speichern
      SPBN end;// ENDE, wenn Wert = 0
      INC 1;// Schleifenzaehler in Akku 1 auf 1 stellen = BitPosition
      TAK;// zu prüfende Bits in Akku 1 zurück
Loop:      SRW 1;// 1 Bit hinausschieben
      SPP save;// wenn poitiv, dann erstes Bit gefunden => speichern
      TAK;// Schleifenzaehler in Akku 1
      INC 1;// erhöhen Schleifenzaehler, BitNr.
      TAK;// zu prüfende Bits in Akku zurück
      SPA Loop;// Schleife für nächstes Bit wiederholen
save:      TAK;// Schleifenzaehler, BitNr in Akku 1
end:      T #BitPos;// BitPosition zurückgeben


END_FUNCTION


FB20.jpg
 
Zurück
Oben