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

Adresse vordefinieren

grauerwolf
2018-07-12
2018-10-20
  • grauerwolf - 2018-07-12

    Hallo,
    Man hat ja ab und zu mehrere Arrays, die Daten enthalten und zu gegebener Zeit als File weggeschrieben werden sollen.
    Um dies nicht für jedes Array extra codieren zu müssen, möchte ich die zugehörigen Parameter in einem Array definieren.
    Dafür vermisse ich die Möglichkeit eine Array-Adresse "indirekt" mit einem Namen im Programm zu bestimmen.

    TYPE Struct_Filetransfer :
    STRUCT                  
            Filename : STRING;
       ARRAY_Name:  STRING;
       Adresse_Array: POINTER TO ARRAY[0..1] OF BYTE; // hier soll die Adresse vom zugehörigen ARRAY stehen.
    END_STRUCT
    VAR
      my_array: ARRAY[1..10] of Struct_Filetransfer := [
                    (Filename:='File1',Array_Name:='Array_1',   << und hier ??? >>    ) ,
                    (Filename:='File2',Array_Name:='Array_2',   << und hier ??? >>    ) ,
              ...
              ... ] ;
    end_var
    ...
    ...
    Auch zur Laufzeit kann ich nicht erkennen, wie ich mit dem Array-Namen  die Adresse bestimmen kann:
    my_array[1].Adresse_Array := ADR(my_array[1].Array_Name);   // ist ja definitiv falsch
    

    Gibt's da in Codesys (3) eine Lösung ??

     

    Related

    Talk.ru: 1

  • Stefan2 - 2018-07-26

    Hallo,

    willst du im Array die Adresse des Arrays sichern?

    Grüße

     
  • grauerwolf - 2018-10-03

    Uups, hat meine Antwort lange gedauert. War aber zwischendurch mal verhindert.

    Zitat:
    willst du im Array die Adresse des Arrays sichern?

    Ich möchte mal mein Codebeispiel vielleicht "sprechender" gestalten:

    TYPE Struct_Filetransfer :
    STRUCT                  
       Filename : STRING;        // kompletter lokaler Filenamen. In dieses File will ich das Array speichern
       ARRAY_Name:  STRING;  // dient nur der Info
       Adresse_Array: POINTER TO ARRAY[0..1] OF BYTE; // hier soll die Adresse von EINEM Daten-ARRAY stehen.
    END_STRUCT
    VAR
      Datensammel_Array_1: ARRAY[1..10] of WORD;  // hier drin liegen gesammelte Daten
      Datensammel_Array_1: ARRAY[1..100] of Byte;  // und hier noch andere Daten
      // und nachfolgend will ich die Datemsammlungen definieren und die Arrays einem Filenamen zuordnen
      my_array: ARRAY[1..10] of Struct_Filetransfer := [
                    (Filename:='File1',Array_Name:='Datensammel_Array_1',   << und hier ??? >>    ) ,
                    (Filename:='File2',Array_Name:='Datensammel_Array_2',   << und hier ??? >>    ) ,
              ...
              ... ] ;
    end_var
    

    Diese Zuordnung "Datenarray" zu "File" habe ich bisher immer händisch programmiert. Ich möchte aber eine Prozedur oder Funktion bauen, die es mir erlaubt, in einem Programm nur "my_array" zu definieren und schon werden die Datenarrays gespeichert (da gehört noch dazu, wann so ein Datenarray voll ist usw.).

    Das Problem ist, das sowas nicht zulässig ist:
    ...
    Filename:='File2',Array_Name:='Datensammel_Array_2', ADR( Datensammel_Array_2));
    ...

    Da andere Programmiersprachen solche von mir gewünschten Konstrukte ab und zu beherrschen, kann es durchaus sein, das es eine Lösung gibt - ich sie aber nicht finde.

    Grüße

     
  • Stefan2 - 2018-10-04

    Hallo Wolf,

    doch, das geht, du musst dein struct ändern

    TYPE filetransfer :
    STRUCT
    Filename : STRING;        // kompletter lokaler Filenamen. In dieses File will ich das Array speichern
       ARRAY_Name:  STRING;  // dient nur der Info
       Adresse_Array: POINTER TO BYTE; // hier soll die Adresse von EINEM Daten-ARRAY stehen.
    END_STRUCT
    END_TYPE
    

    Pointer to Byte kann auch die Adresse eines Arrays aufnehmen und der indexoperator darauf ist zulässig:

    VAR
       test:ARRAY[0..10]OF BYTE;
       test1:ARRAY[0..10]OF BYTE;
       testp:POINTER TO BYTE:=ADR(test);
       byte1:BYTE;
       
       my_array: ARRAY[0..10] OF filetransfer := [
                    (Filename:='File1',Array_Name:='Datensammel_Array_1', Adresse_Array:=ADR(test)   ) ,
                    (Filename:='File2',Array_Name:='Datensammel_Array_2',    Adresse_Array:=ADR(test)   )] ;
    END_VAR
    byte1:= my_array[0].Adresse_Array[0];
    

    Du solltest nur noch die länge des arrays mit in deiner strucktur ablegen.

    TYPE filetransfer :
    STRUCT
    Filename : STRING;        // kompletter lokaler Filenamen. In dieses File will ich das Array speichern
       ARRAY_Name:  STRING;  // dient nur der Info
       Adresse_Array: POINTER TO BYTE; // hier soll die Adresse von EINEM Daten-ARRAY stehen.
       array_size:UDINT;
    END_STRUCT
    END_TYPE
    VAR
       test:ARRAY[0..10]OF BYTE;
       test1:ARRAY[0..10]OF WORD;
       testp:POINTER TO BYTE:=ADR(test);
       byte1:BYTE;
       
       my_array: ARRAY[0..10] OF filetransfer := [
                    (Filename:='File1',Array_Name:='Datensammel_Array_1', Adresse_Array:=ADR(test) ,array_size := SIZEOF(test)  ) ,
                    (Filename:='File2',Array_Name:='Datensammel_Array_2',    Adresse_Array:=ADR(test) ,array_size := SIZEOF(test1)    )] ;
    END_VAR
    

    Dann macht es richtig Spaß...

    Grüße Stefan

     
  • grauerwolf - 2018-10-05

    Hallo Stefan,

    Zitat:
    Dann macht es richtig Spaß...

    wie sich doch die Ansichten gleichen.
    Muss ich sofort ausprobieren ...

    Vielen Dank
    Thomas

     
  • Stefan2 - 2018-10-05

    Hallo Wolf,

    Erfolg?

    Grüße Stefan

     
  • grauerwolf - 2018-10-20

    Hallo Stefan,

    ERFOLG!!!
    es funktioniert.

    Zitat:
    filetransfer_uebung: ARRAY[1..10] OF Struct_Filetransfer :=
    (lfd:=1, save_now:=FALSE, restore_now:= FALSE,array_adresse:= ADR(sender_array) )
    ;

    geht, und es steht auch die richtige Pointeradresse in "array_adresse".

    Ich muss mich allerdings jetzt fragen, was denn vormals nicht funktioniert hat, denn

    Zitat:
    ...
    Filename:='File2',Array_Name:='Datensammel_Array_2', ADR( Datensammel_Array_2);
    ...

    ist nichts anderes. Ich werde wohl wieder an einem falschen Komma oder einer Klammer zuviel gescheitert sein. Wahrscheinlich lag es an der fehlenden Zuordnung zur Pointervariable vor "ADR(Datensammel_Array_2)".

    Aber dafür habe ich ja Kollegen hier im Forum, die das besser erkennen als ich...

    Danke und viele Grüße

     

Log in to post a comment.