TIA AWL Befehl aus Step7 in FUP 1200

Itschi77

Level-1
Beiträge
31
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich heiße Michael und habe mich hier angemeldet weil ich Hilfe bei einigen AWL Befehlen brauche. Mein Kenntnissstand würde ich wohl als gefährliches Halbwissen bezeichnen.
Und zwar folgender Befehl aus einem Schieberegister zur Flaschenverfolgung:
>=D
S M10.0
L L#-1
T DB11.DBD18

1. kenne ich es nicht wenn der Vergleiche Befehl als erstes steht. Ich kenne nur:
L DB47.DBD14
L DB11.DBD18
==D

2. läd der Befehl eine -1 und transferiert diese in den DB11.DBD18?
Wenn ja wie mache ich das in FUP. Die 1200 kann ja keine AWL.
Mit Move kann ich ja nicht direkt in DB schreiben, oder?
Vielen Dank für Eure Hilfe
 
Zuviel Werbung?
-> Hier kostenlos registrieren
.
zu 1.
Wenn in STEP 7 ein Vergleich als erste Anweisung
steht, werden die beiden Werte in Akku 1 und Akku 2
verglichen, die sich gerade dort befinden.

Du musst also schauen, was ist vorher in die
Akkus geladen worden (Netzwerk davor ?), bevor
dieser Vergleich ausgeführt wird.


zu 2.
ja, STEP 7 lädt und transferiert dort, und zwar
unabhängig vom Ergebnis des vorhergehenden
Vergleichs.

Wie genau das in der 1200 per FUP aussieht,
solltest du selbst probieren.
 
.
zu 1.
Wenn in STEP 7 ein Vergleich als erste Anweisung
steht, werden die beiden Werte in Akku 1 und Akku 2
verglichen, die sich gerade dort befinden.

Au weh, das ist übelste Trickprogrammierung. Ein Baustein der mit einem Befehl beginnt welcher sich darauf verlässt was im Akku ist. Da hat ein oberschlauer Programmierer gemeint, er müsse sich für die Firma unabkömmlich machen.

Um raus zu finden was da passiert, musst du alle Aufrufstellen untersuchen. Dort kannst du dann rätseln was die wohl so in den beiden Akkus hinterlassen. Noch fieser wird es wenn das ein 400er Programm war. Dort könnte ja sogar einer mit den vier Akkus gespielt haben.

Nächste Steigerung von schlechtem Stil ist es wenn jemand auf diese Weise auch noch Ergebnisse zurück gibt.

Und so richtig brutal wird es wenn so etwas indirekt aufgerufen wird. Also in der Form CALL FB[ LW10 ].

Wenn die Aufrufstelle nun nicht AWL ist, sondern KOP/FUP, dann hilft es dort nach AWL zu schalten. Wenn die Aufrufstelle SCL ist, dann musst du den SKA dazu bringen den Baustein in AWL zu öffnen. Liegt das AWL vor, dann gilt es vom UC aus nach oben die Ladebefehle zu finden.

Das ist alles gar nicht schön. Von dem der das geschrieben hat, solle man den Lohn zurückfordern. Außer der ist jetzt dein Chef :-?. Aber du kannst dabei viel Lernen - lauter Dinge die man eigentlich nicht wissen will.

Viel Spaß beim Lernen
HB
 
Guten Morgen,
vielen Dank schon mal für Eure Antworten. Wobei ich nach der von HelleBarde ja mit dem schlimmsten rechne.
Ich habe es beim Move Baustein versucht per Hand einzugeben. Also in das Feld geklickt und DB11.DBD... Und dann wurde es rot markiert. Jetzt habe ich es nicht eingegeben sondern per Dropdown-Menü den dB ausgewählt und er hat es genommen. Ich kann mir gar nicht vorstellen das ich mich da mehrmals vertippt habe.
Ich sehe auch noch nicht das ich das zum laufen bekomme. Wenn ich es einfach nur abtippen müsste können sich ja schon genug Fehler einschleichen. Aber wenn man jetzt kein Spezi ist und noch von AWL in FUP umwandeln muss....
M1:
L L#-1
L DB..
==D
SPB M2
L DB..
L DB..
<D
SPB M2
>=D
S M10.1
L L#-1
T DB..
M2:
und so weiter...
Es sieht quasi immer gleich aus nur andere DB47.DBD...

Was wäre denn der richtige Weg so etwas zu programmieren? Die Anwendung soll zu dem Zeitpunkt der Erkennung den Zahlenwert vom Inkrementalgeber nehmen, einen Offset, den ich momentan per OP393 eingebe, drauf addieren. Nächste Erkennung addieren, nächste Erkennung addieren und dann wenn der sich daraus errechnet Wert am Inkrementalgeber für die erste Erkennung ergibt eine Aktion ausführen. Und so weiter. Ich denke ihr versteht was ich meine.


Gesendet von meinem iPad mit Tapatalk
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich noch mal.
Den "richtigen Weg" hier zu beschreiben würde wohl etwas zu weit gehen, habe ich mir überlegt. Aber noch mal eine Verstädnisfrage, da mangelt es mir wohl an Basiswissen.:neutral:
ich lade zb die Zahl 10 in Akku1, der wird verschoben in Akku2, jetzt lade ich die Zahl 20 in Akku1. Dann erfolgt die Vergleichsoperation zwischen Akku1 und 2. Trifft zu VKE1 trifft nicht zu VKE0. Das VKE wird dann in Akku1 geschrieben, richtig?
Wenn jetzt nach dem Schritt als nächstes >=D steht (Akku1 >= Akku2), bedeutet das, das er die Zahl 10 die ja wohl noch in Akku2 steht mit dem VKE vergleicht, was ja im Akku1 stehen müsste?
Wenn dem so ist, wie zum Teufel soll ich das in FUP machen. Was schreibe ich da an die "Eingangsbeinchen" von meinem Vergleicher?
 
ITrifft zu VKE1 trifft nicht zu VKE0. Das VKE wird dann in Akku1 geschrieben, richtig?
Nein, das wird nicht in den Akku geladen. Das VKE ist ein eigenständiger Wert.

Es stehen also auch nach dem Vergleich immer noch die 10 in Akku2 und die 20 in Akku1.

PS: Nur beim Rechnen wird das Ergebnis in Akku 1 geschrieben, nachdem der Inhalt von Akku 1 zu Akku2 verschoben wurde.
Aber auch hier gibt es Statuswerte, die zusätzliche Auskunft über das Ergebnis geben (z.B. >0), außerhalb der Akkus.
 
Zuletzt bearbeitet:
OK. Das habe ich hoffentlich verinnerlicht. Aber da die 1200er ja kein AWL kann, muss ich ihr den Vergleich irgendwie anders beibiegen. Hast Fu da auch noch eine Idee?
 
Den 1. Vergleich von Post 1?

Da mußt Du halt schauen, was vorher (gibt's da noch Netzwerke davor?) in die Akkus geladen wird. Denn das wird ja dort verglichen.
So pur, wie's da steht, ist es eh' unsauber programmiert. Das haben zu Recht schon meine Vorredner angemerkt.

Um bei dem Problem weiter zu helfen, bräuchte man also mehr Info's. Z.B. den kompletten Baustein oder sogar die Bausteine, die diesen aufrufen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielleicht kann sich das ja jemand ansehen und etwas zu sagen. Es ist im Grunde immer das gleiche. Netzwerk für Netzwerk und Sprung für Sprung nur die DB11 Adressen ändern sich. Wenn ich jetzt die eine Geschicht mit der Akkuabfrage hin bekommen würde, wäre ja der Rest in FUP einfach

Der Aufruf erfolgt in OB1 UC FC2

Register 4 auswerten
L L#-1
L DB11.DBD14 Register 1_4
==D
SPB M1
L DB47.DBD14 InstanzDB Zähler
<D
SPB M1
>=D
S M10.0
L L#-1
T DB11.DBD14 Register 1_4

M1: L L#-1
L DB11.DBD18 Register 2_4
==D
SPB M2
L DB47.DBD14
L DB11.DBD18
<D
SPB M2
>=D
S M10.0
L L#-1
T DB11.DBD18
M2: L L#-1
L DB11.DBD22 Register 3_4
==D
SPB M3
L DB47.DBD14
L DB11.DBD22
<D
SPB M3
>=D
S M10.0
L L#-1
T DB11.DBD22
M3: L L#-1
L DB11.DBD22 Register 4_4
==D
SPB M3
L DB47.DBD14
L DB11.DBD26
<D
SPB M3
>=D
S M10.0
L L#-1
T DB11.DBD26
M4: L L#-1
L DB11.DBD22 Register 5_4
==D
BEB
L DB47.DBD14
L DB11.DBD30
<D
BEB
>=D
S M10.0
L L#-1
T DB11.DBD22

Ist es nicht so das das einfach zwei unterschiedliche Vergleiche mit den selben Werten sind?!
L DB47.DBD14
L DB11.DBD22
<D
SPB M3
>=D
S M10.0
Er läd die Werte aus den beiden DB's in die Akkus und sagt einmal <D SPB M3 und dann werden die DB's nochmal >=D verglichen.
Also mache ich im FUP ein NW mit L DB47, L DB11 <D und ein NW wieder L DB47, L DB11 und dann >=D
Oder??? Ist das die Lösung:confused:
 
Zuletzt bearbeitet:
Ist es nicht so das das einfach zwei unterschiedliche Vergleiche mit den selben Werten sind?!
L DB47.DBD14
L DB11.DBD22
<D
SPB M3
>=D
S M10.0
Er läd die Werte aus den beiden DB's in die Akkus und sagt einmal <D SPB M3 und dann werden die DB's nochmal >=D verglichen.
Also mache ich im FUP ein NW mit L DB47, L DB11 <D und ein NW wieder L DB47, L DB11 und dann >=D
Oder??? Ist das die Lösung:confused:
Ja, richtig!
<D und >=D vergleichen nicht DB-Werte sondern den momentanen Inhalt von AKKU1 und AKKU2.
Du mußt also logisch 'rauskriegen, was zum Zeitpunkt des Vergleiches in den AKKUs steht, damit Du die Parameter in FUP angeben kannst. Der ursprüngliche AWL-Programmierer hat sich das erneute Laden der DB-Werte in die AKKUs gespart, bei FUP geht diese Abkürzung aber nicht.

Harald
 
Um Deinen AWL-Code in FUP umzusetzen solltest Du Dich nicht stoisch an den AWL-Code halten, sondern zunächst den Sinn verstehen und den dann in FUP programmieren. Insbesondere solltest Du nicht versuchen, die ganzen Sprünge SPB und BEB in FUP zu übernehmen.
Die für Dich zunächst unverständlichen >=D im AWL-Code sind sogar überflüssig, weil vorher schon bei <D der Code übersprungen wird.

Ich hoffe mal, die vielen logischen Fehler in Deinem Code in Beitrag #15 sind nur Tippfehler, die Du beim Abtippen des Codes für das Forum gemacht hast...

Im Grunde mußt Du nur 5x das folgende FUP-Netzwerk erstellen und dabei immer den DB11.DBD... anpassen.
Code:
//Zähler mit Register 1_4 vergleichen
            +--------+
            | CMP<>D |
DB11.DBD22--|IN1     |   +-------+
            |        |   |   &   |
      L#-1--|IN2     |---|       |
            +--------+   |       |
                         |       |
            +--------+   |       |
            | CMP>=D |   |       |             M10.0
DB47.DBD14--|IN1     |   |       |          +--------+
            |        |   |       |          |    S   |
DB11.DBD22--|IN2     |---|       |--+-------|        |
            +--------+   +-------+  |       +--------+
                                    |
                                    |       +--------+
                                    |       |  MOVE  |
                                    +-------|EN   OUT|--DB11.DBD22
                                            |        |
                                     L#-1---|IN   ENO|--
                                            +--------+
So geht's auch (der compilierte Programmcode wird etwas kürzer):
Code:
            +--------+
            | CMP<>D |
DB11.DBD22--|IN1     |   +-------+
            |        |   |   &   |
      L#-1--|IN2     |---|       |
            +--------+   |       |
                         |       |
            +--------+   |       |
            | CMP>=D |   |       |
DB47.DBD14--|IN1     |   |       |          +--------+
            |        |   |       |          |  MOVE  |                M10.0
DB11.DBD22--|IN2     |---|       |----------|EN   OUT|--DB11.DBD22  +-------+
            +--------+   +-------+          |        |              |   S   |
                                      L#-1--|IN   ENO|--------------|       |
                                            +--------+              +-------+

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
schon mal vielen vielen dank für Eure Hilfe.
Also ich befürchte das die logischen Fehler das sind wo nach es aussieht, nämlich logische Fehler. Ich kann noch mal gucken, da ich es in der Nachtschicht abgetippt habe, aber ich glaube das ich nichts falsch abgetippt habe.
Es steht ja auch zwischen jedem Sprung das gleiche, es ändert sich immer nur die Adresse im DB11. Auch die anderen FC's sehen im Grunde so aus. Register 1 auswerten ist auch so aufgebaut DB47 ist immer Countervalue (der wird wohl vom Inkrementalgeber angesteuert) und dann wieder die DB11's mit den Verschiedenen Adressen und anstatt zb M10.0 dann zb M10.1
Wenn ich gleich richtig wach bin gucke ich mir mal Deinen FUP an. Wie gesagt vielen Dank dafür!So, erstmal Frühstücken :)
 
Hallo Harald,
wenn ich deinen Programmcode richtig verstehe, dann gehst du das Problem nicht so an das du sagst "wenn der cmp=1 dann spb, wenn der cmp=1 dann spb, wenn das alles nicht VKE 1 ist dann S M10.0"
Sondern du arbeitest alle Bedingungen ab die nötig sind um M 10.0 zu setzten und wenn die nicht gegeben sind dann geht die SPS halt einfach weiter zum nächsten NW.
Verstehe ich das richtig?
VG
Michael
 
Wie bereits gesagt: man sollte nicht versuchen, den AWL-Code 1:1 umzusetzen (das ergibt "unschönes" FUP), sondern den Sinn des AWL-Codes erforschen und so übersichtlich wie möglich in FUP neu programmieren. Sinn eines FUP-Programmes ist es nicht, besonders schnellen Code zu produzieren, sondern übersichtlich und leicht verständlich zu sein.


Der Sinn des AWL-Codes in #15:
Wenn in DB11.DBD.. ein Wert <> -1 eingetragen ist und der Zählerstand in DB47.DBD14 >= DB11.DBD.. ist, dann Setze M10.0 und Lösche den Wert in DB11.DBD.. auf -1

Der AWL-Code macht zunächst den (die) Vergleich(e) und überspringt bei nicht-zutreffen den unnötigen Code.

Der FUP-Code macht immer beide Vergleiche, auch wenn der erste Vergleich DB11.DBD.. <> -1 schon nicht erfüllt ist und damit das UND nicht erfüllt sein kann. Der "FUP-Compiler" optimiert das nicht (zumindest bei S7-300/400) und ist dadurch geringfügig langsamer als die unübersichtliche AWL-Springerei. Will man unbedingt, daß schon bei nicht-erfülltem ersten Vergleich der Rest übersprungen wird, dann muß man den FUP-Code auf 2 oder 3 Netzwerke aufteilen:
1. nur der Vergleich DB11.DBD.. <> -1 und überspringen des zweiten Netzwerkes falls nicht erfüllt
2. der Vergleich Zähler >= DB11.DBD.. und Setzen des M10.0 und löschen des DB11.DBD.. auf -1
3. die Ziel-Sprungmarke für das Überspringen

Harald
 
Zurück
Oben