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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: Messwerte in Array fortlaufend schreiben

  1. #1
    Registriert seit
    26.10.2012
    Beiträge
    7
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    ich habe bereits diverse Foren durchsucht aber noch nicht das richtige gefunden.
    Ich muss dazu sagen, das ich blutiger Anfänger bin was Codesys angeht.

    Ich habe folgendes Problem bzw. Aufgabe,

    Ich möchte Messwerte eines Analogen und bereits normierten Sensors fortlaufend in ein Array schreiben und aus diesen dann einen Mittelwert berechnen.
    Mit dem Mittelwert muss ich mich noch einlesen, habe Meridian, gleitender Mittelwert, Bubblesort und Quicksort gefunden.
    Aber zunächst geht es mir erst mal darum ein Array mit Messwerten zu füllen.

    Könnt Ihr mir dazu einen Tipp geben, wie ich das angehen kann??
    Zitieren Zitieren Messwerte in Array fortlaufend schreiben  

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

    Standard

    Hi,
    ich hatte mir vor einiger Zeit einen solchen Baustein geschrieben, weil ich genau so eine Lösung suchte...
    Anbei das Beispiel

    Viel Erfolg
    Shrimps
    Code:
    FUNCTION_BLOCK _fbAVG_INT16
    VAR_INPUT
        iSignal    : INT;    (* Eingangswert *)
        tZeit    : TIME := t#8s;    (* Abtastzeit gesamt *)
    END_VAR
    VAR_OUTPUT
        iAVG    : INT;    (* Der Mittelwert *)
    END_VAR
    VAR
        Timer     : TON;    (* Timer *)
        tTakt    : TIME;    (* 1/16 von tZeit *);
        iData     : ARRAY [0..15] OF INT;    (* Die Daten *)
        Summe    : DINT;    (* Summenzaehler *)
        Index    : INT;    (* Index für Array *)
        init    : BOOL := TRUE;    (* Start *)
    END_VAR
    (* FB ermittelt einen gleitenden Mittelwert aus *)
    (* 16 Integerwerten welche in einem vorgebbaren *)
    (* Zeitinterval als FILO gespeichert werden *)
    IF init THEN
        FOR Index := 0 TO 15 DO
            iData[Index] := iSignal;
        END_FOR
        init := FALSE;
        iAVG := iSignal;
    END_IF
    
    tTakt := tZeit / 16;
    
    Timer(IN := NOT Timer.Q, PT := tTakt);
    
    IF Timer.Q THEN
        Summe := 0;
        FOR Index := 15 TO 1 BY -1  DO
            iData[Index] := iData[Index - 1];
            Summe := Summe + iData[Index];
        END_FOR
        iData[0] := iSignal;
        Summe := Summe + iSignal;
        iAVG := DINT_TO_INT(summe / 16);
    END_IF
    
    END_FUNCTION_BLOCK

  3. Folgende 2 Benutzer sagen Danke zu shrimps für den nützlichen Beitrag:

    KingHelmer (30.12.2015),stehmi (29.12.2015)

  4. #3
    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,

    Danke für die schnelle Antwort, werde gleich mal versuchen, mich in deinen Code rein zu fuchsen.

  5. #4
    Registriert seit
    21.02.2011
    Ort
    Deutschland, Baden-Würtemberg
    Beiträge
    989
    Danke
    114
    Erhielt 125 Danke für 100 Beiträge

    Standard

    Hey Shrimps,

    mir ist bei deinem Code-Ausschnitt aufgefallen, dass du einzelne Zeilen auskommentierst.
    Hat das einen gesonderten Sinn?
    Code:
    (* FB ermittelt einen gleitenden Mittelwert aus *)
    (* 16 Integerwerten welche in einem vorgebbaren *)
    (* Zeitinterval als FILO gespeichert werden *)
    Wieso nicht so:

    Code:
    (* FB ermittelt einen gleitenden Mittelwert aus
    16 Integerwerten welche in einem vorgebbaren
    Zeitinterval als FILO gespeichert werden *)
    Mich interessiert nur, warum du das so machst, vielleicht wusstest du auch nicht, dass man nicht jede einzelne Zeile auskommentieren musst und
    du kannst dir so etwas Zeit sparen

    Ansonsten danke für den Ansatz, ist für mich eventuell auch brauchbar!

    Gruß,
    Flo

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

    Standard

    Hi KingHelmer,
    mehrzeiliger Kommentar ist mir bekannt, jedoch nicht überall genormt...
    Macht der Gewohnheit.
    Lg

  7. #6
    Registriert seit
    21.02.2011
    Ort
    Deutschland, Baden-Würtemberg
    Beiträge
    989
    Danke
    114
    Erhielt 125 Danke für 100 Beiträge

    Standard

    Dachte ich mir schon

  8. #7
    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

    Könnt Ihr mir bei meinem neuen Problem auch helfen.

    Ich möchte alle 0,5 s einen Wert in ein Array schreiben [0..30] und den Index um eins erhöhen.
    Wenn Index 30 erreicht hat, den Inhalt dieses Arrays in ein anderes Array speichern, danach den Index auf 0 und wieder von vorne beginnen.

    Könnt Ihr mir da auch mit einem Beispiel helfen bitte.
    Ich kann trotz Internet nichts passendes finden
    Zitieren Zitieren getakteter Ringpuffer  

  9. #8
    Registriert seit
    16.03.2014
    Beiträge
    358
    Danke
    74
    Erhielt 45 Danke für 38 Beiträge

    Standard

    Hallo stehmi,
    das Internet erledigt auch nicht meine Arbeit

    Wenn ich erfahren dürfte warum du es genauso haben willst, kann ich es schnell runtertippen aber ggf. ist eine Lösung ganz anders wenn man die Aufgabe kennt !

    Ansonsten zum lernen:
    --- pseudocode---
    Gleicher Kram wie von mir, nur wenn array voll dann via memcopy in anderes identisch deklariertes Array und ab von vorne
    --------

    Viel Spaß
    Shrimps

  10. #9
    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
    ich suche ja nicht nach einer kompletten Lösung obwohl das natürlich schön wäre aber finde auch nichts was mich bis jetzt weiter gebracht hat.
    Meine Aufgabe ist eigentlich, das ich Wie zu beginn schon geschrieben von einem Sensor aufzeichnen möchte.
    Das mit dem ARRAY und Mittelwert habe ich verstanden, nun möchte ich aber auch noch bestimmen können, in welchem Takt er die Werte vom Sensor
    in das ARRAY schreibt.
    Ich möchte im Prinzip alle x Sekunden einen Wert in das ARRAY_1 schreiben.
    Wenn der Index bzw. wenn ich 30 Werte erreicht habe möchte ich diese Werte in ARRAY_1 in ein anderes ARRAY_2 übergeben und ARRAY_1 wider von vorne beginnen.
    Ich hoffe ich konnte dir mein Problem schildern.
    Geändert von stehmi (30.12.2015 um 16:35 Uhr)

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

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hi,
    wenn ich nachher noch n bischen Zeit finde, schreibe ich dir das runter...

    Bye
    Shrimps

Ä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
  •