Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 17 von 17

Thema: Messwerte in Array fortlaufend schreiben

  1. #11
    Registriert seit
    16.03.2014
    Beiträge
    359
    Danke
    74
    Erhielt 45 Danke für 38 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    So,
    habe ein Beispiel fertig.
    Habe möglichst viel Kommentiert !
    Schau mal, ob das so deinen Wünschen entspricht.
    Den Aufruf meines FB kannst du ja logischerweise auch in FUP machen, ist dir das Klar ?
    LG
    Shrimps
    PS: Solltest du den Memcpy nicht finden, so muss alles durch eine For-Schleife erledigt weden...(LIBs suchen...)

    @KingHelmer: Das komische Einrücken hat mich immer beim übertragen in andere Systeme gestört, im TwincatEditor sieht es perfekt aus...

    Code:
    FUNCTION_BLOCK _fbDumpArray
    VAR_INPUT
        iWert        : INT;    (* Der zu speichernde Int *)
        tTaktzeit        : TIME;    (* Die gewünschte Taktzeit *)
    END_VAR
    VAR_OUTPUT
        aData         : ARRAY [0..29] OF INT;    (* Das gesicherte Ergebniss *)
        bReady        : BOOL;                    (* Wir haben einen Zyklus fertig *)
    END_VAR
    VAR
        bInit             : BOOL     := TRUE;        (* Immer wieder sauber neustart *)
        aData1         : ARRAY [0..29] OF INT;    (* Der Interne Puffer *)
        aDataInit     : ARRAY [0..29] OF INT := 30(0);    (* Faulheit für Init *)
        Timer        : TON;                    (* Unser Takt *)
        Counter        : INT;                    (* Zaehler *)
    END_VAR
    
    IF bInit THEN        (* Immer wenn eine Zyklus fertig ist oder Neustart *)
        (* Das Nullen wäre auch it eine FOR-Schleife gegangen, egal entweder Zeit oder Speicher*)
        MEMCPY(ADR(aData1), ADR(aDataInit), 30*2) ;    (* Internes Array mit 0 vorbelegen *)
        Counter     := 0;            (* Zaehler reset *)
        bInit         := FALSE;    (* Init hat fertig *)
        bReady     := FALSE;    (* Zyklus ist nicht fertig *)
    END_IF
    
    Timer(IN := NOT Timer.Q, PT := tTaktzeit);    (* Takt starten *)
    
    IF Timer.Q THEN        (* Zeit erreicht ? *)
    
        aData1[Counter]     := iWert;            (* Wert übernehmen *)
        Counter             := Counter + 1;        (* Zaehler erhoehen *)
    
        IF Counter   > 29 THEN                (* Zaehler Fertig ? *)
            MEMCPY(ADR(aData), ADR(aData1), 30*2) ;    (* Daten speichern *)
            bReady    := TRUE;                (* Wir haben einen Zyklus ! *)
            bInit         := TRUE;                (* Sauber machen, siehe init *)
        END_IF
    
    END_IF
    Hier der Aufruf
    Code:
    PROGRAM MAIN
    VAR
        Wert        : INT;
        Zufall        : DRAND;
        fbDumpArray    : _fbDumpArray;
        aMydata        : ARRAY [0..29] OF INT;
    END_VAR
    
    Zufall(SEED := 0);
    Wert := REAL_TO_INT(Zufall.Num * 100);
    
    fbDumpArray(iWert := Wert, tTaktZeit := t#250ms);
    
    IF fbDumpArray.bReady THEN
        aMydata := fbDumpArray.aData;
    END_IF
    Geändert von shrimps (31.12.2015 um 14:34 Uhr)

  2. #12
    Registriert seit
    16.03.2014
    Beiträge
    359
    Danke
    74
    Erhielt 45 Danke für 38 Beiträge

    Standard

    Upps,
    an Alle:
    Guten Rutsch und viel Erfolg im neuen Jahr !

    LG
    Shrimps

  3. #13
    stehmi ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    26.10.2012
    Beiträge
    7
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Vielen Dank schrimps,
    werde versuchen mich durchzuwursteln.

    Dir auch nen guten Rutsch !!!!

  4. #14
    stehmi ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    26.10.2012
    Beiträge
    7
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo schrimps,
    hatte Gestern mal Zeit deinen Funktionsblock zu testen, aber leider unterstützt meine Steuerung Schneider-Electric M258 die MEMCPY Funktion nicht.
    Eine andre Frage, kennst Du Dich mit Pointern aus?

  5. #15
    Registriert seit
    16.03.2014
    Beiträge
    359
    Danke
    74
    Erhielt 45 Danke für 38 Beiträge

    Standard

    Hi stehmi,
    ich bau dir ne Version ohne memcpy...

    Pointer kenne ich, wenn ich diese benötige, weiss ich wie ich sie verwende, aber aktiv mache ich mit denen nichts.
    Mir hatte am Anfang der SPS-Kontakte mal jemand gesagt, das Pointer eine recht kritische Sache ist...

    Was für ein Problem hast du denn ?

    LG
    Shrimps

  6. #16
    Registriert seit
    16.03.2014
    Beiträge
    359
    Danke
    74
    Erhielt 45 Danke für 38 Beiträge

    Standard

    Hi stehmi,
    ich bau dir ne Version ohne memcpy...

    Pointer kenne ich, wenn ich diese benötige, weiss ich wie ich sie verwende, aber aktiv mache ich mit denen nichts.
    Mir hatte am Anfang der SPS-Kontakte mal jemand gesagt, das Pointer eine recht kritische Sache ist...

    Was für ein Problem hast du denn ?

    LG
    Shrimps

  7. #17
    Registriert seit
    16.03.2014
    Beiträge
    359
    Danke
    74
    Erhielt 45 Danke für 38 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Wie versprochen, hier die Version ohne memcpy:

    LG
    Shrimps

    Code:
    FUNCTION_BLOCK _fbDumpArray
    VAR_INPUT
        iWert        : INT;    (* Der zu speichernde Int *)
        tTaktzeit        : TIME;    (* Die gewünschte Taktzeit *)
    END_VAR
    VAR_OUTPUT
        aData         : ARRAY [0..29] OF INT;    (* Das gesicherte Ergebniss *)
        bReady        : BOOL;                    (* Wir haben einen Zyklus fertig *)
    END_VAR
    VAR
        bInit             : BOOL     := TRUE;        (* Immer wieder sauber neustart *)
        aData1         : ARRAY [0..29] OF INT;    (* Der Interne Puffer *)
    (*    aDataInit     : ARRAY [0..29] OF INT := 30(0);    (* Faulheit für Init *) *)
        Timer        : TON;                    (* Unser Takt *)
        Counter        : INT;                    (* Zaehler *)
        Index        : USINT;                    (* index *)
    END_VAR
    IF bInit THEN        (* Immer wenn eine Zyklus fertig ist oder Neustart *)
        (* Das Nullen wäre auch it eine FOR-Schleife gegangen, egal entweder Zeit oder Speicher*)
        (* MEMCPY(ADR(aData1), ADR(aDataInit), 30*2) ;    (* Internes Array mit 0 vorbelegen *) *)
        FOR Index := 0 TO 29 DO
            aData1[Index] := 0;
        END_FOR
        Counter     := 0;            (* Zaehler reset *)
        bInit         := FALSE;    (* Init hat fertig *)
        bReady     := FALSE;    (* Zyklus ist nicht fertig *)
    END_IF
    
    Timer(IN := NOT Timer.Q, PT := tTaktzeit);    (* Takt starten *)
    
    IF Timer.Q THEN        (* Zeit erreicht ? *)
    
        aData1[Counter]     := iWert;            (* Wert übernehmen *)
        Counter             := Counter + 1;        (* Zaehler erhoehen *)
    
        IF Counter   > 29 THEN                (* Zaehler Fertig ? *)
            (* MEMCPY(ADR(aData), ADR(aData1), 30*2) ;    (* Daten speichern *) *)
            FOR Index := 0 TO 29 DO
                aData[Index] := aData1[Index];
            END_FOR
    
            bReady    := TRUE;                (* Wir haben einen Zyklus ! *)
            bInit         := TRUE;                (* Sauber machen, siehe init *)
        END_IF
    
    END_IF
    
    PROGRAM MAIN
    VAR
        Wert        : INT;
        Zufall        : DRAND;
        fbDumpArray    : _fbDumpArray;
        aMydata        : ARRAY [0..29] OF INT;
    END_VAR
    
    Zufall(SEED := 0);
    Wert := REAL_TO_INT(Zufall.Num * 100);
    
    fbDumpArray(iWert := Wert, tTaktZeit := t#250ms);
    
    IF fbDumpArray.bReady THEN
        aMydata := fbDumpArray.aData;
    END_IF

Ähnliche Themen

  1. TIA Zeitstempel in TIA v13 fortlaufend in DB schreiben
    Von dentech im Forum Simatic
    Antworten: 14
    Letzter Beitrag: 07.10.2014, 13:46
  2. Antworten: 5
    Letzter Beitrag: 24.10.2013, 10:37
  3. Wago 750 Messwerte in Array schreiben
    Von emsbootsmann im Forum Sonstige Steuerungen
    Antworten: 14
    Letzter Beitrag: 21.10.2012, 16:30
  4. Antworten: 5
    Letzter Beitrag: 14.06.2005, 14:55
  5. pew auslesen und fortlaufend in ein Array abspeichern
    Von Anonymous im Forum Programmierstrategien
    Antworten: 0
    Letzter Beitrag: 13.06.2005, 17:59

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •