Új hozzászólás Aktív témák

  • moseras

    tag

    válasz DP_Joci #3602 üzenetére

    Üdv!

    (* deklarációk *)
    FUNCTION_BLOCK Fb_AtlagoloSzuro
    VAR_INPUT
    rValue: REAL;
    bBufferSize: BYTE := 10;
    tPeriod: TIME := t#10s;
    RESET: BOOL;
    END_VAR
    VAR_OUTPUT
    rAverageValue: REAL;
    END_VAR
    VAR
    Buffer: ARRAY[1..255] OF REAL;
    tSampling: TIME;
    FillTimer: TON;
    I: WORD;
    Tick: BOOL;
    Init: BOOL := FALSE;
    END_VAR

    (* kód *)
    tSampling := tPeriod / bBufferSize;

    FillTimer(
    IN := NOT Tick,
    PT := tSampling,
    Q => Tick
    );

    IF NOT init OR RESET OR bBufferSize = 0 THEN
    Init := TRUE;
    FOR I:= 1 TO bBufferSize DO
    Buffer[I] := rValue;
    END_FOR;
    rAverageValue := rValue;
    ELSIF Tick THEN
    IF I >= bBufferSize THEN
    I := 1;
    ELSE
    I := I + 1;
    END_IF;
    rAverageValue := rAverageValue + (rValue - Buffer[I]) / bBufferSize;
    Buffer[I] := rValue;
    END_IF;

    Az ötlet innen van: [oscat]

    A FILTER_MAV_DW nevű blokkot módosítottam, úgy hogy REAL értékkel dolgozzon, továbbá, hogy időalapú legyen.

    Ha működés közben módosítod a puffer méretét vagy a teljes periódusidőt, akkor teszteld le úgy is, mert arra nincs tesztelve !

    Imi.

Új hozzászólás Aktív témák