Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

Messwerte auslesen

Anonymous
2012-07-31
2012-08-03
  • Anonymous - 2012-07-31

    Originally created by: StephanH.

    Hallo,
    ich habe ein Problem was die Messwertauslesung angeht. Ich erläutere mal kurz was ich für ein System habe und was ich gern machen würde. Also ich nutze folgende ABB Hadware (CPU: AC500_PM573_ETH_V2.1 ; AX521 ; AI531; DA501) und Software CoDeSys Version 2.3.9.28. Ich habe 2 Temperatursensoren und einen Drucksensor und ich würde die Messwerte gerne über einen Zeitraum von ca. 2 Stunden auslesen, dabei ist es wichtig, dass ich zwischendurch auch die Abtastrate ändern kann. Und ich möchte die Messerte dananch anschließend in excel öffnen. Gibt es dafür einen Funktionsbaustein der es mir erlaubt die Messwerte in eine Datei zu schreiben, oder erfolgt es über die Traceaufzeichnung oder ein Trenddiagramm in der Visualisierung. Mein Problem an der Traceaufzeichnung ist, dass der Ringspeicher der AC500 viel zu klein ist. Der müsste also irgendwie zyklisch ausgelesen werden und bei Bedarf müsste auch die Abtastrat variiert werden können.

    Ich bedanke mich für jede Unterstützung.

     
  • Schuero - 2012-07-31

    Hallo.

    Bei geringen Abtastraten >1 Minute könntest du über einen Trigger (FB Blink) deinen Messwerte in ein Array schreiben.
    Dieses kann dann in eine Textdatei geschrieben werden. Diese Text Datei (entsprechend formartiert) als csv - Datei von Excel ausgewertet werden.

    Dieses Vorgehen habe ich mal mit einer Wago 750-841 realisiert. Geht ganz gut (zumindest läuft es bis jetzt ohne meckern )

    Gruß schuero

     
  • Anonymous - 2012-07-31

    Originally created by: StephanH.

    Ja nun ist das Problem, dass ich Abtastraten so um die 50 ms brauche. Ist das dann so realisierbar?

     
  • Erik Böhm - 2012-07-31

    Servus

    Das ist natürlich realisierbar, solange die gewünschte Abtastrate nicht kürzer ist als dein schnellster SPS-Zyklus.

    Schreib die Messwerte im schnellsten SPS-Zyklus in ein ARRAY.
    Bei erreichen eines gewissen Füllstands wird der Inhalt dieses Arrays von einem niederprioren Task abgeholt und in eine Datei geschrieben.
    Währenddessen füllt der schnelle Task das Array wieder von vorne.
    Die Abtastrate hast du völlig selbst in der Hand. Musst ja nur über einen Timer bestimmen wann ins Array geschrieben wird.
    Technisch überhaupt kein Problem, wenn man sich auskennt.

    Wir schreiben z.B. immer einen Ringpuffer von 2000 TRACE-Strings mit, der bei Bedarf per TCP ausgelesen werden kann.
    Da können natürlich auch mehrere Einträge pro ms auftreten. Theoretisch auch alle 2000 'gleichzeitig'.

    Gruß
    Erik

     
  • Anonymous - 2012-08-01

    Originally created by: StephanH.

    Hallo nochmal,

    ich habe nochmal einige grundlegende Fragen was die Erstellung eines Array´s angeht weil ich im programmieren nicht so wirklich fit bin bzw. noch nie war. Ich bräuchte glaube ich eigentlich eine eine Struktur wie ich glaube...

    Es soll mal so aussehen:

    Nr.  ,     Temperatur_Ofen   ,    Temperatur_Reaktor     ,     Druck
      1                 20,2                       22                              0,5
      2                 22,4                       23                              0,7
    

    und so weiter.
    Dieser soll halt zyklisch beschrieben und in eine Datei geleert werden, dabei handelt es sich bei den Temperaturen und dem Druck um globale Variablen.
    Könnt ihr mir ein ansatz geben wäre wirklich dankbar.

    Gruß Stephan

     
  • Anonymous - 2012-08-01

    Originally created by: StephanH.

    Nr.| T_O | T_R| Druck |
    1 | 22.5 | 4 | 7 |

    etc.

     
  • Erik Böhm - 2012-08-01

    Moin

    Grundsätzlich kannst du das auf verschiedene Arten machen.

    1. ARRAY(s)
    2. Eindimensional:
      rTempOfen: ARRAY[1..200] or REAL := 200(0.0);
      rTempReaktor: ARRAY[1..200] or REAL := 200(0.0);
      rDruck: ARRAY[1..200] or REAL := 200(0.0);

    oder

    Mehrdimensional
    rData: ARRAY[1..200,1..200,1..200] of REAL := 600(0); ( TempOfen, TempReaktor, Druck )

    1. Struktur
      TYPE Data :
      STRUCT
      rTempOfen: REAL := 0;
      rTempReaktor: REAL := 0;
      rDruck: REAL := 0;
      END_STRUCT
      END_TYPE

    und dann ein ARRAY draus machen:

    sData: ARRAY[1..200] of Data.
    Zugriff dann mit:
    sData[42].rTempOfen

    oder Struktur mit ARRAY's
    TYPE Data :
    STRUCT
    rTempOfen: ARRAY[1..200] or REAL := 200(0.0);
    rTempReaktor: ARRAY[1..200] or REAL := 200(0.0);
    rDruck: ARRAY[1..200] or REAL := 200(0.0);
    END_STRUCT
    END_TYPE

    Zugriff dann mit:
    sData.rTempOfen[42]

    Es gibt vielfältige Möglichkeiten.

    Gruß Erik

     
  • Anonymous - 2012-08-03

    Originally created by: StephanH.

    Ok vielen dank schonmal.

    Soweit so gut. Ich habe mich für ein mehrdimensionales Array entschieden und das funktioniert auch wunderbar.
    Mehrdimensional
    rData: ARRAY[1..200,1..200,1..200] of REAL := 600(0); ( TempOfen, TempReaktor, Druck )
    Meine nächste Baustelle ist nun die zyklische Füllung und Leerung des Arrays in eine Datei. Ich habe da schon einiges versucht es will aber nicht so richtig klappen.
    Wie kann man ich da nun eine Taktzeit vorgeben ? Geht das mit einem TON Datenbaustein?

    Gruß Stephan

     
  • Erik Böhm - 2012-08-03

    Servus

    TON wäre eine Möglichkeit.

    Timer: TON;
    (-----------------------------)
    Timer(IN := TRUE, pt := t#5s);
    If Timer.Q then
    DateiSchreiben();
    case DateiSchreiben.iRetVal of
    1: ( Datei korrekt geschrieben )
    Timer(IN := FALSE);
    else ( Rückgabewert iRetVal meldet Fehler beim schreiben )
    Timer(IN := FALSE);
    ; (Fehlerbehandlung)
    end_case
    end_if

    Hier besteht natürlich die Gefahr, das dein ARRAY voll ist bevor der Timer abgelaufen ist.
    Drum würde ich auf jeden Fall auch noch den Füllstand des ARRAYs abfragen.

    Gruß
    Erik

     

Log in to post a comment.