# Programm für Paternoster Regal



## progi12 (19 Oktober 2005)

Hallo zusammen,

habe folgendes Problem: Ich soll für ein Paternosterregal mit 38 Regalfächern ein Ablaufprogramm schreiben. Nach Eingabe des Zielfaches sollte die Steuerung (Siemens S7-200) den kürzesten Weg berechnen und die kürzeste Richtung ansteuern. Ich hab`s schon mit folgender Formel versucht 
1. Rechnung Betrag(Quellfach  - Zielfach)
2. Rechnung Betrag (Quellfach-Zielfach-Anzahlfächer) 
Abfrage welcher Wert kleiner ist dannn entweder rechtsrum oder linksrum

aber die Ergebnisse sind frustrierend  Hat mir jemand einen Tipp wie ich es am besten programmieren kann oder eine passende Formel für die Berechenung des Kürzesten Weges.


----------



## Zottel (19 Oktober 2005)

progi12 schrieb:
			
		

> Abfrage welcher Wert kleiner ist dannn entweder rechtsrum oder linksrum
> 
> aber die Ergebnisse sind frustrierend  Hat mir jemand einen Tipp wie ich es am besten programmieren kann oder eine passende Formel für die Berechenung des Kürzesten Weges.


Unter der Annahme daß:
1. Die fächer fortlaufend von 1 -38 nummeriert sind.
2. Der Weg von einem Fach zum anderen immer gleich lang ist egal ob von 4 nach 5 oder von 26 nach 27:
3. rechtsherum aufsteigende Fachnummern bedeutet

If ((Ziel -Quelle +38 ) modulo 38 ) < (38/2) then rechts else links.
Erklärung "modulo" liefert den Rest beim Teilen. Das spart dir irgenwelche Fallunterscheidungen für negative und positive Differenzen.
Das +38 sorgt dafür, daß die Modulo-Funktion nur positive Zahlen vorgesetzt bekommt.
Beispiel. Ziel 3, Quelle 37
3-37 = -34.
-34 +38 =4
4 mod 38 = 4
4 < 19, besser rechts/vorwärts

Beispiel. Ziel 37, Quelle 3
37-3 = 34.
34 +38 =72
4 mod 38 = 34 (72 / 38 = 1, rest 34)
34 > 19, besser links/rückwärts


----------



## Zefix (19 Oktober 2005)

Hallo, 
bin zwar nicht so der Experte aber ich versuch mich mal 

Mit Zielfach meinst du wahrscheinlich eine Artikel oder Sachnummer o.ä.

Denn wenn du das Zielfach direkt angibst brauchst du nichst ermitteln.

Würde so  anfangen:

In einen DBeine Structur mit 38 "Fächern" als String oder Arrays of Char deklariert in dem dann die, ich nenns mal Sachnummern stehen.

Nun in SCL die Istposition (z.b. Fach 18 ) nehmen und durch 2 schleifen
die Sachnummern über die Indexvariable der Structur vergleichen.
Jeder Schleife eine andere Laufvariable z.b I1 und I2.

zum schluss vergleichen welche laufvariable kleiner ist und du weisst welche richtung.

Hoffe ich hab deine Frage richtig verstanden...

Gruss Andy


----------



## Zefix (19 Oktober 2005)

OK, Zottel war schneller


----------



## progi12 (20 Oktober 2005)

*"Modulo" Funktion auch in S7-200*

Vielen Dank für den Tipp zottel. 
Der Befehl "Modulo" gibt es in der S7-200 nicht im Befehlsforrat. Welcher Simatic code wäre hier nötig.


----------



## lorenz2512 (20 Oktober 2005)

Hallo,
die Funktion Festpunktarithmetik Div gibt ein 32bit Wert aus, einmal den Bereich ganze Zahl, und einmal Rest.


----------



## RolfB (20 Oktober 2005)

Hallo,

wenn der Befehl 'modulo' nicht zu Verfügung steht,
kann man vor der Berechnung des Offsets durch
einen Vergleich  Ziel < Quelle und entsprechender
Addition verhindern, das man negative Werte erhält.

Für den Rechtslauf (aufsteigend) gilt:
if (Ziel< Quelle) ?  Ziel = Ziel + AnzahlFächer (+38)
else:Ziel = Ziel;
Offset = Ziel - Quelle;
if(Offset < (Anzahl/2) ? =Rechtlauf
else: =Linkslauf


mfg.
Rolf


----------



## progi12 (21 Oktober 2005)

*Programm läuft*

Hallo zusammen,

vielen herzlichen Dank für euere Bemühung. Ohne die nutzlichen Tipps hätte ich es nicht hinbekommen. 

Aber jetzt läufts!!!!  

Danke an alle die sich  Gedanken gemacht haben. Bis zum nächsten Mal.


----------



## Unreal (23 Oktober 2005)

Servus,

kurze Info:
Modulo-operator für S7-200

http://support.automation.siemens.c...view=4000003&viewLevel=6&wttree=cs&jumpto=255


MfG Unreal


----------

