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
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.
TYPEStruct_Filetransfer:STRUCT                Filename:STRING;  ARRAY_Name: STRING;  Adresse_Array:POINTERTOARRAY[0..1]OFBYTE;//hiersolldieAdressevomzugehörigenARRAYstehen.END_STRUCTVAR my_array:ARRAY[1..10]ofStruct_Filetransfer:=[        (Filename:='File1',Array_Name:='Array_1',  <<undhier???>>  ),        (Filename:='File2',Array_Name:='Array_2',  <<undhier???>>  ),     ...     ...];end_var......AuchzurLaufzeitkannichnichterkennen,wieichmitdemArray-Namen dieAdressebestimmenkann:my_array[1].Adresse_Array:=ADR(my_array[1].Array_Name);  //istjadefinitivfalsch
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:
TYPEStruct_Filetransfer:STRUCT           Filename:STRING;    //kompletterlokalerFilenamen.IndiesesFilewillichdasArrayspeichern  ARRAY_Name: STRING; //dientnurderInfo  Adresse_Array:POINTERTOARRAY[0..1]OFBYTE;//hiersolldieAdressevonEINEMDaten-ARRAYstehen.END_STRUCTVAR Datensammel_Array_1:ARRAY[1..10]ofWORD; //hierdrinliegengesammelteDaten Datensammel_Array_1:ARRAY[1..100]ofByte; //undhiernochandereDaten //undnachfolgendwillichdieDatemsammlungendefinierenunddieArrayseinemFilenamenzuordnen my_array:ARRAY[1..10]ofStruct_Filetransfer:=[        (Filename:='File1',Array_Name:='Datensammel_Array_1',  <<undhier???>>  ),        (Filename:='File2',Array_Name:='Datensammel_Array_2',  <<undhier???>>  ),     ...     ...];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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
TYPEfiletransfer:STRUCTFilename:STRING;    //kompletterlokalerFilenamen.IndiesesFilewillichdasArrayspeichern  ARRAY_Name: STRING; //dientnurderInfo  Adresse_Array:POINTERTOBYTE;//hiersolldieAdressevonEINEMDaten-ARRAYstehen.END_STRUCTEND_TYPE
Pointer to Byte kann auch die Adresse eines Arrays aufnehmen und der indexoperator darauf ist zulässig:
VAR  test:ARRAY[0..10]OFBYTE;  test1:ARRAY[0..10]OFBYTE;  testp:POINTERTOBYTE:=ADR(test);  byte1:BYTE;    my_array:ARRAY[0..10]OFfiletransfer:=[        (Filename:='File1',Array_Name:='Datensammel_Array_1',Adresse_Array:=ADR(test)  ),        (Filename:='File2',Array_Name:='Datensammel_Array_2',  Adresse_Array:=ADR(test)  )];END_VARbyte1:=my_array[0].Adresse_Array[0];
Du solltest nur noch die länge des arrays mit in deiner strucktur ablegen.
TYPEfiletransfer:STRUCTFilename:STRING;    //kompletterlokalerFilenamen.IndiesesFilewillichdasArrayspeichern  ARRAY_Name: STRING; //dientnurderInfo  Adresse_Array:POINTERTOBYTE;//hiersolldieAdressevonEINEMDaten-ARRAYstehen.  array_size:UDINT;END_STRUCTEND_TYPEVAR  test:ARRAY[0..10]OFBYTE;  test1:ARRAY[0..10]OFWORD;  testp:POINTERTOBYTE:=ADR(test);  byte1:BYTE;    my_array:ARRAY[0..10]OFfiletransfer:=[        (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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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.
Gibt's da in Codesys (3) eine Lösung ??
Related
Talk.ru: 1
Hallo,
willst du im Array die Adresse des Arrays sichern?
Grüße
Uups, hat meine Antwort lange gedauert. War aber zwischendurch mal verhindert.
Ich möchte mal mein Codebeispiel vielleicht "sprechender" gestalten:
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
Hallo Wolf,
doch, das geht, du musst dein struct ändern
Pointer to Byte kann auch die Adresse eines Arrays aufnehmen und der indexoperator darauf ist zulässig:
Du solltest nur noch die länge des arrays mit in deiner strucktur ablegen.
Dann macht es richtig Spaß...
Grüße Stefan
Hallo Stefan,
wie sich doch die Ansichten gleichen.
Muss ich sofort ausprobieren ...
Vielen Dank
Thomas
Hallo Wolf,
Erfolg?
Grüße Stefan
Hallo Stefan,
ERFOLG!!!
es funktioniert.
geht, und es steht auch die richtige Pointeradresse in "array_adresse".
Ich muss mich allerdings jetzt fragen, was denn vormals nicht funktioniert hat, denn
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