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

Ergebnis 1 bis 8 von 8

Thema: Array berreiche kopieren

  1. #1
    Registriert seit
    13.05.2011
    Beiträge
    16
    Danke
    0
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    ich bin fast den ganzen Tag nun an einer Aufgabe die ich einfach nicht "unkompliziert" lösen kann.

    Klar ist es kein problem Variablen aus einen Array in ein anderes zu Kopieren.

    Beispiel:

    (*Deklaration*)
    START_VAR : ARRAY [0..288] OF REAL
    ZIEL_VAR : ARRAY [0..288] OF REAL

    (*Programm*)
    ZIEL_VAR := START_VAR;

    - Aber ich möchte ja nicht KOMPLETTE ARRAYS KOPIEREN! SONDERN TEILE
    1 Teil = 0-71
    2 Teil = 72-144
    3 Teil = 144 - 216
    4 Teil = 217 - 288
    über IF anweisungen.


    oder sehr Aufwendig: (wie ich das auch hinbekommen würde)!

    (*Deklaration*)
    START_VAR : ARRAY [0..288] OF REAL
    ZIEL_VAR : ARRAY [0..71] OF REAL <-------ACHTUNG! GRÖßE geändert!

    (*Programm*)
    IF TEIL1
    THEN
    ZIEL_VAR[0] := START_VAR[0];
    ZIEL_VAR[1] := START_VAR[1];
    .
    .
    .
    ZIEL_VAR [71]:= START_VAR[71];
    END_IF


    IF TEIL2
    THEN
    ZIEL_VAR[0] := START_VAR[72];
    ZIEL_VAR[1] := START_VAR[73];
    .
    .
    .
    ZIEL_VAR [71]:= START_VAR[143];
    END_IF



    Das muss doch aber auch einfacher gehen?!
    Wenn jemand weiß wie, kann er mir gerne mal ein Beispiel hier schreiben.
    Ich möchte mein Programm nicht all zu lang machen und ich werde so eine funktion sicher noch öfter mal gebrauchen.

    Über hilfe wäre ich echt dankbar.
    LG
    Zitieren Zitieren Array berreiche kopieren  

  2. #2
    Registriert seit
    17.10.2010
    Beiträge
    22
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Das kannst du einfach über eine For Schleife realisieren:


    FOR <Startwert initialisieren>
    TO <Endwert>
    BY <Schrittweite>

    <auszuführender Teil>
    END_FOR;

    Du musst jedoch beachten, dass das Zeilarray genügend gross ist.


    Code:
    IF TEIL1 THEN
       start := 1;
       end := 71;
    ELSIF TEIL2 THEN
       start := 72;
       end := 143;
    ...
    ...
    
    END_IF;
    
    
    FOR i:= start TO end BY 1 DO
        ZIEL_VAR[i] := START_VAR[i];
    END_FOR;
    Geändert von simon86 (13.05.2011 um 23:06 Uhr)

  3. #3
    Registriert seit
    29.03.2004
    Beiträge
    5.731
    Danke
    143
    Erhielt 1.685 Danke für 1.225 Beiträge

    Standard

    Wenn deine Steuerung eine MEMCPY-Funktion unterstützt könntest du es auch so machen:
    Code:
    MEMCPY(ADR(ZIEL_VAR[0]), ADR(START_VAR[72]), 72 * SIZEOF(START_VAR[0]));
    72 * SIZEOF(START_VAR[0]) sollte hoffentlich schon zur Compile-Zeit durch eine Konstante ersetzt werden, das kann man bei Codesys leider nicht nachprüfen.

  4. #4
    Registriert seit
    13.05.2011
    Beiträge
    16
    Danke
    0
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Hallo,

    ja vielen dank! Bin auch noch auf eine Lösung gekommen ist jedoch nicht so schön ist (die ich noch nicht ausprobiert habe) aber laufen sollte, die ist aber länger und daher ist die von Simon86 meine wahl.

    MEMCPY-Funktion, da weiß ich nicht mal was das ist.
    Es ist ein WAGO 750-880 Controller.

    LG

  5. #5
    Registriert seit
    29.03.2004
    Beiträge
    5.731
    Danke
    143
    Erhielt 1.685 Danke für 1.225 Beiträge

    Standard

    Zitat Zitat von Hobby_Programmierer Beitrag anzeigen
    MEMCPY-Funktion, da weiß ich nicht mal was das ist.
    MEMory CoPY, also Speicherbereiche kopieren.
    Sollte man eigentlich nur verwenden wenn es symbolisch nicht mehr geht, weil die Funktionsparameter nur als Zeiger übergeben werden und somit keine Typprüfung möglich ist.
    Der eine Parameter ist ein Zeiger auf den Startbereich, der andere auf den Zielbereich, der dritte gibt die Anzahl der zu kopierenden Bytes an.
    Wenn deine Wago so eine Funktion nicht in irgendeiner Bibliothek mitliefert, kannst du dir diese natürlich auch mit einer Schleife à la Simon nachbauen.
    Geändert von Thomas_v2.1 (13.05.2011 um 23:59 Uhr) Grund: Typo

  6. #6
    Registriert seit
    13.05.2011
    Beiträge
    16
    Danke
    0
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Hallo,

    da mir hier super geholfen wurde, probiere ich es noch einmal.
    Folgendes:

    Ich Speichere auf einer SD-Karte eine CSV Datei,
    die ich als Array in die Datei schreibe.

    Wenn ich die Datei mit der SPS wieder öffne und in ein Array lade
    liegt diese Strucktur dahinter.
    (also 288 mal 0...287)

    TYPE: typCSV
    STRUCT
    DT_dateT;
    Parameter: ARRAY[1..3] OF INT;
    END_STRUCKT
    END_TYPE

    TYPEDATA[1] liegen dann Paramter[1] und Paramter[2] und Paramter[3]
    (*TYPEDATA weil es in der Deklaration so deklariert ist*)

    Mein problem ist nun diese Struktur in 3 verschienene ein dimensionale ARRAYs zu bekommen. Wie z.B. in:
    Wert1: ARRAY[0..287] OF INT
    Wert2: ARRAY[0..287] OF INT
    Wert3: ARRAY[0..287] OF INT

    Wenn ich das nun so aufschreibe, kommt mir gerade etwas in den sinn.
    Ist das vielleicht schon die Lösung?


    (*Deklaration*)
    Start: INT := 0;
    END: INT := 287;

    IF xxxx
    THEN
    FOR i=Start TO End BY 1 DO
    Wert1[i] :=TYPEDATA[i].Paramter[1];
    Wert2[i] :=TYPEDATA[i].Paramter[2];
    Wert2[i] := TYPEDATA[i].Paramter[3];
    END_FOR
    END_IF

    Werde ich morgen ausprobieren.
    LG und vielen Dank schon mal.

  7. #7
    Registriert seit
    19.05.2008
    Beiträge
    648
    Danke
    117
    Erhielt 136 Danke für 105 Beiträge

    Idee

    Hallo Hobby_Programmierer,

    dein gesuchter Ausdruck ist ein „ARRAY of STRUCT“
    Sieh dir mal das Programm IPC_X86.zip an und suche folgende Deklaration:
    stMessage : ARRAY[1..cMessageMax] OF ST_Message;

    Mit etwas Zeit und Interesse erklärt sich das fast selbst...

    Deine Idee mal alles als CSV auszugeben und wieder zurücklesen ist leider nicht ganz so einfach. Wenn du mit Beckhoff arbeitest, kannst du dir mal den XML Data Server ansehen.
    Selbst habe ich aber noch keine Erfahrungen damit...

    Gruß
    Chräshe

  8. #8
    Registriert seit
    13.05.2011
    Beiträge
    16
    Danke
    0
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hey,
    habe es heute morgen bereits geschafft.
    Einfach war es nicht, aber die CoDeSys hat eigentlich alle funktionen dafür.
    Trotzdem danke für die Hilfe.
    Ich nutze dafür eine Wago.

    LG

Ähnliche Themen

  1. Array kopieren
    Von gloeru im Forum CODESYS und IEC61131
    Antworten: 5
    Letzter Beitrag: 05.03.2011, 20:06
  2. Antworten: 11
    Letzter Beitrag: 18.03.2009, 22:09
  3. byte in array kopieren [AWL]
    Von vierlagig im Forum Simatic
    Antworten: 14
    Letzter Beitrag: 17.11.2008, 22:55
  4. Element aus Array kopieren
    Von guidokk im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 18.06.2008, 16:14
  5. Antworten: 0
    Letzter Beitrag: 25.04.2007, 07:50

Stichworte

Lesezeichen

Berechtigungen

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