Step 7 Problem mit Real-Verarbeitung

PeterPan-35

Level-2
Beiträge
157
Reaktionspunkte
12
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe einen einfachen I-Regler programmiert.
Beim Testen funktioniert alles, bis auf die addition von altem und neuen Wert.

Dort bekomme ich in der Variable "Alter_Wert" nämlich immer "-1.#IOe+000" angezeigt.
("Alter_Wert" ist beim ersten Durchlauf noch unbeschrieben, er wird erst nach dem Aufaddieren beschrieben)
Ich weiß nicht was das bedeutet, denke aber, dass es sich um eine Fehlermeldung handelt.
1.jpg2.jpg

Daher habe ich eine Resetfunktion mithilfe des E0.0 eigebaut.
Dieser Eingang überschreibt den "Alten_Wert" auf 0 und der Regler macht nach dem Reset genau was er machen soll.
1.1.jpg2.1.jpg

Aber diese Lösung mit dem Eingang E0.0 gefällt mir überhaupt nicht.
Gibt es keine Möglichkeit, den Reset-Vorgang automatisch beim ersten Durchlauf des OB35 durchzuführen?

Oder gibt es eine Lösung, welche das Auftreten der "-1.#IOe+000" Angabe komplett beseitigt.
Evtl. habe ich ja einen dummen Fehler gemacht.

MfG
 
Zuletzt bearbeitet:
Zum Initialisieren von Werten beim Start der SPS kannst du den OB100 verwenden.

Edit: Aber irgendwo her muss das Problem ja auch kommen. Verwendest du versehentlich ein Bit des Merkerdoppelwortes?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Also die Verwendung eines Merkers im Doppelwort wäre auch mein erster Tipp.

Fragen:
Ist das ein FC oder ein FB?
Wenn Du "resetet" hast, wann tritt der Fehler wieder auf? CPU Neustart?
Was ist der "Alten_Wert" für ein Typ? IN_OUT oder OUT?


Anmerkung:
integriert der eigentlich immer, oder sollte man den Regler auch deaktivieren können? Weil wenn dem so ist könntest Du bei inaktivem Regler den "nicht_aktiv" statt dem Reset nehmen.
 
Wie ist denn Dein "Alter_Wert" deklariert?

Sieht so nach Temp aus, weil undefiniert? Sollte aber STAT sein. Dann kannst Du auch einen Startwert angeben.
 
Also "Alter_Wert" ist eine statische Real Variable.

Und Merker habe ich keine verwendet nur Merker Doppelworte. Diese überschneiden sich auch nicht.
Der Regler ist in einem FB angelegt.

Den Regler wollte ich über den I-Anteil deaktivieren, wenn der I-Anteil 0 ist, wird auch nichts geregelt.

MfG
 
"-1.#IOe+000" stellt eigentlich den Unterlauf einer Gleitpunktzahl dar.
Als wenn die Zahl so stark negativ ist dass diese nicht mehr dargestellt werden kann.
Eine Division einer negativen Zahl (oder 0) durch 0 wird ebenfalls so dargestellt.

Probier mal
Code:
    L     MD   104
    L     1.000000e+036
    -R    
    T     MD   104
Nach kurzer Zeit kommt es zum Unterlauf.

Da du Anscheinend nur aufaddierst (der Überlauf wäre 1#IOe+000 ohne neg. Vorzeichen) muss es einen anderen Grund geben.
  • Deklaration der Variable (Temp)
  • Realvariable wird irgendwo in AWL mit einem Nicht-Real-Befehl (+D,+I) verarbeitet
  • Irgendwas ala Division/0
  • Irgendwelche indirekten Speicherzugriffe die ein Bit beeinflussen....
  • Wenn's ein STAT ist, IDB aktuell und eingespielt?

Irgendwo ist da wohl ein Fehler in deinem Programm...

Wann taucht der Fehler auf?
  • Nach dem SPS-Start?
  • Nach dem einspielen des IDB?
  • Nach einiger Zeit?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
"-1.#IOe+000" stellt eigentlich den Unterlauf einer Gleitpunktzahl dar.
Als wenn die Zahl so stark negativ ist dass diese nicht mehr dargestellt werden kann.
Eine Division einer negativen Zahl (oder 0) durch 0 wird ebenfalls so dargestellt.

Probier mal
Code:
    L     MD   104
    L     1.000000e+036
    -R    
    T     MD   104
Nach kurzer Zeit kommt es zum Unterlauf.

Da du Anscheinend nur aufaddierst (der Überlauf wäre 1#IOe+000 ohne neg. Vorzeichen) muss es einen anderen Grund geben.
  • Deklaration der Variable (Temp)
  • Realvariable wird irgendwo in AWL mit einem Nicht-Real-Befehl (+D,+I) verarbeitet
  • Irgendwas ala Division/0
  • Irgendwelche indirekten Speicherzugriffe die ein Bit beeinflussen....
  • Wenn's ein STAT ist, IDB aktuell und eingespielt?

Irgendwo ist da wohl ein Fehler in deinem Programm...

Wann taucht der Fehler auf?
  • Nach dem SPS-Start?
  • Nach dem einspielen des IDB?
  • Nach einiger Zeit?

Hallo, also das dort irgendwo ein Fehler vorliegt, welcher womöglich auch behoben werden kann, denke ich mir auch.
Denn ein ganz normaler Taschenrechner kommt mit dieser Aufgabe ja auch ohne Probleme klar :wink:

Daher habe ich diesen I-Regler noch einmal in einem neuen Projekt erstellt, in dem sonst nichts vorhanden ist.
Doch dort ist genau das gleiche Schauspiel zu erkennen.

Also der Fehler tritt sofort auf, wenn die SPS im RUN-Modus ist.
In diesem Moment habe ich noch keinen Sollwert, keinen I-Anteil,... eingegeben.

Ich habe einmal von allem Screenshots gemacht:

1.jpg
Symboltabelle

2.jpg
OB35


(weitere folgen)
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Najo, da sieht man das Problem eh, wenn der I-Anteil 0.0 ist, hast Du eine Division durch 0.0!
Technisch nicht falsch, da Du unendlich schnell integrierst. Bei den "normalen" Reglern stellt man beim I-Anteil 0.0 ein wenn man nicht integriert, diese fangen das aber ab.
Du (noch) nicht!
 
Ha, wusste gar nicht dass aus
Code:
L  [COLOR=#ff0000][B]+[/B][/COLOR][B][COLOR=#ff0000][/COLOR][/B]1#IOe+000
L  0.0
*R
wieder -1#IOe+000 wird.

Auch interessant.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Technisch nicht falsch, da Du unendlich schnell integrierst. Bei den "normalen" Reglern stellt man beim I-Anteil 0.0 ein wenn man nicht integriert, diese fangen das aber ab.
Du (noch) nicht!

Sry, da stehe ich etwas auf dem Schlauch. Ich weiß leider nicht was du damit meinst. Was fangen "normale" Regler ab?

MfG
 
Na der FB41, zB, der macht dasselbe was Du jetzt tust, Abfrage auf I=0.0 und Sprung weg.
(Vermute ich mal).

Das Problem beim I-Regler (oder PI oder PID) ist ja, dass ein kleiner I-Anteil sehr schnell integriert, also zB 0,1s Nachstellzeit ist was sehr hurtiges, aber 0.0 ist gar kein I-Anteil. Darum muss man das eben abfangen, was Du ja getan hast.

Edit: "normal" ist, wenn man P, I, und D nicht binär ein- oder ausschalten kann sondern dies mittels Eingabe von 0.0 macht.
 
Zurück
Oben