Variable Adressierung CoDeSys

SPS-freak1

Level-2
Beiträge
415
Reaktionspunkte
63
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.
 
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.
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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), ...)
 
Ok das ich die Länge auslesen lassen kann weiß ich. Dachte ich muss das per Hand eintragen. Dieser memmove Befehl hat mir gefehlt
 
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 := pSource; // V3 Schreibweise
(pDest + i)^ := (pSource + i)^; // V2.3 Schreibweise


END_FOR
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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 .....
 
@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.
 
@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.

CodeSys liefert diese Funktion nicht von Hause aus mit. Was andere Hersteller an Zusatz-Bibliotheken anbieten hat nichts damit zu tun.
Es hat keiner gesagt, dass MemMove, MemCpy etc. in CodeSys technisch nicht möglich sind (es sind ja nur einige einfache Pointer-Operationen). Man muss sie aber entweder selber programmieren oder von Drittanbietern importieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
CodeSys liefert diese Funktion nicht von Hause aus mit. Was andere Hersteller an Zusatz-Bibliotheken anbieten hat nichts damit zu tun.
Es hat keiner gesagt, dass MemMove, MemCpy etc. in CodeSys technisch nicht möglich sind (es sind ja nur einige einfache Pointer-Operationen). Man muss sie aber entweder selber programmieren oder von Drittanbietern importieren.

Das mag stimmen (obwohl gibt es die SysLibMem nicht auch im unangepassten 3S CoDeSys), aber, bitte korrigiere mich falls ich da falsch liege, wer setzt ein CoDeSys direkt von 3S ein? Man hat doch eigentlich immer ein CoDeSys, dass vom jeweiligen Steuerungshersteller mehr oder minder angepasst wurde und da gibt es bei mehreren Herstellern diese Funktionalität.
 
Zuletzt bearbeitet:
Zurück
Oben