-> Hier kostenlos registrieren
Hallo,
ich bin Neuling in Sachen S7-Programmierung und stehe jetzt vor einem Problem.
Ich habe ein Regal mit 7x3 Plätzen, 7 fächer mit 3 etagen. Dafür will ich jetzt eine Art suche für den nächsten freien Platz machen.
Es ist mir ansich egal ob er zuerst eine Etage vollmacht oder zuerst ein Fach.
Anschließend soll diese Position in einen anderen DB samt eines weiteren MB zu einem Word zusammengefasst werden.
Ich wollte das ganze jetzt so lösen, indem ich einen DB, in meinem Fall DB11 anlege und da die Verwaltung mache.
Den DB hab ich so angelegt: zuerst habe ich mir einen "suchzeiger" angelegt: das DBD 0. Doppelwort, weil in den bits 0.0 bis 1.7 kann die "suche" stattfinden, in den bits 2.0 bis 3,7 können infos zum typ reingeschrieben werden (siehe weiter unten) Die einzelnen Positionen dann DBX 4.0 (entspricht dem 1. Platz), DBX 4.1 dem 2. usw... bis DBX 6.4
Nun zu meinem Problem:
Ich will in einem FC eine Schleife laufen lassen. Diese schleife soll von dbx 4.0 an durchlaufen, bis ein freier platz gefunden wurde.
Findet er einen, setzt er das DBX = 1 (leer bedeutet also 0).
Nun solls aber noch weitergehen. Ich benötige die Info (x und y-position), wo eingelagert wird, sowie die jeweilige artikelnummer (zur identifikation)
Ich dachte mir, dass es sinnvoll wäre für die x und y-position ein DBD anzulegen um dann beim anfahren in der Schrittkette darauf zugreifen zu können...
Nun der letzte Schritt. Die x und y position soll in eine warteschlange eingereiht werden. Dafür wird ein extra DB verwendet (DB 4).
Hier hab ich aber eine Vorgabe: Für jeden auftrag wird ein word reserviert. Und die x und y-position soll in den bits 7 bis 0 des words stehen.
die Bits 8 bis 15 werden im MB 90 gespeichert und vervollständigen so das word
Wenn ich das richtig verstehe, muss ich da einen "offset" addieren...
Das wars soweit. Nun, mein Problem ist es, dass so rein nichts funktioniert und ich jetzt nicht mehr weiß wie ich weitermachen soll.
Wäre schön wenn da mal einer drübergucken könnte, notfalls auch einen anderen Code, wenn meiner falsch ist.
Mit Pointer habe ich es auch schon probiert. Da kam ich leider auch nicht weiter.
Ich weiß es ist sehr viel Arbeit und wohl auch ein wenig verwirrend. Trotzdem schonmal einen Dank im vorraus
ich bin Neuling in Sachen S7-Programmierung und stehe jetzt vor einem Problem.
Ich habe ein Regal mit 7x3 Plätzen, 7 fächer mit 3 etagen. Dafür will ich jetzt eine Art suche für den nächsten freien Platz machen.
Es ist mir ansich egal ob er zuerst eine Etage vollmacht oder zuerst ein Fach.
Anschließend soll diese Position in einen anderen DB samt eines weiteren MB zu einem Word zusammengefasst werden.
Ich wollte das ganze jetzt so lösen, indem ich einen DB, in meinem Fall DB11 anlege und da die Verwaltung mache.
Den DB hab ich so angelegt: zuerst habe ich mir einen "suchzeiger" angelegt: das DBD 0. Doppelwort, weil in den bits 0.0 bis 1.7 kann die "suche" stattfinden, in den bits 2.0 bis 3,7 können infos zum typ reingeschrieben werden (siehe weiter unten) Die einzelnen Positionen dann DBX 4.0 (entspricht dem 1. Platz), DBX 4.1 dem 2. usw... bis DBX 6.4
Nun zu meinem Problem:
Ich will in einem FC eine Schleife laufen lassen. Diese schleife soll von dbx 4.0 an durchlaufen, bis ein freier platz gefunden wurde.
Findet er einen, setzt er das DBX = 1 (leer bedeutet also 0).
Code:
AUF DB 11
L # 4.0
T DBD 0
//Abbruchbedingung
FIND: U M 50.0 // Mein Merker, damit das ganze starten kann, ist eine positiver Flankenmerker
U
(
L DB11.DBD 0 // Lade Suchzeiger
L 52 // ist der kleiner als DBX 6.4?
<D
)
SPBN ENDE // wenn ja mache weiter, wenn nein = voll, also ende
UN DBX [DBD 0] // Hier läuft er durch, beginnend ab dbx 4.0... wie bekomme ich hier die 4.0?
SPB ELGN
L DB11.DBD 0
L 1
+D
T DB11.DBD 0
SPA FIND
ELGN: S DB11.DBX [DBD 0] // Setze das DBX, auf dass der Zeiger zeigt.
Nun solls aber noch weitergehen. Ich benötige die Info (x und y-position), wo eingelagert wird, sowie die jeweilige artikelnummer (zur identifikation)
Ich dachte mir, dass es sinnvoll wäre für die x und y-position ein DBD anzulegen um dann beim anfahren in der Schrittkette darauf zugreifen zu können...
Code:
L DBW2 // Weiß ich noch nicht. Kann ich den Teil vom Zeiger (DBD 0) so laden?
SLW // hängt ab vom Zeiger, ich muss x und y in je 4 bits bekommen
SRW
T DBD 10 //hier soll dann die x-position hin, ist im DB schon angelegt
L DBW2
SLW
SRW
T DBD 14 //und hier die y-position
SPB tran // springe dann zum transfer
Nun der letzte Schritt. Die x und y position soll in eine warteschlange eingereiht werden. Dafür wird ein extra DB verwendet (DB 4).
Hier hab ich aber eine Vorgabe: Für jeden auftrag wird ein word reserviert. Und die x und y-position soll in den bits 7 bis 0 des words stehen.
die Bits 8 bis 15 werden im MB 90 gespeichert und vervollständigen so das word
Wenn ich das richtig verstehe, muss ich da einen "offset" addieren...
Code:
tran: AUF DB 4 // öffne meinen warteschlangen DB
L MB 90 // Lade das MB, was die bits 15 bis 7 des auftrages enthällt
T DBB [DBD 0] // Transferie das in den Zeiger des DB4 (gleicher aufbau wie DB 11). er sollte auf das nächste freie zeigen
L 8 // mein "offest" für die bits 7 bis 0 "dranzuhängen....
L DBD 0
+D
T DBD 0
AUF DB 11 // öffne den platzverwaltungs-db
L DBB 3 // lade NUR die x und y-position aus dem Zeiger (geht das?)
AUF DB 4 // nun der warteschlangen-db
T DBB [DBD 0] // lade das in den nächsten freien auftrag. DBD 0 ist wie im anderen DB ein zeiger auf das nächste freie Element
L 8 // mein "offest" um aufs nächste freie word zu kommen
L DBD 0
+D
T DBD 0
Das wars soweit. Nun, mein Problem ist es, dass so rein nichts funktioniert und ich jetzt nicht mehr weiß wie ich weitermachen soll.
Wäre schön wenn da mal einer drübergucken könnte, notfalls auch einen anderen Code, wenn meiner falsch ist.
Mit Pointer habe ich es auch schon probiert. Da kam ich leider auch nicht weiter.
Ich weiß es ist sehr viel Arbeit und wohl auch ein wenig verwirrend. Trotzdem schonmal einen Dank im vorraus
Zuletzt bearbeitet: