b.weyand85
Level-2
- Beiträge
- 35
- Reaktionspunkte
- 0
-> 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:
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...
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...