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

Ringspeicher Programmieren

tirius
2012-09-19
2012-09-27
  • tirius - 2012-09-19

    Hallo,

    Das Programm funktioniert ungefähr so, wenn ein druck größer 100% anliegt, zählt der Counter (anderer baustein) hier nur zu sehen mit "LOG_DRUCK" im CASE befehl,
    In z.b. 1min wird der höhste druck wert erfasst, danach springt der counter einen schritt weiter, wenn noch ein druck anliegt, wenn nicht wartet er in der ZEILE z.b. "2"
    bis wieder ein überdruck von 100% gemessen wird, Springt danach in Zeile "3" das wiederholt der bis zur zeile 10 und fängt wieder bei 1 an...

    Mit Excel kann man sich auf diese weise sehr einfach, mehrere programmzeilen erzeugen, nur geht das leider auf zu lasten des speichers...

    Ich habe auch schon mit STRING'S herumeperimentiert, z.b.

    STRING1:='DRUCK_LOGV_';
    STRING2:=WORD_TO_STRING(LOG_DRUCK);

    STRING3:=CONCAT(STRING1,STRING2); ( Ergibt die Variabeln aus der CASE Anweisung )

    Ich habe vor eine dynamische IF anweisung zu erstellen die jeweils die die variabel verändert, indem dieser druck drin gespeichert wird.
    Nur finde ich gerade keine möglichkeit auch nach langen googlen, den erstellten String in diese variable zu in die IF anweisung einzusetzen,

    Vlt hat ja jemand eine idee, brauch vlt sogar nur einen anstubser in die richtige richtung.

    Verwendete Hardware ist eine IFM CR0505.

    CASE LOG_DRUCK OF

    1 : IF druck_in_p >=100 THEN DRUCK_LOGV_1 :=MAX (REAL_TO_BYTE(druck_in_p), DRUCK_LOGV_1 ); END_IF; DRUCK_LOGV_2 :=0;
    2 : IF druck_in_p >=100 THEN DRUCK_LOGV_2 :=MAX (REAL_TO_BYTE(druck_in_p), DRUCK_LOGV_2 ); END_IF; DRUCK_LOGV_3 :=0;
    3 : IF druck_in_p >=100 THEN DRUCK_LOGV_3 :=MAX (REAL_TO_BYTE(druck_in_p), DRUCK_LOGV_3 ); END_IF; DRUCK_LOGV_4 :=0;
    4 : IF druck_in_p >=100 THEN DRUCK_LOGV_4 :=MAX (REAL_TO_BYTE(druck_in_p), DRUCK_LOGV_4 ); END_IF; DRUCK_LOGV_5 :=0;
    5 : IF druck_in_p >=100 THEN DRUCK_LOGV_5 :=MAX (REAL_TO_BYTE(druck_in_p), DRUCK_LOGV_5 ); END_IF; DRUCK_LOGV_6 :=0;
    6 : IF druck_in_p >=100 THEN DRUCK_LOGV_6 :=MAX (REAL_TO_BYTE(druck_in_p), DRUCK_LOGV_6 ); END_IF; DRUCK_LOGV_7 :=0;
    7 : IF druck_in_p >=100 THEN DRUCK_LOGV_7 :=MAX (REAL_TO_BYTE(druck_in_p), DRUCK_LOGV_7 ); END_IF; DRUCK_LOGV_8 :=0;
    8 : IF druck_in_p >=100 THEN DRUCK_LOGV_8 :=MAX (REAL_TO_BYTE(druck_in_p), DRUCK_LOGV_8 ); END_IF; DRUCK_LOGV_9 :=0;
    9 : IF druck_in_p >=100 THEN DRUCK_LOGV_9 :=MAX (REAL_TO_BYTE(druck_in_p), DRUCK_LOGV_9 ); END_IF; DRUCK_LOGV_10 :=0;
    10 : IF druck_in_p >=100 THEN DRUCK_LOGV_10 :=MAX (REAL_TO_BYTE(druck_in_p), DRUCK_LOGV_10 ); END_IF; DRUCK_LOGV_1 :=0;

    END_CASE

    mfg

    Tirius

     
  • Anonymous - 2012-09-20

    Originally created by: jl

    Hallo.

    Einer Variablen den Namen aus einem STRING zuzuweisen das funktioniert nicht.

    Aber warum verwendest Du eigendlich kein Array?

    So z.b.:

    PROGRAM PLC_PRG
    VAR
    druck_in_p: REAL;
    DRUCK_LOGV: ARRAY [1..10] OF BYTE;
    indexP: INT;
    END_VAR

    IF druck_in_p >=100 THEN
    DRUCK_LOGV[indexP] := MAX (REAL_TO_BYTE(druck_in_p), DRUCK_LOGV[indexP]);
    IF indexP < 10 THEN
    DRUCK_LOGV[indexP +1] := 0;
    ELSE
    DRUCK_LOGV[1] := 0;
    END_IF
    END_IF

    Aufpassen musst dabei allerdings das die Variable "indexP" den Array-Bereich nicht unter/überschreitet.
    Den Arraybereich kannst Du natürlich auch größer als 10 machenz.B. 100 oder 1000, was natürlich zu Lasten des Speichers geht, aber wenn Du ein Byte-Array nimmst, dann hat ein Array mit 1000 Werten auch nur die Größe von 1 Kilobyte, sollte kein Problem sein.

     

    Related

    Talk.ru: 1

  • tirius - 2012-09-27

    danke sehr,
    hab zwar mit arrays schon mal gearbeitet aber diese feinheiten wofür man gewisse sachen noch benutzen kann,
    kommt man manchmal einfach nicht drauf

    werd das morgen mal ausprobieren

    mfg

     

Log in to post a comment.