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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 20

Thema: Dynamische Arrays

  1. #1
    Registriert seit
    05.01.2016
    Beiträge
    13
    Danke
    7
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    ich habe heute neu mit TwinCat 3 und Beckhoff gestartet, kenne mich aber schon etwas mit SPS aus.

    Nun bin ich gerade dabei eine Matrix multiplikation zu erstellen. Für eine Matrix nehme ich zurzeit ein Zweidimensionales Array:

    matrix1 : ARRAY[1..3,1..3] OF DINT
    matrix2 : ARRAY[1..3,1..3] OF DINT

    Nun würde ich gerne eine Funktion für die Multiplikation schreiben. Dies funktioniert auch für feste größen des Arrays (z.B: 3x3)
    Für eine dynamische größe eines Arrays müsste ich an die Funktion ein Array mit beliebiger Größe übergeben.

    FUNCTION fMultiplyMatrix : ARRAY[1..sizeArray,1..sizeArray] OF DINT
    VAR_INPUT
    A : ARRAY[1..sizeArray,1..sizeArray] OF DINT;
    B : ARRAY[1..sizeArray,1..sizeArray] OF DINT;
    END_VAR


    Dies funktioniert aber leider nicht, gibt es da eine Möglichkeit? Oder ist dies ähnlich zu C nicht wirklich möglich?

    Schöne Grüße und Danke im vorraus
    Zitieren Zitieren Dynamische Arrays  

  2. #2
    Registriert seit
    29.09.2006
    Beiträge
    368
    Danke
    0
    Erhielt 41 Danke für 38 Beiträge

    Standard

    Hallo,

    vielleicht hilft ein "new/delete" weiter?

    http://infosys.beckhoff.de/index.php...22955.html&id=

    Viele
    Grüße

  3. #3
    Registriert seit
    15.08.2011
    Beiträge
    383
    Danke
    2
    Erhielt 73 Danke für 71 Beiträge

    Standard

    Hallo Flo123,

    für die Vorgehensweise wie in deinem Beispiel beschrieben, musst du die Variablen für die Array-Grenzen als CONSTANT definieren.
    Das ist dann natürlich nicht mehr zur Laufzeit änderbar....

    Die für dich vielleicht bessere Variante ist der Vorschlag von Fx64: Verwendung von __NEW() um ein neues Array beliebiger Größe anzulegen.
    Dies funktioniert aber nur mit skalaren Typen, d.h. Du kannst kein ARRAY OF MyStruct anlegen lassen, sondern nur mit Standard-IEC Typen.
    Zurück liefert dir __NEW() einen Pointer auf die angeforderter Speicheradresse.
    Dieser Pointer kann aber wie ein "normales" Array verwendet werden.
    Alle sonst üblichen Mechanismen können also angewendet werden

    Nicht vergessen: Du musst noch die Bibliothek Tc3_MemMan einbinden.

    Gruß,
    mac203

  4. #4
    Registriert seit
    22.04.2014
    Beiträge
    27
    Danke
    2
    Erhielt 4 Danke für 4 Beiträge

    Standard

    Beitrag gelöscht
    Geändert von nl_tmp (04.04.2016 um 10:34 Uhr)

  5. #5
    Registriert seit
    15.08.2011
    Beiträge
    383
    Danke
    2
    Erhielt 73 Danke für 71 Beiträge

    Standard

    Zitat Zitat von nl_tmp Beitrag anzeigen
    die gewünschten Arrays mit variabler Länge, z.B. [*,*,*], gibt's nach Aktenalge ab CoDeSys 3.5SP8.

    Wie soll die Codesys Lösung dann aussehen? Auch wie bei Beckhoff implementiert mit NEW/DELETE ?

  6. #6
    Registriert seit
    22.04.2014
    Beiträge
    27
    Danke
    2
    Erhielt 4 Danke für 4 Beiträge

    Standard

    Beitrag gelöscht
    Geändert von nl_tmp (04.04.2016 um 10:34 Uhr)

  7. #7
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.301
    Danke
    932
    Erhielt 3.321 Danke für 2.683 Beiträge

    Standard

    Wozu sollte man NEW und DELETE brauchen, wenn man lediglich verschieden große Arrays verarbeiten will?
    Dafür braucht man "nur" eine Möglichkeit, verschieden große Arrays an eine Funktion übergeben zu können und in der Funktion die Größe zu erkennen.

    @Flo123
    Mußt Du wirklich zur Laufzeit verschieden große Arrays verarbeiten oder hast Du blos keine Lust, je Projekt einmal die (maximale) Arraygröße festzulegen? Um wieviel verschiedene Größen handelt es sich, wäre es eine Option ggf. mehrere Versionen der Funktion zu programmieren?

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  8. #8
    Registriert seit
    17.07.2009
    Ort
    Am Rande der Ostalb
    Beiträge
    5.532
    Danke
    1.152
    Erhielt 1.253 Danke für 982 Beiträge

    Standard

    Der Sinn von dynamischen (zur Laufzeit änderbaren) Arrays auf einer SPS hat sich mir noch nie erschlossen.
    Ich muss die SPS sowieso so auslegen, dass sie die größten Arrays verarbeiten kann. Also wo soll der Vorteil sein bzw. nennt mir mal einen Anwendungsfall wo es zwingend notwendig ist.

    Gruß
    Dieter

  9. #9
    Flo123 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    05.01.2016
    Beiträge
    13
    Danke
    7
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Vielen dank für die vielen und schnellen Antworten

    Zitat Zitat von mac203 Beitrag anzeigen
    Die für dich vielleicht bessere Variante ist der Vorschlag von Fx64: Verwendung von __NEW() um ein neues Array beliebiger Größe anzulegen.
    Dies funktioniert aber nur mit skalaren Typen, d.h. Du kannst kein ARRAY OF MyStruct anlegen lassen, sondern nur mit Standard-IEC Typen.
    Zurück liefert dir __NEW() einen Pointer auf die angeforderter Speicheradresse.
    Dieser Pointer kann aber wie ein "normales" Array verwendet werden.
    Alle sonst üblichen Mechanismen können also angewendet werden
    Leider bin ich mir nicht ganz sicher, ob die Funtkion __New mir etwas hilft. Ich kann ja auch mit
    A : ARRAY[0..iSize] OF DINT
    ein neues Array mit größe iSize anlegen. Mein Problem besteht darin, dass ich das Array mit variabler Größe keiner Funktion übergeben kann bzw. der Input Parameter der Funktion kann nicht A: ARRAY[0..iSize] lauten.
    Oder meint ihr ich soll den Pointer übergeben und dazu noch die größe iSize und dann damit weiter rechnen?


    VAR_IN_OUT
    A: ARRAY [*] OF INT;
    END_VAR
    DIes wäre eigentlich die perfekte Lösung. Nur leider zeigt es bei mir einen Fehler an wenn ich ein * in die Klammern setzte []. Muss ich dafür noch neue Referenzen einbinden?

    Mußt Du wirklich zur Laufzeit verschieden große Arrays verarbeiten oder hast Du blos keine Lust, je Projekt einmal die (maximale) Arraygröße festzulegen? Um wieviel verschiedene Größen handelt es sich, wäre es eine Option ggf. mehrere Versionen der Funktion zu programmieren?
    Maximale Arrayanzahl habe ich zurzeit implementiert. Habe aber gedacht, dass es vielleicht eine elegantere Lösung gibt
    Mehrere Funktionen kommen wohl eher nicht in Betracht, da es sehr viele Funktionen werden würden.

    Vielleicht habe ich mein Problem noch nicht gut genug beschrieben:
    Ich habe einen Kalman Filter erstellt um Messwerte zu fusionieren. Die Messwerte kommen von einem Laserscanner auf einem autonomen fahrzeug. Der Kalman FIlter bekommt jeden Zyklus verschiedene Positionen von Landmarken, je nachdem wo sich das Fahrzeug befindet, hat man eine unterschiedliche Anzahl an Messwerten (Landmarken).
    Wie vielleicht vom Kalman Filter bekannt, muss man nun viele Matrizen Berechnungen ausführen. Dabei ist die Größe abhängig von den Landmarken -> Matrizenberechnung immer unterschiedlich.
    Nun habe ich verschiedene Funktionen für Multiplikation, Addition, Inverse usw geschrieben.
    Das Array in denen die Landmarken sitzen ist jedoch immer unterschiedlich und wird also dynamisch an die Funktion übergeben.
    Die größe ist jedoch bei jedem Zyklus bekannt!!!

    Was ich bis jetzt versucht habe:
    1) Arraygröße auf maximal Anzahl der Landmarken setzen. (Vielleicht gibt es eine elegantere Lösung?)
    2) Mehrere Funktionen, angepasst z.B. auf (3x3 Matrix, 3x4, 4x3, 4x4 usw) -> werden aber super viele Funktionen da es bis 30x30 gehen kann

    Schöne Grüße
    Flo
    Geändert von Flo123 (07.01.2016 um 09:37 Uhr)

  10. #10
    Registriert seit
    15.08.2011
    Beiträge
    383
    Danke
    2
    Erhielt 73 Danke für 71 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Mein Problem besteht darin, dass ich das Array mit variabler Größe keiner Funktion übergeben kann bzw. der Input Parameter der Funktion kann nicht A: ARRAY[0..iSize] lauten.
    Oder meint ihr ich soll den Pointer übergeben und dazu noch die größe iSize und dann damit weiter rechnen?
    Ich mache das tatsächlich so, dass ich dann nur mit den Pointern arbeite und diese dann auch als Übergabeparameter habe.

    Nur leider zeigt es bei mir einen Fehler an wenn ich ein * in die Klammern setzte []. Muss ich dafür noch neue Referenzen einbinden?
    Kann nicht funktionieren, da (meines Wissens nach) nicht so in der IEC-61131-3 definiert.
    Die [*] - Variante ist ja der Weg, den Codesys gehen will.
    Beckhoff hat da schon seit längerem den Weg über __NEW / __DELETE eingeschlagen.

    Und um auf Blockmove nochmal einzugehen:
    Wir sind viele Jahre ohne dynamische Arrays ausgekommen. Ich finde es aber dennoch ganz praktisch.
    Ursächlich hierfür waren vermutlich die vielen Anfragen und Wünsche aus der Hochsprachenwelt.
    Warum soll man denn neue Technologien nicht verwenden?
    Wer nutzt denn heute noch Telefonzellen????

    Gruß,
    mac203

Ähnliche Themen

  1. Dynamische Modbusadressierung
    Von AB5656 im Forum CODESYS und IEC61131
    Antworten: 2
    Letzter Beitrag: 19.07.2013, 08:03
  2. Dynamische Structs? S7
    Von voluba im Forum Programmierstrategien
    Antworten: 5
    Letzter Beitrag: 05.06.2012, 20:31
  3. dynamische Arrays?
    Von merlin im Forum CODESYS und IEC61131
    Antworten: 7
    Letzter Beitrag: 30.05.2008, 16:06
  4. Dynamische Schrittkette
    Von Pau1e im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 26.03.2008, 20:09
  5. Dynamische Domain?
    Von knabi im Forum Stammtisch
    Antworten: 6
    Letzter Beitrag: 14.03.2006, 20:53

Lesezeichen

Berechtigungen

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