Abtasten in ST

2010-11-29
2010-12-06
  • Student-Andidas - 2010-11-29

    Hi Leute,
    ich möchte ein kontinuierliches Signal abtasten und nachher dann in ein Array legen. Jetzt fehlt mir die Idee wie ich die Abtastung durchführe. Hat jemand eine Idee für mich.
    Achja habe das früher mit einem BLINK Baustein realisiert. Möchte das jedoch in ST hinbekommen ohne den Blinker zu verwenden.
    Der Eingang sieht wie folgt aus:
    VAR_INPUT
    x :REAL; (kont. Signal)
    time :TIME; (Abtastzeit)
    time_r :REAL; (Abtastzeit als REAL-Wert)
    END_VAR

    Ich danke euch!

     
  • Schuero - 2010-11-29

    Moin.

    Das einfachste ist, wenn du in deiner Taskkonfiguration dein "Abtastprogramm" alle x ms aufrufst.
    Du müßtest dazu einen "neuen Task" vom Typ "Zyklisch" erstellen.
    Dann kannst du über die Eigenschaften den Intervall so setzen wie du möchtest.
    Bitte im Hinterkopf behalten, dass du die Intervallzeit gößer läßt, wie die Zykluszeit deines "Abtastprogramm's".

    Gruß Schuero

     
  • Student-Andidas - 2010-11-29

    Soll später ein Regler werden den ich ungern an die Taskkonfig koppeln möchte.
    Kann mir zB jemand sagen wie ich die Systemzeit auslese und dann vll die Differenz von Zeiten bilde?

     
  • B.Roth - 2010-11-29

    Hi,

    kommt auf das Target/Hardware an welche Funktion Du für die Systemuhrzeit zur Verfügung hast (ob z.B. die SyslibTime.lib unterstützt wird.)

    Für Regler und Abtastfunktionen empfehle ich Dir auch die OSCAT.Lib

    w www.oscat.de w

     
  • Student-Andidas - 2010-11-29

    Hi. Ich möchte diese Aufgabe hardware-unabhängig lösen. Oscat.lib möchte ich auch erstmal nicht benutzen. Klingt merkwürdig, aber es wird doch wohl diese Aufgabe zu schaffen sein oder?

     
  • Erik Böhm - 2010-11-29

    Servus

    Die Zeit kannst du Hardwareunabhängig mit der Funktion TIME() aufrufen.

    Also z.B.
    VAR
    tStart: TIME;
    END_VAR


    tStart := TIME();

    Falls du noch Flankenerkennung benötigst, dazu gibts die StandardLib mit r_trig und f_trig.

    Gruß
    Erik

     
  • Anonymous - 2010-11-30

    Originally created by: jl

    VAR
    getStartTime : BOOL := FALSE; (Verriegelung Startzeit zuweisen )
    tStart : TIME; (Startzeit )
    tAbtastzeit : TIME := t#10s; ( Abtastzeit )
    index : INT := 1; ( Index für Array )
    xSignal : ARRAY[1..1000] OF REAL; ( Array in dem dasEingangssignal gespeichert wird )
    x : REAL ( Eingangssignal )
    END_VAR

    ( Startzeit zuwiesen und verriegel )
    IF NOT getStartTime THEN
    tStart := TIME();
    getStartTime := TRUE;
    END_IF

    ( Wenn Symtemzeit TIME() grösser als Startzeit plus Abtastzeit, dann speichere das Eingangssignal ins Array, erhöhe den Index des Array um 1und setze die Verriegelung getStartZeit zurück, damit die Startzeit neu gesetzt werden kann)
    IF TIME() > tStart + tAbtastzeit then
    xSignal(Index) := x;
    getStartTime := FALSE;
    Index := Index + 1;
    END_IF

    ( Wenn der Index des Array den maximal Wert erreicht hat beginne wieder bei 1 )
    IF Index > 1000 then
    index := 1;
    END_IF

     
  • Student-Andidas - 2010-12-06

    Das ist echt super. So hab ich mir das vorgestellt.
    Gruß Andreas

     

Log in to post a comment.