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

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

Thema: Variable Adressierung CoDeSys

  1. #1
    Registriert seit
    19.10.2010
    Beiträge
    325
    Danke
    15
    Erhielt 36 Danke für 31 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Guten abend zusammen,

    Ich zerbreche mir gerade den Kopf darüber wie ich mir einen Move Baustein für unterschiedliche Arrays bauen kann. Also das ich beim Aufruf von außen am besten den Namen der Struktur angebe und evtl die Länge und ich dann diesen Baustein für alle möglichen Typen von arrays nehmen kann. Gibt's da eine Möglichkeit oder ist das nicht möglich und ich brauche für jeden Typ einen eigenen Baustein?

    Also quasi in der Deklaration pt: Pointer to array [0..5] of (Variable)

    Hoffe ich konnte mich halbwegs verständlich ausdrücken.
    Zitieren Zitieren Variable Adressierung CoDeSys  

  2. #2
    Registriert seit
    24.02.2009
    Beiträge
    1.242
    Danke
    23
    Erhielt 276 Danke für 235 Beiträge

    Standard

    Gibt es in CodeSys kein MEMMOVE oder MEMCPY ?

  3. #3
    SPS-freak1 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    19.10.2010
    Beiträge
    325
    Danke
    15
    Erhielt 36 Danke für 31 Beiträge

    Standard

    Das kann ich dir leider nicht sagen, ich bräuchte im Endeffekt den any pointer aus der s7 Welt. Mit CoDeSys bin ich nicht so bewandert

  4. #4
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    745
    Danke
    27
    Erhielt 164 Danke für 142 Beiträge

    Standard

    CoDeSys prüft bei der Zuweisung von Pointern nicht deren Typ, Du kannst also z. B. einen "Pointer to Byte" einsetzen. Macht natürlich die Angabe der Bytegrösse der Variablen, auf die der Zeiger zeigt, unumgänglich.

  5. #5
    SPS-freak1 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    19.10.2010
    Beiträge
    325
    Danke
    15
    Erhielt 36 Danke für 31 Beiträge

    Standard

    Ok aber das Problem das ich habe ist, dass ich verschiedene arrays mit unterschiedlichen Längen habe und mir sich noch nicht ganz erschließt wie ich die Länge heraus bekomme. Der Datentyp besteht aus Bits und Int Variablen

  6. #6
    Registriert seit
    30.08.2005
    Beiträge
    280
    Danke
    41
    Erhielt 96 Danke für 66 Beiträge

    Standard

    Also irgendwoher muss die Länge kommen, sonst funktioniert das nicht.
    Der Pointer weiss nicht auf was er zeigt. Also die Länge muss deiner Funktion übergeben werden.
    Am einfachsten machst du das dann so:

    memmove(ADR(var), SIZEOF(var), ...)
    Bernhard Werner
    3S-Smart Software Solutions (CODESYS)

  7. #7
    SPS-freak1 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    19.10.2010
    Beiträge
    325
    Danke
    15
    Erhielt 36 Danke für 31 Beiträge

    Standard

    Ok das ich die Länge auslesen lassen kann weiß ich. Dachte ich muss das per Hand eintragen. Dieser memmove Befehl hat mir gefehlt

  8. #8
    Registriert seit
    30.08.2005
    Beiträge
    280
    Danke
    41
    Erhielt 96 Danke für 66 Beiträge

    Standard

    Nein, den memmove gibt es nicht, den musst du dann schon selber implementieren.
    Übrigens kannst du zwei Arrays gleicher Länge auch einfach mit := zuweisen.

    FUNCTION MemMove : BOOL
    VAR_INPUT
    pSource : POINTER TO BYTE;
    pDest : POINTER TO BYTE;
    size : DINT;
    END_VAR
    VAR
    i : DINT;
    END_VAR

    FOR i := 0 TO size - 1 DO

    pDest[i] := pSource[i]; // V3 Schreibweise
    (pDest + i)^ := (pSource + i)^; // V2.3 Schreibweise


    END_FOR
    Bernhard Werner
    3S-Smart Software Solutions (CODESYS)

  9. #9
    Registriert seit
    24.02.2009
    Beiträge
    1.242
    Danke
    23
    Erhielt 276 Danke für 235 Beiträge

    Standard

    Du bekommst die Größe eines Arrays mit SIZEOF(arr) heraus. SIZEOF gibt dir Größe in Bytes an.
    Code:
    arr1: Array[0..9] of Int;
    arr2: Array[0..9] of Bool;
    size := SIZEOF(arr1); (*size = 20   [10*2 Bytes]*)
    size := SIZEOF(arr2); (*size = 20   [10*1 Byte]*)
    EDIT:
    Da war der Werner schneller und ausführlicher .....

  10. #10
    Registriert seit
    13.12.2011
    Beiträge
    1.413
    Danke
    147
    Erhielt 160 Danke für 151 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    @Werner29: Da muss ich Dir widersprechen, mag ja sein, dass diese Funktion bei der CoDeSys-Version von 3S nicht existiert, aber manch ein Steuerungshersteller (z.B. ELAU/Schneider und ABB meine ich auch) hat verschiedene Speicherfunktionen in deren CoDeSys basierten Entwicklungsumgebung implementiert, unter anderem auch MemMove.

Ähnliche Themen

  1. Codesys und Wago 750 (HW Adressierung)
    Von Waelder im Forum WAGO
    Antworten: 6
    Letzter Beitrag: 05.09.2014, 01:13
  2. Variable Adressierung CoDeSys
    Von SPS-freak1 im Forum CODESYS und IEC61131
    Antworten: 0
    Letzter Beitrag: 24.07.2014, 20:00
  3. Adressierung mit Variable und Inhalt
    Von marlik83 im Forum CODESYS und IEC61131
    Antworten: 2
    Letzter Beitrag: 04.07.2014, 09:08
  4. Antworten: 16
    Letzter Beitrag: 03.07.2014, 00:39
  5. Variable Adressierung
    Von Anonymous im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 16.10.2003, 18:59

Lesezeichen

Berechtigungen

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