Step 7 Regler in OB35 mit Wertübergabe

bosshaft

Level-1
Beiträge
2
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
ich habe ein Probelm mit einer Heizungsregelung. Die Heizung soll mittels PWM geregelt werden. Ein von mir selbstgeschriebener FB1, welcher die Pulsweite berechnet, wird alle 10 Sekunden im OB35 aufgerufen. Im FB1 wird die Pulsweite als TIME und eine Bool-Variable Fertig als IN_OUT im DB1 abgelegt. Fertig wird immer am Ende der Berechnung auf High gesetzt.
Nun meine erste Frage: Wie kann ich den berechnet Wert nun einem Timer übergeben?

Mein Vorgehen war, die Pulsweite als TIME-Variable und die Bool-Variable Fertig aus dem DB1 einem FB2 zu übergeben. Dieser FB2 wird im OB1 aufgerufen.

FB2
CALL #TOF
IN:=#Fertig
PT:=#Pulsweite
Q :=#Heizen
ET:=

U #Heizen
R #Fertig

Da der Timer als Startbedingung eine fallende Flanke benötigt, wird er direkt nachdem der Ausgang Heizen High ist zurückgesetzt. Dadurch erhalte ich eine PWM mit der Periode 10s und entsprechender Pulsweite.
In der Simulation funktioniert das alles super, wenn ich das Ganze dann auf die SPS übertrage, wird der Puls nicht jede 10 Sekunden gestartet sondern setzt immer mal wieder sporadisch aus.
Daher meine zweite Frage: Kann mir jemand sagen, warum das so ist? Oder ob es eine einfachere Lösung gibt, wie das realisiert werden kann? Schon allein daran, wie schwer es mir fällt das ganze einigermaßen verständlich rüber zu bringen denk ich mir, dass ich hier viel zu kompliziert denke...
Vielen Dank vorab.
 
Von der Theorie her sieht das gut aus.
Ich weiß nur nicht, wie sich der TOF-Baustein (Du verwendest vermutlich den IEC-Timer SFB5) auf wechselnde Zeiten reagiert, wann er die übernimmt.
Warum nimmst Du nicht den S_AVERZ?
Bitte beobachte mal, ob die Zeiten immer korrekt übernommen werden. Am besten mal den Ausgang ET beobachten.
Das wäre jetzt mein Tipp...
Ansonsten kannst Du auch mal in der OSCAT-Bibliothek (http://www.oscat.de) gucken, da gibt es Bausteine speziell für PWM... Vielleicht funktionieren die besser.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Warum nimmst du einmal OB35 und dann OB1?
Wenn etwas im OB35 machst, dann kann es zu Überschneidungen kommen zwischen Interruptgesteuert und zyklischem Programm kommen.

Ich würde z.B. alles im OB1 machen und über einen Timer mir die Werte reinladen und verarbeiten.

Also muss dir für deine Hausaufgabe eine andere Lösung einfallen lassen.


bike
 
Da er ein #Fertig-Signal hat, sollte das Vorgehen prinzipiell in Ordnung sein. Meiner Meinung nach sollte es da zu keiner Überschneidung kommen. Denn selbst, wenn OB35 treffgenau die Ausführung vom TOF unterbrechen würde, würde dieser mit den Werten des letzten Zyklus rechnen und erst im nächsten Zyklus das #Fertig und die neue #Pulsweite übernehmen.
 
Natürlich kann es so funktionieren.
Betonung auf "kann".
Bei dieser Art der Programmierung sehe ich die Instandhalter, die mit dem Programm leben müssen, beim Haare raufen.
Also ich würde den FB zyklisch aufrufen, den Messwert würde ich in einem OB 3x einlesen.
Das macht den Unterschied, dass man relativ leicht Fehlfunktionen des Programmes suchen und beheben kann.

Bedingte Aufrufe von Bausteinen sehe ich kritisch.


bike
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@JSEngineering: Den TOF verwende ich weil der Baustein mehrfach aufgerufen werden soll. Zu Testzwecken hatte ich die Pulsweite in ein Merkerwort geschrieben und das Fertig-Bit als Merker-Bit gesetzt. Dort funktionierte alles einwandfrei in der Anlage (kann aber eben nicht mehrfach aufgerufen werden da sonst das Merkerwort und das Merker-Bit mehrfach benutzt werden würde). Wenn ich die Pulsweite als Time-Variable übergebe, klappt auch noch alles, sobald ich aber nicht mehr das Merker-Bit sondern die IN_OUT Variable Fertig verwende, wird der Timer nicht immer aktiviert. Die Zeit fängt dann manchmal erst gar nicht an zu laufen bei ET. Ist der Merker eventuell schneller weil er nicht in den Datenbaustein geladen werden muss...?

@bike: Ja die Befürchtung mit dem Haareraufen hab ich auch... Ich brauch bei der Regelung eben einen exakten Abtastzeitpunkt der Temperatur von 10 Sekunden...
 
Wenn ich die Pulsweite als Time-Variable übergebe, klappt auch noch alles, sobald ich aber nicht mehr das Merker-Bit sondern die IN_OUT Variable Fertig verwende, wird der Timer nicht immer aktiviert.

Das verstehe ich nicht so ganz... erst sprichst Du von der Pulsweite und dann vom Merker-Bit...

Ansonsten:
Spontan würde ich Dich fragen, ob Du aus Versehen das DB-Bit mehrfach verwendest und dadurch mehrfach zurücksetzt?
Geh mal am Bausteineingang auf das Bit, rechte Maustaste, Verwendungsstelle, auch Überlappenden Zugriff anhaken.
Denn daß Merker funktionieren soll und DB nicht, kann ich mir gerade nicht vorstellen.
 
Ich brauch bei der Regelung eben einen exakten Abtastzeitpunkt der Temperatur von 10 Sekunden...

Wie exakt muss das sein?
Klar hilft dir ein OB3x für das Exakte erfassen.
Aber erfassen und regeln sind doch nicht selbe.
Ist deine Regelstrecke so schnell, dass bei einer Verzögerung von 3ms des Sollwertes alles zusammenfällt?


bike
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hallo,

ich habe letztens auch mit den IEC Timer experimentiert und hatte auch das Problem, dass der Timer manchmal nicht angelaufen ist.

poste mal den gesamten PWM Baustein bzw. den Teil, der die #Fertig Variable auf High setzt.

mfg
Kapo
 
Zurück
Oben