Lagersystem

Snowsnaker

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
hallo zusammen,
hab mir ein Buch gekauft und durchgearbeitet (Step 7 Chrashkurs)
hab einiges gelernt, nun hab ich aber folgendes Problem.

Kurz die Gegebenheiten.
Lagerplätze sind im Kreis auf 6 Etagen angeordnet.
Eine Achse mit Nocken um einen Hubturm zu drehen.
Eine Hubachse mit Nocken um Ladefläche hoch und runter zu bewegen.
2 Endschalter um Ein- und Ausfahren der Ladegabel abzufragen.

Wie kann ich dem System sagen, welche Plätze frei sind und welche belegt sind. (Lagerplätze werden nicht mit Taster abgefragt)
Stelle mir so eine Art Tabelle vor.
2 dimensionen, 1...6 und die SPS frägt ab, wo steht ne Null und wo ne Eins
entsprechend ruft sie dann ein Programmbaustein auf, wie oft si über die jeweilige Nocke fahren muß....
Wenn sie etwas in einen Platz gelegt hat muß sie entsprechend eine Eins in das feld schreiben.

I 1 I 2 I 3 I 4 I 5 I 6 I
1 I 1 0 0 1 1 1
2 I 0 1 1 0 0 1
3 I.................
4 I............
5 I........
6 I...

Bin ich da weit weg mit meinen Gedanken, oder geht so was in der Art.
http://www.sps-forum.de/images/icons/icon6.gif
 
Genau so würde ich das machen.
Achtung bei den Nocken mußt du im Programm sicherstellen, daß sich die SPS nicht verzählen kann z.Bsp. durch prellen, oder wenn sie zufällig genau an einer Nockenkante stehenbleibt und dann wackelt. Sonst fährst du an die falsche Stelle und es kracht (zwei Nocken, die Wechselseitig kommen müssen helfen da schon viel weiter, ist aber ein Eingang mehr). Auf jeden Fall irgendeine Sicherheit einbauen, eine LS an der Ladegabel, oder wenigstens Kollisionsschutzschalter.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Gedanklich hab ich des mir zwar schon so vorgestellt, aber wie geht so was zu Programmieren. Da fällt mir nix ein. Muß dazu sagen, daß ich mich erst seit ca. 3Monaten mit SPS beschäftige


Genau so würde ich das machen.
Achtung bei den Nocken mußt du im Programm sicherstellen, daß sich die SPS nicht verzählen kann z.Bsp. durch prellen, oder wenn sie zufällig genau an einer Nockenkante stehenbleibt und dann wackelt. Sonst fährst du an die falsche Stelle und es kracht (zwei Nocken, die Wechselseitig kommen müssen helfen da schon viel weiter, ist aber ein Eingang mehr). Auf jeden Fall irgendeine Sicherheit einbauen, eine LS an der Ladegabel, oder wenigstens Kolosionsschutzschalter.
 
Gerade bei solchen Dingen läßt sich am leichtesten mit SCL arbeiten, ansonsten wirst du nicht um indirekte Adressierung herumkommen, um deine Belegtinfo im Array abzulegen. (Ich würde Int nehmen und nicht Boolean, da kann man auch noch andere Infos unterbringen.)

Die legst eine UDT (z.Bsp UDT12) an, darin Variable Etagenplatz Array[1..8] Int.
Dann eine Datenbaustein Variable Etage Array[1..6] UDT12.
Den DB nennst du in der Symbolik Lager.

Dann könntest du in SCL wie folgt darauf zugreifen:

Code:
I := 1;
 K := 1;
 "Lager".Etage[i].Etagenplatz[K] := 1;
Das wäre für dich das Einfachste, hast du kein SCL wird schwieriger, dann kannst du gleich mal hier im Forum auf die Suche gehen, nach indirekter Adressierung.

Ich denke, ein ähnliches Thema hatten wir hier schon einmal, such mal nach Regallager, Hochregallager u.ä.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

aber SCL nach drei Monaten SPS-Erfahrung ???

Gruss

Question_mark

Oh Mann, :sm11:

wenn jemand Hochsprachen kennt (Delphi, Pascal, C)
der wird mit SCL sofort klarkommen, mit KOP/FUP/AWL aber erstmal auf dem Schlauch stehen.

Kommt jemand aus dem Assembler Bereich (wenns den noch gibt..) ist es genau andersrum.

SCL ist, gerade bei komplexeren mathematischen Dingen, sehr hilfreich und zeitsparend und hat rein garnichts mit SPS - Erfahrung zu tun.
Sondern eben mit Hochsprachenerfahrung.
 
ok, hab mir mal das Regallagersystem angeschaut, da ist ja ne SCL drin.
hilft mir halt bloß net arg weiter.
hab in der Arbeit Kontakt zu nem Lehrgangsreferenden aufgenommen, der kann mir weiterhelfen.
Ich halt euch auf dem laufenden

Danke vorerst für die Antworten und Vorschläge
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Scl

Hallo,

UG schrieb:
wenn jemand Hochsprachen kennt (Delphi, Pascal, C)
der wird mit SCL sofort klarkommen,

Na sicher wird der mit SCL sofort klarkommen, der wird nur nicht mal begreifen, warum sich der Rundtisch 5-mal um die eigene Achse gedreht hat und nun ohne Kabel und Hydraulikleitungen dasteht. :ROFLMAO:

Gruss

Question_mark
 
Passt hier evtl gut rein! Habe nochmal eine generelle Frage zum Lagersystem! Wenn wir hier eine Variable für eine Etage, eine Variable für den Etagenplatz haben! Wie realisiert man dann am besten ein System mit Etage, Etagenplatz, Belegt/Nicht belegt, Wert(wissen was drin liegt, wenn z.b unterschiedliche größen nur in bestimmte fächer passen etc.)! Bis jetzt habe oft nur gesehen, dass in allen Fächer was reingelegt werden kann und nicht nur in bestimmten!

Schönen Gruß

Gerade bei solchen Dingen läßt sich am leichtesten mit SCL arbeiten, ansonsten wirst du nicht um indirekte Adressierung herumkommen, um deine Belegtinfo im Array abzulegen. (Ich würde Int nehmen und nicht Boolean, da kann man auch noch andere Infos unterbringen.)

Die legst eine UDT (z.Bsp UDT12) an, darin Variable Etagenplatz Array[1..8] Int.
Dann eine Datenbaustein Variable Etage Array[1..6] UDT12.
Den DB nennst du in der Symbolik Lager.

Dann könntest du in SCL wie folgt darauf zugreifen:

Code:
I := 1;
 K := 1;
 "Lager".Etage[i].Etagenplatz[K] := 1;
Das wäre für dich das Einfachste, hast du kein SCL wird schwieriger, dann kannst du gleich mal hier im Forum auf die Suche gehen, nach indirekter Adressierung.

Ich denke, ein ähnliches Thema hatten wir hier schon einmal, such mal nach Regallager, Hochregallager u.ä.
 
Statt einer Integer-Variablen, wie im Beispiel, kannst du z.Bsp. eine Struct je Etagenplatz definieren. Darin gibts dann eine Variable für Belegt, Inhalt etc.
Das ist die schönste, aber auch komplexeste Variante, die ist dann tatsächlich am Besten in SCL zu programmieren.

Aber selbst mit der, im Moment abgespeicherten, Integer-Variablen, kann man ja schon so einiges anstellen. Du könntest 1 Byte für den Füllstand nutzen (falls mehrere Teile hineingelegt werden können) und 1 Byte für eine Teileinfo. Nimmst du eine DWord statt Int, hast du 4 Byte zur Vergügung.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
An die Int Lösung wollte ich auch gerne ran! Nur mir fehlt noch die Umsetzung! Ich habe mal eine Zeichnung zum anschauen! In dem Beispiel ist z.b Zeile 2 Spalte 2 mit dem Wert 100 beschrieben! Ich dachte nun daran, den Wert mal zehn zu multiplizieren auf 1000 und somit ist sie leer!
Würde sie den Wert 0 haben, würde es ja nicht gehen, weil die Fächer bestimmt seien sollen! Beim beschrieben würde sie dann wieder auf 100 dividiert und ist somit wieder belegt! Ich finde die Lösung aber selber sehr unelegant und da würde ich mich über einen andere Lösung freuen, um von meiner weg zu kommen oder ist das der richtige Weg so?

Gruß
 

Anhänge

  • regallager.jpg
    regallager.jpg
    37,4 KB · Aufrufe: 15
So nun habe ich mit einem DB und UDT rumprobiert und bin zu diesem Ergebnis gekommen!

Wie kann ich den DB denn beschreiben! Der "Wert" sind ja feste definierte Werte die ich nur einmal eintragen muss! Und dann müsste ich in SCL ja nur nach den Werten suchen und den Wert "Belegt" verändern (True/False)! Wie macht man so eine suche in SCL, habe da sehr wenig mit gearbeitet, aber würde das gerne lernen!

PS: Nur kurze Frage nebenbei, wofür steht := immer ? (IST GLEICH ???)

Freue mich auf Antworten!
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
So nun habe ich mit einem DB und UDT rumprobiert und bin zu diesem Ergebnis gekommen!

Wie kann ich den DB denn beschreiben! Der "Wert" sind ja feste definierte Werte die ich nur einmal eintragen muss! Und dann müsste ich in SCL ja nur nach den Werten suchen und den Wert "Belegt" verändern (True/False)! Wie macht man so eine suche in SCL, habe da sehr wenig mit gearbeitet, aber würde das gerne lernen!

PS: Nur kurze Frage nebenbei, wofür steht := immer ? (IST GLEICH ???)

Freue mich auf Antworten!

Korrekt, "Ist Gleich" als Zuweisung!

Ich würde die UDT anders organisieren. Die Int für Zeile und Spalte brauchst du ja eigentlich gar nicht, die stecken doch in den Indizes schon drin.

Ich würde es etwa so probieren:

AWL-Quelle für DB12 (Name "Lager")
Code:
DATA_BLOCK DB 12
TITLE =
VERSION : 0.1


  STRUCT     
   Etage : ARRAY  [1 .. 10 ] OF STRUCT     
    Etagenplatz : ARRAY  [1 .. 10 ] OF STRUCT     
     belegt : BOOL ;    
     Inhalt : INT ;    
     Anzahl : INT ;    
    END_STRUCT ;    
   END_STRUCT ;    
  END_STRUCT ;    
begin
END_DATA_BLOCK
SCL-Quelle für FC12 um mal den Zugriff zu zeigen:

Code:
FUNCTION FC12 : INT

VAR_INPUT
   
END_VAR

VAR_TEMP
  // temporäre Variablen
  I,K: INT;
END_VAR

VAR_IN_OUT  
  
END_VAR

  // Anweisungsteil
         
   I := 1;
   K := 1;
   
   "Lager".Etage[i].Etagenplatz[K].Belegt := True;
   "Lager".Etage[i].Etagenplatz[K].Inhalt := 100;
   "Lager".Etage[i].Etagenplatz[K].Anzahl := 3;
  ;
  FC12 := 100;
END_FUNCTION
Du kannst nun ein zwei ineinandergeschachtelten Schleifen, das gesamte "Lager" durchsuchen, indem die die Indizes I und K jeweils von 1 bis 10 laufen läßt.

PS: Ich habs mal ohne UDT gemacht, die Struct kannst du natürlich auch als UDT verpacken.
 
Zuletzt bearbeitet:
Ja die Struktur ist doch noch sehr viel besser.. EIN Danke...


Ich möchte jetzt gerne ein Schleife starten und nach einen Wert suchen! Das ist doch sicherlich mit einer FOR-Anweisung relativ einfach oder? Mach ich dann einen Adressendurchlauf im DB bis der Wert gefunden ist! Ich kann ja immer paar Zeilen überspringen, weil ich ja nur nach den .Inhalt suche! Wie sieht dann die Abfrage in der Anweisung aus ?
 
Code:
   FOR I := 1 TO 10 BY 1 DO
        FOR K := 1 TO 10 BY 1 DO
        // Anweisungsteil
            IF NOT "Lager".Etage[I].Etagenplatz[K].Belegt THEN
                TOut := I;
                KOut := K;
            END_IF;            
        END_FOR;
    END_FOR;
Bringt dir zum Bsp. in TOut und KOut die Indizes des 1. unbelegten Faches, jeweils von 1 an gesucht.
 
Hinter UDT steht im Step7-Manager "Datentyp".
Im Grunde ist das ein Container für beliebige Daten. Diesen Container kann man in FB/FC-Variablendefinitionen und in DB einsetzen. Sie verhalten sich dann dort wie eine Struct, haben aber den Vorteil, daß man sie beliebig oft verwenden kann, also Schreibarbeit spart. Aber Vorsicht, wenn man später an der UDT rumfummelt, ändern sich die DB, und auch die Instanz-DB von FB, welche diese UDT verwenden. Diese müssen dann alle neu übersetzt werden.

PS: Das mit dem Ändern, kann man natürlich auch als Vorteil sehen, je nach Anwendungsfall. :ROFLMAO:
 
Das mit dem Array und der neuen Struktur hat mir ja schon sehr viel weitergeholfen und habe sehr viel draus gelernt :)! Ich möchte das Lagersystem gerne auch visualisieren! Ich hatte das schon mal angesprochen in diesem Forum! Leider bin ich da noch nicht weiter gekommen!
Ich möchte gerne mit einem TP 270 über eine Schaltfläche was aus dem Lager bekommen! Nur die Schaltflächen sollen anwählbar sein und über ein Start befehl nacheinander ausgegeben werden (Siehe bild).
Nächstes Problem, mein Lager hat aber für ein und das gleiche Teil (mit gleichen Wert) 2-3 Plätze -> (3 mal das gleiche vorhanden in 3 einzelnen Fächern)! Der Button sollte grau hinterlegt werden, wenn kein einziges Teil mit dem Wert im Lager ist!

Wie realisiere ich möglichst einfach so eine Routine?

PS: Das blau hinterlegte, die sollen ausgegeben werden!
 

Anhänge

  • auswahl.jpg
    auswahl.jpg
    13,7 KB · Aufrufe: 13
Zurück
Oben