# Hochregallager programmieren - aber wie ?



## Elektrobody (3 Mai 2007)

Hallo SPS-Fans,
ich hab Probleme, folgende Aufgabe zu lösen:
Ein Hochregallager hat 4 Ebenen mit jeweils 7 Lagerplätzen. Es hat also insgesamt 28 Lagerplätze. Für die Speicherung der Informationen zur Lagerbelegung soll hier ein Datenbaustein angelegt werden. Jedem der Lagerplätzen wird eine Nummer zugeordnet. Die laufende Nummer beginnt beim unteren rechten Lagerplatz und endet beim oberen rechten Lagerplatz. Für jedes Lagerfach soll in dem Datenbaustein ein Speicherplatz mit 16 Bit vom Format INT zur Verfügung stehen. Hier wird für die Belegung jedes Lagerplatzes folgende Zuordnung festgelegt: 
0 == leer; 1 == besetzt
Wenn nun ein entsprechendes Teil auf einem Lagerplatz liegt, so steht der jeweilige Wert im Datenbaustein. In einer Standardfunktion soll nun bei einer steigenden Flanke ein Taster BD_SH6 vom Lagerplatz 1 an steigend der erste leere Lagerplatz gesucht werden und als OUT -Variable zur Verfügung gestellt.
Außerdem sollen die Positionswerte für ein Anfahren des ermittelten Lagerplatzes von der Endlage links unten ausgegeben werden. Diese sollen passend für die Zähler im BCD-Code vorliegen.
Für die Positionierung werden bei jedem Lagerplatz horizontal und vertikal Impulse gezählt. Lagerplatz 17 hat beispielsweise für eine Positionierung von links unten aus 5 Impulse und 3 Impulse.
Zuordnungsliste:
Symbol Adresse Kommentar
BD_SH6 E 1.6 Bedienpult weiß SH6
LP_Leer MW 10 Erster LP leer
Pos_ver_leer MW 12 Erster LP vertikal leer
Pos_hor_leer MW 14 Erster LP horizontal leer
M_Flanke_SH6 M 10.0 Flankenmerker SH6

Aufgabe:
- Projekt ABC erstellen
- Datenbaustein DB20 (z.B.) mit 28 LP für Werte vom Format INT anlegen
(ARRAY dazu nutzen)
- Vorbelegung in die Aktualwerte des Datenbausteins schreiben: die zwei unteren Ebenen sind besetzt.
- Standardfunktion FC xx anlegen und ein Programm in AWL erstellen:
Von LP 1 an aufsteigend wird bei einer steigenden Flanke am Taster BD_SH6 der erste leere LP gesucht und 
die Nummer dieses LP-Faches als OUT- Variable zur Verfügung gestellt. 
- Außerdem sollen die Positionswerte für ein Anfahren des ersten leeren LP von der Endlage links unten 
ermittelt werden. Diese sollen passend für die Zähler an zwei OUT-Variablen im BCD-Code vorliegen.
- Da in diesem Standardbaustein keine globalen Variablen vorkommen dürfen, soll auch die Nummer des 
durchsuchten Datenbausteins dem F xx als IN-Variable übergeben werden. Die Adressierung innerhalb des FC 
erfolgt nur dann am besten, wenn der Datenbaustein mit dem Befehl AUF DB20 zuerst geöffnet und dann auf 
dessen Daten zugegriffen wird. 
- Fc xx mit den oben angegebenen Merkern beschalten und mit Hilfe des Tasters BD_SH6 im OB12 
aufrufen

Ich habe schon mehrere Tage dieses Programm in SIMATIC Step S7 herumprobiert, es ist mir jedoch bisher bis jetzt nicht gelungen, eine vernünftige Lösung zu finden. 
Ich wäre froh, wenn einer von Ihnen mir eine passende Lösung anbieten könnte. Verschiedene Lösungsmöglichkeiten sind mir natürlich auch hier herzlich willkommen. 

Ich bin gespannt auf Ihre Antwort.

Gruß Elektrobody


----------



## Larry Laffer (4 Mai 2007)

Hallo,
wenn dir das reicht werde ich mich heute Abend mal mit der Sache auseinandersetzen.
Wäre schön, wenn du zu den Ziel-Positionen noch nähere Angaben machen könntest (wie groß ist der Pos.Wert als Zahl) - ich habe das so verstanden, dass du die Ziel-Pos. für den nächsten Lagerplatz auch gleich geliefert bekommen möchtest.

So nebenher - merkst du dir nicht, was du in einen Lagerplatz gepackt hast (Code-Nummer für Datensatz oder so ...) ?


----------



## Seppl (4 Mai 2007)

Elektrobody schrieb:


> Hallo SPS-Fans,
> 
> Ich bin gespannt auf Ihre Antwort.
> 
> Gruß Elektrobody



Leider nutzen die Kollegen von der Hausaufgabenbetreuung derzeit das schöne Wetter (kein Ende in Sichtweite) und liegen mit gutem Weißbiervorrat am Baggersee.

Siehe auch hier:

http://www.sps-forum.de/showpost.php?p=73968&postcount=2

Prost Seppl


----------



## Elektrobody (4 Mai 2007)

Larry Laffer schrieb:


> Hallo,
> wenn dir das reicht werde ich mich heute Abend mal mit der Sache auseinandersetzen.
> Wäre schön, wenn du zu den Ziel-Positionen noch nähere Angaben machen könntest (wie groß ist der Pos.Wert als Zahl) - ich habe das so verstanden, dass du die Ziel-Pos. für den nächsten Lagerplatz auch gleich geliefert bekommen möchtest.
> 
> So nebenher - merkst du dir nicht, was du in einen Lagerplatz gepackt hast (Code-Nummer für Datensatz oder so ...) ?


 

Hallo Larry Laffer,
Positionswerte der Lagerplätze sind selbst die Nummer, die den LP zugewiesen sind. Wie schon gesagt, sind die zwei unteren Ebenen mit "1" besetzt. das heißt Die Lp Nr. 1 bis 14 sind mit "1" (Code) gepackt. Die Aufgabenstellung besagt, dass der erste leere Lagerplatz mit entsprechender Nummer ermittelt werden soll. In diesem Fall soll der LP Nr. 15 mit vertikaler Position 3 und horizontaler Position 5 sein. 
Hinweis:
Die laufende Nummer beginnt vom ersten unteren rechten LP aus.
Die Impulse für eine Positionierung werden vom ersten linken LP aus gezählt. 
Meine Frage ist auch: Siehe oben Zitat in meinem Beitrag: "..... sollen passend für die Zähler im BCD-Code vorliegen.") Heißt das, dass die zwei Zähler tatsächlich hier eingesetzt werden sollen? oder sollte dies doch nicht der Fall sein, sollte das Programm so gestaltet werden, als wären die Zähler da.

Gruß Elektrobody


----------



## Elektrobody (4 Mai 2007)

Seppl schrieb:


> Leider nutzen die Kollegen von der Hausaufgabenbetreuung derzeit das schöne Wetter (kein Ende in Sichtweite) und liegen mit gutem Weißbiervorrat am Baggersee.
> 
> Siehe auch hier:
> 
> ...


 
Viel Spass bei einem solchen Wetter und beim Baden 

Gruß Elektrobody


----------



## Kai (4 Mai 2007)

Elektrobody schrieb:


> Ein Hochregallager hat 4 Ebenen mit jeweils 7 Lagerplätzen. Es hat also insgesamt 28 Lagerplätze. Für die Speicherung der Informationen zur Lagerbelegung soll hier ein Datenbaustein angelegt werden. Jedem der Lagerplätzen wird eine Nummer zugeordnet. Die laufende Nummer beginnt beim unteren rechten Lagerplatz und endet beim oberen rechten Lagerplatz.


 
Ist die Nummerierung der Lagerplätze so richtig? Sonst bitte im Word-Dokument ändern.  

Gruß Kai


----------



## Kai (4 Mai 2007)

Elektrobody schrieb:


> Außerdem sollen die Positionswerte für ein Anfahren des ermittelten Lagerplatzes von der Endlage links unten ausgegeben werden. Diese sollen passend für die Zähler im BCD-Code vorliegen.
> Für die Positionierung werden bei jedem Lagerplatz horizontal und vertikal Impulse gezählt. Lagerplatz 17 hat beispielsweise für eine Positionierung von links unten aus 7 Impulse und 3 Impulse.


 
Wenn die Nummerierung so richtig ist wie in meinem obigen Bild, bräuchte der LP 17 bei einer Positionierung von unten links aus nicht 5 Impulse nach rechts und 3 Impulse nach oben?  

Gruß Kai


----------



## Kai (4 Mai 2007)

Elektrobody schrieb:


> Die laufende Nummer beginnt vom ersten unteren rechten LP aus.
> Die Impulse für eine Positionierung werden vom ersten linken LP aus gezählt.
> Meine Frage ist auch: Siehe oben Zitat in meinem Beitrag: "..... sollen passend für die Zähler im BCD-Code vorliegen.") Heißt das, dass die zwei Zähler tatsächlich hier eingesetzt werden sollen? oder sollte dies doch nicht der Fall sein, sollte das Programm so gestaltet werden, als wären die Zähler da.


 
Ich verstehe das so, dass Du nur einen FC erstellst, der die Nummer des ersten freien LP sowie die Positionswerte (Impulse nach rechts und Impulse nach oben als BCD-Wert) ausgibt.

Die Zähler werden erst für das Anfahren des freien LP benötigt, und da Du das Anfahren hier nicht programmieren brauchst, brauchst Du auch keine Zähler. Du gibst mit den Positionswerten nur die Sollwerte für die Zähler als BCD-Wert vor.

Gruß Kai


----------



## Elektrobody (4 Mai 2007)

Kai schrieb:


> Ist die Nummerierung der Lagerplätze so richtig? Sonst bitte im Word-Dokument ändern.
> 
> Gruß Kai


Anbei das geänderte Wort-Dokument
Gruß ELektrobody


----------



## Elektrobody (4 Mai 2007)

Kai schrieb:


> Wenn die Nummerierung so richtig ist wie in meinem obigen Bild, bräuchte der LP 17 bei einer Positionierung von unten links aus nicht 5 Impulse nach rechts und 3 Impulse nach oben?
> 
> Gruß Kai


 
PARDON!!

Oben in der Aufgabenstellung habe ich mich leider vertippt:
Richtig soll es heißen:
Lagerplatz 17 hat beispielsweise für eine Positionierung von links unten aus *5* ( nicht 7 !)Impulse und 3 Impulse.

Gruß Elektrobody


----------



## Kai (4 Mai 2007)

Elektrobody schrieb:


> Anbei das geänderte Wort-Dokument
> Gruß ELektrobody


 
Ich sehe keine Änderungen.  

Gruß Kai


----------



## Kai (4 Mai 2007)

Elektrobody schrieb:


> Zuordnungsliste:
> Symbol Adresse Kommentar
> BD_SH6 E 1.6 Bedienpult weiß SH6
> LP_Leer MW 10 Erster LP leer
> ...


 
Das geht so nicht, es gibt hier ein Überschneidung der Merkerbereiche.

Änderungsvorschlag: M_Flanke_SH6 M16.0

Gruß Kai


----------



## gravieren (4 Mai 2007)

Hi

Ist eigentlich Ideal für die Programierung mit UDTs und  SCL   


Habt ihr eich schon für eine Programmiersprache entschieden.


----------



## Kai (4 Mai 2007)

Elektrobody schrieb:


> Aufgabe:
> -- Standardfunktion FC xx anlegen und ein Programm in AWL erstellen:


 
@gravieren,

das Programm soll in AWL erstellt werden.

Gruß Kai


----------



## gravieren (4 Mai 2007)

Hi Kai

Ups, viel Spass bei der Aufgabe.


Werde im "Hintergrund" mitlesen.

Aufgabe ist bestimmt NICHT Trivial.
(Zumal OHNE SCL oder so)


----------



## Kai (4 Mai 2007)

So, ich mal ein bisschen rumprogrammiert. Viel Spaß beim Ausprobieren.  

Gruß Kai


----------



## Elektrobody (4 Mai 2007)

Elektrobody schrieb:


> Anbei das geänderte Wort-Dokument
> Gruß ELektrobody


Beim Abspeichern eines geänderten Word-Dokuments bleibt der Inhalt jedoch der gleiche wie vorher.
Die folgende Nummerierung der LP sieht wie folgt aus:
1. unterste Ebene:
Lp Nr. 1 ganz rechts -- LP Nr. 7 ganz links
2. Ebene:
Lp Nr. 8 ganz rechts -- LP Nr. 14 ganz links
3. Ebene:
Lp Nr. 15 ganz rechts -- LP Nr. 21 ganz links
4. oberste Ebene:
Lp Nr. 22 ganz rechts -- LP Nr. 28 ganz links

Gruß Elektrobody


----------



## Kai (4 Mai 2007)

Ich habe das Programm an die neue Nummerierung angepasst.

Es wurden das Word-Dokument und der DB20 geändert.

Gruß Kai


----------



## Kai (5 Mai 2007)

Hier noch eine weitere Lösungsmöglichkeit der Aufgabe. In dem neuen Programm wird mit 3 Zählern als Indizes gearbeitet, und die Anzahl der Impulse horizontal und Impulse vertikal werden nicht als DW in einem DB gespeichert, sondern im FC berechnet.  

Gruß Kai


----------



## dpd80 (5 Mai 2007)

Kai schrieb:


> Hier noch eine weitere Lösungsmöglichkeit der Aufgabe. In dem neuen Programm wird mit 3 Zählern als Indizes gearbeitet, und die Anzahl der Impulse horizontal und Impulse vertikal werden nicht als DW in einem DB gespeichert, sondern im FC berechnet.
> 
> Gruß Kai




Sag mal bekommst du eigentlich Geld dafür, oder hast du nur gerade nichts zu tun?


----------



## Kai (5 Mai 2007)

Das mit dem Geld ist eine gute Idee, vielleicht sollte ich mal einen kostenpflichtigen Download für meine Programme einrichten. :sc7: 

Jetzt geht es aber raus aufs Wasser, noch eine Runde segeln gehen. :sm21: 

Gruß Kai


----------



## volker (5 Mai 2007)

nur mal so nebenbei. 
auf meiner hp liegt ein komplettes prog für ein 2-dimensionales hochregallager.


----------



## Elektrobody (6 Mai 2007)

Kai schrieb:


> Ich habe das Programm an die neue Nummerierung angepasst.
> 
> Es wurden das Word-Dokument und der DB20 geändert.
> 
> Gruß Kai


 
Ihre seid sicher in der SPS Programmierung so weit fortgeschritten, dass ich den Anschluss fast verloren hätte..... 
Als SPS Anfänger habe ich daher eine Bitte um detaillierte Erklärung:
1) Oben in der Aufgabenstellung liest man: Im Standardbaustein dürfen keine globalen Variablen vorkommen. Daher soll die Nummer des durchsuchten Datenbausteins als IN- Variable dem FC übergeben werden. Mir wurde jedoch erklärt, dass man keine Daten des DB in die Symboltabelle eintragen darf, wenn man auf lokale Daten zugreift. In Deiner Symboltabelle stehen trotzdem die Daten des Datenbausteins. Warum ?
2) Muss man immer zuerst die Nummer des DB mit dem Befehl L DB_NR laden und dann in ein Merkerwort transferien, bevor man ihn mit dem Befehl AUF _DB öffnet. Oder kann man den DB auch gleich mit dem AUF_DB aufschlagen ???


----------



## volker (6 Mai 2007)

zu 2.
es kann auch mir auf db gearbeitet werden, dann muss der in-patameter aber als block-db deklariert sein.

mit einem int arbeiten ist schöner da du dadurch variabler bist.


----------



## Kai (6 Mai 2007)

Elektrobody schrieb:


> 1) Oben in der Aufgabenstellung liest man: Im Standardbaustein dürfen keine globalen Variablen vorkommen. Daher soll die Nummer des durchsuchten Datenbausteins als IN- Variable dem FC übergeben werden. Mir wurde jedoch erklärt, dass man keine Daten des DB in die Symboltabelle eintragen darf, wenn man auf lokale Daten zugreift. In Deiner Symboltabelle stehen trotzdem die Daten des Datenbausteins.


 
Leider habe ich Deine Frage nicht so richtig verstanden.  

In der Symboltabelle stehen eigentlich keine Daten des DB, es stehen dort nur die Symbole für die Datenbausteine selber, also:

DB20_HOCHREGALLAGER für den DB20 und DB22_HOCHREGALLAGER für den DBD22

Kannst Du noch mal erklären, was Du mit Daten des DB meinst? 

Gruß Kai


----------



## Elektrobody (7 Mai 2007)

Kai schrieb:


> Leider habe ich Deine Frage nicht so richtig verstanden.
> 
> In der Symboltabelle stehen eigentlich keine Daten des DB, es stehen dort nur die Symbole für die Datenbausteine selber, also:
> 
> ...


Vielleicht habe ich mich nicht deutlich genug ausgedruckt. Wenn man auf lokale Daten des DB zugreifen möchte, sollte man etwas nichts vom DB in der Symboltabelle stehen lassen. 
Gruß Elektrobody


----------



## Kai (7 Mai 2007)

Elektrobody schrieb:


> Wenn man auf lokale Daten des DB zugreifen möchte, sollte man nichts vom DB in der Symboltabelle stehen lassen.


 
Das ist so nicht richtig. Dadurch, dass der DB in der Symboltabelle steht, wird das Programm sehr viel übersichtlicher.

Man kann z. B. ohne Probleme auf das DW0 und DW2 des DB22 zugreifen, obwohl der DB22 in der Symboltabelle steht.

Gruß Kai


----------



## Kai (7 Mai 2007)

Nachtrag:

Es ist natürlich nicht möglich, in der Symboltabelle Symbole für einzelne DW eines DB zu vergeben, also z. B. das Symbol LP1 für das DW0 des DB22. Der Editor der Symboltabelle gibt dann eine Fehlermeldung aus, dass der Adresstyp unbekannt ist.

Eine solche Symbolvergabe würde ja auch keinen Sinn machen. Bei der Verwendung von mehreren DBs hätte man ja für jeden DB ein eigenes DW0, und in der Symboltabelle müsste man mehrere Symbole für das DW0 vergeben. Das geht natürlich nicht, da eine eindeutige Zuordnung nicht mehr gegeben wäre.

Gruß Kai


----------



## Elektrobody (7 Mai 2007)

Was die Vergabe von Symbolen für DB in der Symboltabelle angeht, habe ich im wesentlichen besser verstanden als vorher. Danke


----------



## Kai (8 Mai 2007)

Ich habe von Elektrobody heute folgende Nachricht bekommen:



			
				Elektrobody schrieb:
			
		

> _Hallo Kai,_
> _Ihre letzte Lösungsmöglichkeit zur Programmierung des Hochregallagers mit drei Zählern kann ich als SPS-Anfänger besser nachvollziehen. Noch einmal danke dafür._
> _eine andere Aufgabe zum Hochregallager:_
> _Die Beschreibung zum Aufbau und zur Lagerbelegung bleibt die gleiche wie sie ich eingangs im Forum "Hochregallager programmieren aber wie ?" bereits gepostet habe. Vorher hieß es den erste leeren LP zu suchen. _
> ...


 
Hier eine mögliche Lösung der neuen Aufgabe. Es wurden ein neuer FC24 und ein neuer DB24 erstellt.  

Gruß Kai


----------



## volker (8 Mai 2007)

ganau das macht die fc85 aus meinem oben erwähnten prog.


----------

