Step 7 AWL Sprung nach Vergleich nötig?

Bekanor

Level-1
Beiträge
11
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

wieder mal bin ich auf ein kleines Problem gestoßen und hoffe auf Erleuchtung.

Ich will 2 Zahlen vergleichen, wenn sie gleich sind soll ein Ausgang zurückgesetzt werden. Soweit so leicht..

CPU 314C- 2PN/DP
Step7 5.4
Programm in einem Mix aus AWL und FUP (bevorzugt FUP, alles was im FUP nicht geht/zu lang wird -> AWL)

Code:
      U     "M 10.2"                 // Schritt 19, IST errechnen/Vergleich 
      SPBN  _001
      L     DB50.DBW2            
      SLD   5                          
      LAR1                             
      L     DB50.DBW0
      T     LW     0                   
      AUF   DB [LW 0]                   
      L     DBD [AR1,P#0.0]            
      T     DB50.DBD4           // IST

      L     DB50.DBD4           // IST
      L    DB50.DBD8            // SOLL wird bei Start eingetragen [M 8.0, Schritt 1]
      ==D                           //Vergleich, wenn nicht gleich nix tun.
      S     "M 10.3"              // Start Schritt 20
      R     "M 10.2"              // Reset aktueller Schritt 19
      R     "A 2.2"                // Freigabe erteilen
 _001: NOP   0                  // Sprung vom Netzwerkanfang, Startbedingung

das Problem: Der Ausgang wird manchmal zurückgesetzt obwohl die DBDs unterschiedlich sind. "Normalerweise" klappt es so, gelegentlich aber nicht..

die Frage: Muss ich nach dem Vergleicher einen Sprung setzen (SPBN _001) damit er zuverlässig vergleicht? Könnte das VKE möglichweise von woanders falsch "durchgeschleift" sein?
Derselbe Ausgang wird in einem anderen FC zu anderer Zeit ebenfalls zurückgesetzt, kann mehrfache Nutzung ein Problem sein? (Beim S kenn ich es, nur 1x im Programm bei R auch?)

Bin mir zwar nicht sicher das der Fehler in diesem Schritt liegt, bin mir bei den anderen aber ziemlich Sicher das sie zu der Zeit nicht zwischenfunken können..

Soweit gute Nacht und Danke schon mal

Beka
 
Zuletzt bearbeitet:
Hallo,

du musst nur VKE-unabhängige Operationen überspringen - zB wenn du nach dem Vergleich bedingt einen Wert transferieren willst.

André
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Bekanor,

was vergleichst du denn, zwei Ganz-Zahlen oder zwei Real-Zahlen?
Wenn Real-Zahlen musst du auf ==R vergleichen.
Könnte hier der Fehler liegen?

Gruß
Move
 
die Frage: Muss ich nach dem Vergleicher einen Sprung setzen (SPBN _001) damit er zuverlässig vergleicht?

Nein Sprung ist nicht nötig, ausser du willst Lade Transfer anweisungen ausführen (nicht VKE abhängig)

Könnte das VKE möglichweise von woanders falsch "durchgeschleift" sein?

ein Vergleich startet immer ein neues VKE. Wenn du mehrere Vergleiche gleichzeitig behandeln willst musst du sie in Boolsche Opperatoren packen U( O( etc.

Derselbe Ausgang wird in einem anderen FC zu anderer Zeit ebenfalls zurückgesetzt, kann mehrfache Nutzung ein Problem sein? (Beim S kenn ich es, nur 1x im Programm bei R auch?)

Sowohl S wie auch R darfst du im Programm so oft auf eine Speicherstelle anwenden wie du willst. Beide reagieren nur auf VKE "true" und lassen die Speicherstelle bei "false" in ruhe.

Was du bedenken solltest. Wenn das ein Analogwert ist der eingelesen wird. Wie lange ist der dann womöglich == dem Soll. Der muss für VKE true wirklich bit für bit gleich sein in dem Zyklus. Bei Realzahlen ist das eh unmöglich (Es seidenn man legt den Vergleich grad auf irgendeine MAX MIN Begrenzung des Istwerts) und hier bei DINT musst du halt wissen wie stark der schwankt.

mfG René
 
Programmierstil

Derselbe Ausgang wird in einem anderen FC zu anderer Zeit ebenfalls zurückgesetzt, kann mehrfache Nutzung ein Problem sein?

Das ist genau die Art zu programmieren, wo mir persönlich immer die Hutschnur platzt.

Ich denke man sollte zuerst mal den Programmierstil betrachten, damit lassen sich eine Menge Probleme vermeiden.
1. S und R haben absolut ihre Daseinsberechtigung, aber ich empfehle die so sparsam wie möglich einzusetzen (1xS und 1xR möglichst im selben Netzwerk), vor dem Einsatz prüfe ich immer, ob ein = das vielleicht auch tut
2. Ausgänge sollten möglichst nur1x im Programm mit = beschrieben werden

Wenn ich hin und wieder mit Programmen, wie oben beschrieben konfrontiert bin, dann ist mein Eindruck immer: "Jetzt hat der Programmierer den Überblick verloren" und "Wer soll sich denn da einarbeiten?"
Werden die Anlagen komplexer, die Zeit kürzer und der Kunde mit immer neuen Anforderungen ungeduldiger, dann kann man mit diesem Stil nur noch scheitern. Ist nur ein gut gemeinter Rat.

Zu deinem Problem: Also es gibt eigentlich nur zwei Möglichkeiten: Entweder schlägt dein R in dem anderen FC zu (zum Prüfen einfach mal CLR davor schreiben) oder DB50.DBD4 und 8 sind wirklich für einen Zyklus gleich. (Dummerweise lässt sich das ja durch den Programmierstil nicht gleichzeitig beobachten...) Verändert sich denn M10.3 (1) und M10.2 (0) in diesem Moment? Und gibt es denn eine Ausschlussbedingung, dass M10.2 aktiv sein muss? Sonst knallt dir die Bedingung mitten in die Schrittkette rein und führt zu undefinierten Zuständen (Mehrere Schritte gleichzeitig aktiv). Dem Kommentar beim Sprungziel nach zu urteilen hat der mit der Schrittkette nichts zu tun.

Hast Du das Programm geschrieben? Überdenke bitte generell das mehrfache Beschreiben von Merkern und Ausgängen auf seine Notwendigkeit hin. Man kann das oft zusammenfassen, was es übersichtlicher macht.
Hat jemand anderes die geschrieben und Du musst eine Änderung durchführen? Viel Glück.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die Antworten,
scheint also leider kein Fehler im Ansatz oder Ablauf zu sein. Das macht die Fehlersuche nicht wirklich leichter.. :(

Es sind 2 Ganzzahlen (6-Stellig, DInt). Eine wird zu Beginn des Ablaufs in den DB geschrieben, die andere wird mittels Pointer aus einem anderen DB gezogen (im selben Netzwerk in dem der Vergleich läuft, kurz vorher) [Netzwerk im 1. Post mal vollständig gepostet]

Das ist genau die Art zu programmieren, wo mir persönlich immer die Hutschnur platzt.
[...]

Nunja aber von 3 Zeilen lässt sich glücklicherweise kein Rückschluss auf das gesamte Programm schließen. Ich hab es selber gemalt und denke nicht das es so der Blödsinn ist (gut, das denkt auch der Igel wenn er die Klobürste besteigt..)
AWL und FUP mixen: FUP ist für einfache Schrittketten total toll. Wenn nur boolsche Abfragen oder einfache Vergleiche nötig sind..
AWL: Pointer.. Schleifenzähler, wenn der FUP sich wieder mal an unterschiedlichen Datentypen stört..
Setzen (S oder =) von Merkern oder Ausgängen mache ich nur je 1x. Beim R nehme ich es da nicht immer so genau. Es ist hin und wieder praktischer das an Ort und Stelle zu machen.
Egal..

M 10.2 ist die Startbedingung. "Bausteinanfang" sollte "Netzwerkanfang" sein.. Ist M10.2 also nicht aktiv, zum Netzwerkende springen. M10.3 startet im nächsten Schritt nur die Zählung. Jenachdem ob aktiv oder nicht wird i.O oder n.i.O gezählt. bei dem Fehler ist 10.3 nicht aktiv da n.i.O gezählt wird und der Vorgang in den Fehlerspeicher geht (wodurch ich den Fehler sehe, da der nächste Schritt eigentlich nicht aktiv sein kann wenn soll<>ist...)

Dann bleibt mir wohl vorerst zur weiteren Identifizierung nix anderes übrig als das Programm noch weiter aufzublähen. Wie ist im Fehlerfall der Zustand A2.2, evtl bastel ich mir ne Schleife um zu sehen ob die S5 an die der Befehl geht, diesen richtig auswertet..

Heute 2 Fehler bei 700 Läufen. Etwa 200 mal hat die Sperre funktioniert (musste der MA nochmal nachkorrigieren..) Wenn da der letzte Ma in der Reihe träumt.. ist das schon fast ein halber Monatslohn Schaden.. :(

Okay, ich probier mal und wird nochmal rückmelden. Wenn doch noch die ein oder andere Idee kommt.. gerne her.
 
M10.3 startet im nächsten Schritt nur die Zählung. Jenachdem ob aktiv oder nicht wird i.O oder n.i.O gezählt. bei dem Fehler ist 10.3 nicht aktiv da n.i.O gezählt wird
Wenn bei Deinem Problem der A2.2 abgeschaltet wird dann muß das woanders herkommen. Wenn das gezeigte Netzwerk den A2.2 rücksetzen würde, dann würde es auch M10.3 setzen. Gibt es außer dem an mehreren verteilten Programmstellen vorhandenen S/R auf den A2.2 vielleicht noch überlappende Zugriffe auf A2.2 (z.B. AD0, AB2, PAW2, ...) oder (evtl. fehlerhaft) indirekt adressierte Schreibzugriffe?

Wird tatsächlich der A2.2 abgeschaltet? Kann die fehlerhafte Abschaltung vielleicht auch ein Problem in der S5 sein oder ein elektrisches Problem der Kopplung zur S5?

PS: Ich würde die Reihenfolge Setzen neuer Schrittmerker M10.3 und Rücksetzen alter Schrittmerker M10.2 vertauschen. Für den Fall, daß noch andere Tasks auf die Schrittmerker zugreifen.

Harald
 
Hallo Bekanor,
Nunja aber von 3 Zeilen lässt sich glücklicherweise kein Rückschluss auf das gesamte Programm schließen. Ich hab es selber gemalt und denke nicht das es so der Blödsinn ist (gut, das denkt auch der Igel wenn er die Klobürste besteigt..)
da hast Du asci25 wohl missverstanden. Die Kritik bezog sich nicht auf Dein Programm im Allgemeinen, sondern auf die leider immer wieder anzutreffende Unart denselben Ausgang an mehren Stellen im Projekt zu beschreiben. Dies kann, wie ich aus eigener Erfahrung weiß, zu großen Problemen bei der Fehlersuche führen und sollte tunlichst vermieden werden.

Gruß

Oliver
 
Zuviel Werbung?
-> Hier kostenlos registrieren
um zu sehen wie OFT Soll gleich Ist wird:



L DBxx.DBD yy // genau der, worauf es ankommt
L DB50.DBD8 // SOLL
==D
ZV Z testZaehler

und dann in der Var den testZaehler beobachten.
 
So, Fehler scheint gefunden.

Die Eingangsbaugruppe der S5 hat den Eingang nicht immer angenommen. Bin noch nicht ganz sicher wieso..


Ich habe der S5 einige Funktionen genommen um Eingänge frei zu haben.
Mein Sperrausgang hatte zuvor eine Doppelbelegung, sollte in der S5 den Ablauf an 2 Stellen unterbrechen. Das machen nun je 1 einzelner Ausgang. Das Problem bestand da noch. In die S5 habe ich dann die Eingänge (Sperre) auf Ausgänge zurückgelegt, diese auf Eingänge der S7. Somit hab ich in der S7 abfragen können ob die Sperre verarbeitet wird -> In die Schrittkette eingebunden.
Nachdem es dann endlich wie erhofft hängen blieb konnte ich an der S5 zwar meine 24V messen, hatte aber kein Signal im Programm. Nun habe ich mal die Eingangskarte getauscht, erst mal geht es.

So ist das wenn man es einfach haben will. Damit bei Problemen an der Erkennung (Kamera, Beleuchtung, Inis, Datenpaket...) einfach nur die SPS abgeschaltet werden muss damit die Hauptanlage (S5) ungestört weiter funktioniert...

Auf jeden Fall danke für die Hilfe.
Programm ist vielleicht nicht das schönste, aber Fehler waren es (in diesem Falle) nicht.

mfg Beka
 
Zurück
Oben