TIA Ausgänge mehrmals setzen? TIA V13

Zuviel Werbung?
-> Hier kostenlos registrieren
Danke Ronin, jetzt ist das ganze um so einiges klarer.

Wir haben ein Touchpanel, auf dem wir die 28 Lagerplätze visualisieren um sie einzeln und unabhängig voneinander (jedoch nicht gleichzeitig) ansteuern zu können.
Dabei wird eingelagert wenn ein Lagerplatz angeklickt wurde und ausgelagert wenn ein voller Lagerplatz angeklickt wurde.
Dazu habe ich den FB gemacht, um das ganze 1mal zu programmieren und dann je nach Lagerplatz der betätigt wurde, meine "Koordinaten" des Lagerplatzes in diese Instanz zu laden.
Wie das einfacher gehen soll, ist mir nicht ganz klar.

Ich werde jetzt auf jeden Fall mal versuchen, die Ausgänge mit einer IN/OUT Variable zu verknüpfen.

Gruss
Automatio
 
Wie das einfacher gehen soll, ist mir nicht ganz klar.
Im Prinzip müsste es nicht soviel anders sein als das was du hast. Man löst nur die Liftansteuerung heraus.
Die Aufgabe des FBs bleibt weiterhin dass er eine Anforderung gibt "Bitte Lift kommen" und von mir aus noch "bitte hier hin fahren" (Koordinaten).
Der Liftansteuerungs-Teil nimmt die Anforderung und Koordination und führt seine Bewegungsaktion aus.

Man könnte im einfachsten Fall ein Array[1..28] of Struct (oder UDT) in einem DB erstellen wobei der Struct ungefähr folgendes enthält...
  • Anforderung_Einlagen
  • Anforderung_Auslagern
  • Koordinaten

Jede deiner FB-Instanzen bekommt seine eigene Anforderung übergeben (Lagerplatz 1 = DB_Anfoderungen.Platz[1]).
Der Lift-Programmteil wertet dann das gesamte Array von 1..28 aus, nimmt sich nach irgendwelchen Kriterien eine Anfoderung und führt diese aus.

Das ist vereinfacht das was vollmi vorgeschlagen hat.
Vorteil ist dass die Entscheidung wann der Lift welche Aufträge macht, einen Hand- oder Einrichtbetrieb fährt, von einer zentralen Stelle im Code getroffen wird.
Auch wenn der Lift plötzlich wegen eines Programm- oder Sensorfehlers einen Blödsinn macht ist es wahrscheinlich leichter wenn man an zentraler Stelle suchen kann.

Stell dir dein Programm einmal ein wenig abstrakt vor als würden Leute den Lift fahren.
In jedem Regal sitzt einer der auf, ab, links, rechts schreit und der Lift-Fahrer machts blind.
Wenn dann plötzlich 2 Regale zum schreien anfangen oder eines einen Handbetrieb will, gibt's Probleme.
Bei Variante zwei schreien zwar mehrere Regale dass Sie was brauchen.
Welches Regal zuerst und wie der Lift dorthin zu fahren hat entscheidet dort der Lift-Fahrer.
Auch die Hand- und Einrichtbetriebe, die ja eher weniger mit den Regalen zu tun haben, managed dann der Liftfahrer selber.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich mache das ganze im FUP und muss zugeben, dass ich noch nie mit DBs gearbeitet habe, wenn sie automatisch erstellt werden ist gut und dann wars das für mich, da muss ich mich wohl mal einarbeiten.

Aber um nochmal auf den Lift zurück zu kommen:
Die Liftpositionierung mache ich in einem extra FB, von dem ich nur 1 habe.
Da habe ich dann Soll > Istposition etc drin.
Wie kriege ich am einfachsten die Sollposition dieser 28 Plätze?
Ich würde jetzt einen FB erstellen, bei dem ich wieder meine 28 Instanzen erstelle und mithilfe von MOVE Blöcken in meine SollVariable schreibe, wobei das wahrscheinlich auch nicht geht, da ich ja dann 28 von denen bräuchte.
Ausser vielleicht, wenn ich sie als IN/OUT Variable deklariere?

Ich stehe in dieser Hinsicht vollkommen auf dem Schlauch.

Gruss
Automatio
 
Ich mach das normal so. Ich habe für die Stellplätze eine Struktur. z.B.
Belegt : Bool;
Inhalt : DINT
Anforderung : Bool;
KoordinateX : INT; // Tiefe
KoordinateY : INT; // Höhe
KoordinateZ : INT; // Regal
Reserve : Array[0..20] of Word;

Die Struktur ist üblicherweise als UDT angelegt um sie leicht erweitern zu können das Array ist nur Platzhalter und wird entsprechend verkleinert wenn die Elemente erweitert werden so das der Strukt immer gleich bleibt und nicht unnötig DBs neu geladen werden müssen.

Der UDT ist in einem VerwaltungsDB in einem Array abgelegt. Das Array kann z.B. Eindimensional sein und einfach entsprechend Plätze wie Regalplätze vorhanden sind. z.B.
Regal : Array [0..30] of UDT_Stellplatz;

Jetzt hast du deine FBs jeder kriegt seinen Arrayplatz angeschlossen an IN/OUT (weil einige Elemente muss er nur lesen, einige elemente muss er nur schreiben und manche muss er beides können).
FB1 := Regal[1]
FB1 := Regal[2]
FB1 := Regal[3420]

Jetzt will man aus Regalplatz 1 was entnehmen. Dann schreibt FB1 in Regal[1].Anforderung eine Eins.

Der Liftbaustein durchsucht zyklisch das ganze Array und schaut ob ne Anforderung ansteht. Wenn eine Ansteht dann schaut er sich die dazugehörigen Korrdinaten an und fährt dahin. Setzt bei Ankunft die Anforderung zurück behält sich aber ein Busy weil er ja jetzt belegt ist. Und fährt z.B. zum Ausgabeplatz. Der Regalbaustein für Platz 1 setzt in der Struktur das Belegt zurück (Denn der Lift hat ja jetzt den Inhalt) und löscht z.B. die Inhaltsbezeichnung.

Und so läuft das halt ab. Sozusagen, laufen die Waren als Strukturen denselben weg wie die Physik. Das Item 10 ist entweder in Regalplatz 1 - xx verstaut oder auf dem Lift oder weg. Aber es ist weder gleichzeitig auf dem Lift noch in zwei Regalplätzen.

Da gibts aber bestimmt Bücher drüber mit verschiedenen Ansätzen wie es hier im Forum auch sehr viele verschiedene Beispiele gibt.

Bei grösseren Regalen macht es ja auch sinn Fahrten kurz zu halten. Manchmal will man bestimmte Gegenstände nicht direkt nebeneinander Lagern. etc.

mfG René
 
Ich mache das ganze im FUP und muss zugeben, dass ich noch nie mit DBs gearbeitet habe, wenn sie automatisch erstellt werden ist gut und dann wars das für mich, da muss ich mich wohl mal einarbeiten.
Ok, ab hier wird es mit Worten schwieriger...

Daher hab ich ziemlich genau das was vollmi oben beschreibt, wenn auch grob und ungepflegt, als Beispiel erstellt. Siehe Anhang
Beispiel 1: Zeigt dir wie das mit dem INOUT und dem mehrfachen Beschreiben mit dem gleichen Datenpunkt geht.
Beispiel 2: Zeigt in etwa das was vollmi oben beschrieben hat.

Wie gesagt, die Beispiele sind grob und nur schnell runtergetippt.
(Zum Beipiel würde man die Anforderung möglicherweise nicht als separates Array programmieren sondern direkt in die Regaldaten und der Lift durchsucht die gesamten Regaldaten)

Die Beispiele sollen dir nur vermitteln was wir meinen bzw. dir die verwendeten Programmiertechniken (Datenbausteine, UDTs, STRUCTs, ARRAYs, Multiinstanzen, variabel indexierter Arrayzugriff) näher bringen.
Nur mit Text wird das eher länger dauern... ;-)

PS.:
Wir wollen dich hier nicht in irgendeine Richtung drängen, sind nur Vorschläge für andere Herangehenweisen.
 

Anhänge

  • LiftBeipiel.zip
    2,8 MB · Aufrufe: 27
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen Dank für deinen Aufwand Ronin!!
Ich muss mich da erst noch mehr in die Materie einarbeiten, aber ich werde deine Lösungsansätze auf jedenfall ausprobieren.
Du schreibst von 2 Beispielen, du hast aber nur eines angehängt?
 
Nach einigen Programm und Hardwareproblemen funktioniert das Lager nun endlich. :TOOL:
Nochmals ein riesen danke an RONIN, vollmi und alle anderen die mir hier geholfen haben.

Ich habe das ganze nun folgendermassen gelöst:
Der Lift fährt immer, wenn er nicht in der Sollposition ist. Die Sollposition ist in den einzelnen Regalen hinterlegt. (lift ist lösgelost)
Wenn der Lift am einlagern ist und an Sollposition ist, fährt er aus, lagert das Teil ein und fährt wieder ein.
Wenn der Lift am auslagern ist und an Sollposition ist, fährt er aus, lagert das Teil aus und fährt wieder ein.
Wir haben das ganze auch noch mit einem Lager + Förderband verbunden und können nun vom einen in das andere Lager einlagern.
Als nächstes muss ich das ganze noch optimieren (noch viel Müll und Verbesserungswürdiges dabei) und einen automatischen Ablauf einfügen.
Um automatisch ein/auszulagern werde ich mich wohl mit AWL beschäftigen müssen. Die Lager durchzuprüfen (ob voll oder nicht), müsste in AWL (nach Arduino Erfahrung) eine einfache for Schleife werden.

Also nochmal ein grosses DANKE, ihr seid eine riesen Hilfe! :s11:
 
Zurück
Oben