TIA zeitgenaues Handling der Weckalarme

b.weyand85

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

ich möchte bei meinem Programm taktgenau Sollwerte für einen Analogsausgang bereitstellen und die Zeitspanne soll dafür genau eingehalten werden. Zum Einsatz kommt eine CPU 1513F, die über Profinet mit einer ET200S (IM151-3) kommuniziert woran sich die Analogausgangsbaugruppe befindet.

Kurz zur Erklärung des Programms und der gewünschten Funktion:

In einem DB befinden sich mehrere gespeicherte Sollwerte für den Analogausgang. Als Beispiel ist dort eine Ausgabe der Werte von 3V bis 5V gegeben. Die 5V sollen dabei nach z.B. 100ms erreicht werden. In dem Array werden dann von 0 bis 100 immer 0,02 aufaddiert -> sprich: Data[0] = 3V, Data[1] = 3,02V, Data[2]= 3,04V ... Data[100] = 5V. Ich habe mich dabei für eine Steuerung via Weckalarm entschieden. Hierbei soll z.B. alle 10 ms ein neuer Wert an die Analogausgangsbaugruppe gesendet werden. Wird ein entsprechender Taster gedrückt so soll dann von 0 bis 100 ms jede 10te ms ein neuer Wert vorgegeben werden.

Der Programmcode dazu sieht aktuell wie folgt aus:

Code:
IF #Taster_gedrueckt = TRUE THEN
    #i := 0;
    #Schritt_Übergabe := 1;
    #Taster_gedrueckt := FALSE;
END_IF;

CASE #Schritt_Übergabe OF
    1:
        IF #i < 100ms THEN

            #Analogausgang := Data[#i];    
            #i := #i + 10;
        ELSE
            #Schritt_Übergabe := 2;
        END_IF;
    2:
        #Analogausgang := 0;
        #Schritt_Übergabe := 3;
END_CASE;

Das Problem, was hierbei auftritt ist, dass die Zeit von 100 ms nicht genau eingehalten wird. Die Zeitspanne an sich ist undefinierbar und ist entweder länger oder kürzer als 100ms. Lässt sich der Weckalarm mit den SFCs EN_IRT und DIS_IRT so steuern, dass die 100ms genau eingehalten werden? Wenn ja, wie mache ich das genau? Der Weckalarm ist auf 10000 us eingestellt. Vermutlich liegt es an dem undefinierten Zeitpunkt des Tastendrucks und der damit verbundenen undefinierbaren Resttaktzeit bis der Weckalarm erneut aufgerufen wird.
Ich stehe mir da gerade mal echt auf dem Schlauch, was das angeht und hoffe mir kann jemand dabei helfen...
 
Hallo,
das von dir gesehene Problem kann m.E. nicht auftauchen, da du den Taster ja nur für den Start nimmst. Der Abbruch erfolgt ja in deinem Baustein selbst.
Was passiert denn ganz genau ?
Und ... wie kommt die Variable #Analogausgang auf den tatsächlichen Analog_Out ? Passiert das per Perepherie-Zuweisung auch in diesem Baustein (so sollte es sein) oder vielleicht im zyklischen Programm ?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Woran machst Du fest, daß die 100ms "nicht genau" eingehalten werden? Wie groß ungenau?
Wie genau soll Deine Zeit eingehalten werden? Wie spät nach dem Start-Event soll der erste Wert der Sequenz ausgegeben werden?
Ein Weckalarm hält das eingestellte Zeitraster eigentlich sehr genau ein.

Dein Code sieht nicht so aus, als ob er in einem Weckalarm wäre bzw. als ob das Dein wirklicher Code wäre. Wie wird der Code aufgerufen? Wo und wie sind die Variablen deklariert? Wie gelangt der Wert von #Analogausgang zum Baugruppen-Analogausgang (Peripherie)?

Harald
 
Ah, okay. Ich muss wohl doch noch etwas weiter ausholen - ich hatte bei der Programmbearbeitung doch noch einen signifikanten Teil nicht erwähnt, weil ich dachte dass dies nicht relevant ist.
Also der hier verwendete Weckalarm (OB 31) ruft einen Funktionsbaustein auf in dem sich der oben erwähnte SCL-Code befindet. Im Prinzip wird in dem SCL-Code der Sollwert in ein bestimmtes Byte eines Datenbausteins geschrieben. Das Problem dabei ist, dass dies mit der SFC 15 an einen über Profinet verbundenen Inverter gesendet wird. Neben den neuen Sollwerten alle 10 ms erhält der Inverter mit dem ersten Sollwert auch ein Startsignal. Die SFC15 befindet sich allerdings im zyklischen Programmablauf in einer FC, die vom OB1 aufgerufen wird.
Hieran wird dann scheinbar die nicht definierte Zeitspanne liegen.

Ich messe zum Einen den Sollwert, der an den Inverter gesendet wird, indem ich diesen auch einem Analogausgang zuweise und zum Anderen den Istwert, den der Inverter ausgibt. Beide Werte sind an Oszilloskop angeschlossen. Der Istwert ist dabei der Ausgangsstrom des Inverters, der sich entsprechend der verschiedenen Sollwerte verändert. Die Zeit an sich ist dabei undefiniert es kann sein, dass der Inverter für 80 ms einen Strom liefert oder aber auch für 130 ms.

So wird das Problem dann vermutlich in dem Datenaustausch mit dem Inverter innerhalb des OB1 liegen, dass der SFC15 im zyklischen Programmablauf aufgerufen wird. Würde ich die SFC 15 auch im Weckalarm aufrufen so sollte das Problem wohl behoben sein, oder?
 
Zurück
Oben