TIA Ausgangsvariable hat zwei unterschiedliche Werte

BSM890

Level-2
Beiträge
9
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
S7-1200CDC/DC/Rly
TIA V17
Lenze i550
Ansteuerung Umrichter über Profinet

Hallo zusammen, ich komme gerade nicht weiter und bin recht neu was SPS Programmierung angeht.

Ich möchte einen Lenze i550 über Profinet ansteuern, was soweit auch klappt (Steuerwort und Sollfrequenz)
Die Beschleunigungs- und Bremsrampen sollen über HMI einstellbar sein und werden an den Umrichter übertragen.

Nun hat die Ausgangsvariable der Beschleunigungsrampe (%QW124) aber ein seltsames Verhalten. Im FC beobachte ich, dass der korrekte Wert in die Variable geschrieben wird (als Beispiel 16#0032). Beobachte ich zeitgleich die PLC-Variablentabelle mit derselben Variable, steht hier der Wert 16#0000 drin.
Am Umrichter kommt demnach auch der falsche Wert an.
In den Querverweisen der Variable sieht man, dass ansonsten kein weiterer Schreibzugriff erfolgt.
Bei der Bremsrampe funktioniert es ohne Probleme, meiner Meinung nach ist da nichts anders.
Ich habe mal einige Screenshots angehängt.

Ist vermutlich etwas ganz banales, aber ich komme nicht drauf, vielleicht hat jemand eine Idee.
 

Anhänge

  • Screenshot 2025-09-26 083310.png
    Screenshot 2025-09-26 083310.png
    82,2 KB · Aufrufe: 30
  • Screenshot 2025-09-26 083535.png
    Screenshot 2025-09-26 083535.png
    151,4 KB · Aufrufe: 32
  • Screenshot 2025-09-26 083640.png
    Screenshot 2025-09-26 083640.png
    285 KB · Aufrufe: 30
  • Screenshot 2025-09-26 083713.png
    Screenshot 2025-09-26 083713.png
    269,2 KB · Aufrufe: 28
  • Screenshot 2025-09-26 084439.png
    Screenshot 2025-09-26 084439.png
    67,7 KB · Aufrufe: 29
Adressüberschneidungen durch die %QW124 überschrieben wird können ausgeschlossen werden?
ich wüsste nicht wovon, wenn dann müsste es doch in den Querverweisen auftauchen oder? Wie kann ich das überprüfen?

Tja ... da solltest du dann vielleicht mal den kompletten Programmteil posten, vielleicht sogar gleich den ganzen FC ...

Den ganzen FC kann ich leider nicht posten, aber das hier ist der komplette Code der die Rampen regelt (also das komplette NW13). Mehr soll damit auch gar nicht passieren:

Code:
"L_Beschleunigungsrampe":=DINT_TO_WORD("DB_HMI".Rampenzeit_Beschleunigen_Umrichter);
"L_Bremsrampe" := DINT_TO_WORD("DB_HMI".Rampenzeit_Bremsen_Umrichter);

auch wenn die die HMI Variable raus nehme und einfach nur "50" als DINT in die Zeile schreibe, ist das Ergebnis das gleiche.
 
Den ganzen FC kann ich leider nicht posten, aber das hier ist der komplette Code der die Rampen regelt (also das komplette NW13). Mehr soll damit auch gar nicht passieren:
Dann tut es mir leid - meine Glaskugel tut es auch gerade nicht.
Grundsätzlich läßt sich aber sagen, dass das von dir beschriebene Verhalten sicher einen Grund hat - den aber mit raten zu finden ist nicht so einfach ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es gibt keine 'normalen' Schreibzugriffe auf QW124, ausser in FC3 NW13.
Die Liste mit überlappender Zugriffe ist leer.

Gibt es Bausteine mit AWL Code ?
Wird in diese AWL Bausteine mit Pointer-Zugriff gespielt ?

Gibt es Bausteine mit SCL Code ?
Wird in diese SCL Bausteine mit POKE gespielt ?

Was passiert wenn du in eine Beobachtungstabelle QW124 betrachtest, und dann ein Wert manuell eintippt ? Wird es auf 0 zurückgesetzt ? Oder bleibt die Wert ?
 
Zuletzt bearbeitet:
Es gibt keine 'normalen' Schreibzugriffe auf QW124, ausser in FC3 NW13.
Die Liste mit überlappender Zugriffe ist leer.

Gibt es Bausteine mit AWL Code ?
Wird in diese AWL Bausteine mit Pointer-Zugriff gespielt ?

Gibt es Bausteine mit SCL Code ?
Wird in diese SCL Bausteine mit POKE gespielt ?

Was passiert wenn du in eine Beobachtungstabelle QW124 betrachtest, und dann ein Wert manuell eintippt ? Wird es auf 0 zurückgesetzt ? Oder bleibt die Wert ?

AWL habe ich im gesamten Programm nicht, und POKE Befehle in SCL auch nicht.

Wenn ich QW124 in einer normalen Beobachtungstabelle auf einen beliebigen Wert steuere ändert sich gar nichts, er wird nicht einmal kurz gesetzt.
Nur wenn ich in der Forcetabelle QW124: P setze, ändert sich etwas, das kommt dann auch richtig am FU an.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Da ist etwas ganz faul hier.
Wie Larry Laffer schreibt, die Test zeigt dass QW124 anderswo geschrieben wird.
Die Querverweiss mit überlappender Zugriffe sollte alle Zugriffe auffangen können - Ausser Pointer und POKE.
Oder geschützte Biblioteksbausteine. Gibt es vielleicht ein Biblioteksbaustein für den Lenze Antrieb ?

Probier mal FC3 in das letzte Netzwerk in OB1 zu umplazieren. Mache den Test erneut. Macht das ein Unterschied ?
 
Du kannst ja mal an verschiedenen Stellen im Ablauf den QW124 definiert schreiben, dann kannst du ggf. die Stelle/Bereich finden wo der Fehler passiert.

(da war ich zu langsam die Idee hat JesperMP schon geschrieben)

Beispiel: Wenn im OB1 alle möglichen FC's/ FB's aufgerufen werden, einfach mal dazwischen den Befehl setzen zum gezielten beschreiben. Wenn der dann durchkommt , liegt der Fehler vornedran, kommt er nicht durch hintendran.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke schonmal für eure Antworten. Ich bin einen Schritt weiter gekommen. Habe im OB1 einfach mal den Bausteinaufruf des Lenze FB's gelöscht, und siehe da, der Sollwert stimmt nun.
Nur, nach meinem Verständnis, hat der FB gar keine Schnittstelle für die Rampen. Ich verwende den Lenze FB Actuator Speed V2.2.
 
Der Lenze FB hat nur diese Eingänge.
1758885950867.png
Und keine Rampenfunktion, weshalb ich die beiden Rampen über direkte Parameterzugriffe programmieren wollte.
Ich komme mit der mitgelieferten Doku zu dem FB noch nicht so ganz klar, da muss ich mich nochmal rein arbeiten.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der erste Parameter sagt ja "First Peripherie Address"... also baut er sich die Zugriffe auf die Peripherie selbst zusammen und schreibt indirekt da drauf. Damit überschreibt er dann Deinen extern vorgegebenen Sollwert.

Vermutlich kannst Du über SpeedSetpoint selbst was vorgeben, ggf. mit EnableSpeedSetpoint?

EDIT: Achso, Du wolltest ja Rampen vorgeben... Gibt es da ggf. extra Bausteine für, zur Parametrierung?
 
Da der Lenze FB den Rampenwert mit 0 überschreibt dann gibt es vermutlich einen internen STAT Struktur der den Wert enthält und welches zusammen mit alle andere Ausgangsdaten auf einmal an den Antrieb geschrieben werden.
Wenn du diesen Instanzdaten Adresse finden konnte, dann könntest du diese Adresse ausserhalb von den FB beschreiben.
Diesen Vorschlag (Zugriff auf Instanzdaten) ist für viele Programmierer einen absoluten Sakrileg.
Ich wurde es aber überlegen wenn es keine anderen Weg gibts.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Diesen Vorschlag (Zugriff auf Instanzdaten) ist für viele Programmierer einen absoluten Sakrileg.
Ich wurde es aber überlegen wenn es keine anderen Weg gibts.
Keinen anderen Weg: Wenn es dafür einen Ausgang gibt, gibt es sicher auch einen Weg --> Dokumentation lesen
 
So wie in den Kommentare von JSEngineering zu entnehmen ist, bildet sich dieser Baustein anhand der "IO_Head Adresse" sich eine Startadresse.
Der erste Parameter sagt ja "First Peripherie Address"... also baut er sich die Zugriffe auf die Peripherie selbst zusammen und schreibt indirekt da drauf. Damit überschreibt er dann Deinen extern vorgegebenen Sollwert.

Und von dort aus werden 3 aufeinander folgende Worte beschrieben.

In Deinem Fall Startadresse "L_Steuerwort…" mit AW120:


  1. AW120 (Steuerwort)
  2. AW122 (Sollfrequenz)
  3. AW124 (wFreeCtrl_1)

Da du ja deine "16Bit selektierbare OutDaten" auf AW124 in der HW Config auf den Index für die Beschleunigung parametriert hast, musst du nun den wFreeCtrl_1 nutzen.
Siehe Antwort von Oberchefe

kann es vielleicht sein, dass der Rampenwert am FB Eingang wFreeCtrl_1 angelegt werden muss?

Alternativ mit dem Submodul auf AW124 einen anderen Index beschreiben,als "dummy" und ein weiteres Submodul "16Bit selektierbare OutDaten" hinzufügen. Dann entsprechend den Index für Beschleunigung parametrieren. Sollte auch funktionieren.

Intern arbeitet der Baustein übrigens mit PEEK und POKE.

Code:
    POKE(area := 16#82,dbNumber := 16#0,byteOffset := #StartAdress,value := #wOUT);
    POKE(area := 16#82,dbNumber := 16#0,byteOffset := #StartAdress + 2,value := #scInternalCtrl.awInt[3]);
    POKE(area := 16#82,dbNumber := 16#0,byteOffset := #StartAdress + 4,value := #scInternalCtrl.awInt[4]);
 
Zurück
Oben