Step 7 SFB3 in SCL

MaCit

Level-1
Beiträge
9
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag,
ich brauche in meinem FB ein Zähler, der alle 20ms hochzählt.
Ich wollte das ganze mit zwei SFB3 lösen und von einem SFB3 die Flanke dafür auswerten.
Das funktioniert auch soweit, nur leider zählt er nicht in der gewünschten Zeit hoch, sondern ist etwas langsamer.
Was mache ich falsch:
Code:
VAR       
    zaehler         :   REAL;
    sfb3_1          :   SFB3 ;
    sfb3_2          :   SFB3 ;                  
    sfb3_1_start    :   BOOL;
    sfb3_2_start    :   BOOL;
    HM              :   BOOL;           //HIGH-Merker; für Flankenerkennung 
    
    
END_VAR

Code:
BEGIN
    sfb3_1  (IN := sfb3_1_start             // IN: BOOL
            ,PT := t#10ms                   // IN: TIME
            ); 
    sfb3_2  (IN := sfb3_2_start
            ,PT := t#10ms
            );
 
   
            
    sfb3_1_start := NOT sfb3_2.Q;
    sfb3_2_start := NOT sfb3_1.Q;

    IF sfb3_1.Q AND NOT HM THEN
        zaehler:=zaehler+0.02;
        HM := TRUE;                        
    ELSIF NOT sfb3_1.Q THEN
        HM := FALSE;        
    END_IF;
 
Dein 20ms-Zählraster ergibt sich etwa zu: 10ms + 0.5 * Zykluszeit + Zykluszeit + 10ms + 0.5 * Zykluszeit + Zykluszeit = 20ms + 3 * Zykluszeit

Wenn Du es genauer haben mußt, dann richte Dir einen Weckalarm OB3x ein, welcher alle 20ms aufgerufen wird oder addiere #OB1_PREV_CYCLE oder nutze SFC64 TIME_TCK oder notfalls stelle die SFB3 auf ungefähr "10ms - 1.5 Zykluszeit" ein.


Desweiteren empfehle ich Dir, als "zaehler" eine DINT-Variable statt REAL zu verwenden. Nach ca. 16 Mio addierungen (etwa 320 Sekunden) wird der REAL-Zähler stehenbleiben, weil dann ungefähr dies passiert: 320000.00 + 0.02 = 320000.00

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die Antwort.
Mit einem Weckalarm hatte ich es schon umgesetzt, jedoch ist diese Realisierung vom Prof nicht gewünscht.
Der Hinweis zum SFC64 war sehr hilfreich. jetzt funktionierts.

"zaehler" hab ich als REAL gelassen, da diese sowieso alle 10s auf Null gesetzt wird und ich so besser damit arbeiten kann
 
Zurück
Oben