Probleme mit Pointer TO DINT / Steuerung geht in Ausnahmezustand

SY50

Level-1
Beiträge
271
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich bekomme über ein ARRAY[1..256] OF BYTE Daten von einer Übergeordneten Steuerung zugewiesen, welche ich Variablen in meiner Steuerung zuweisen möchte.

Dies mache ich wie folgt: Ich habe mir eine Kopierfunktion erstellt, welcher ich ein Datenpointer zu dem Element übergebe, bei dem der Kopiervorgang starten soll:

Code:
// Betriebsart zuweisen
IntPointer := Datenpointer + 2;
Ansteuerung.Betriebsart := IntPointer^;

// Position zuweisen
DIntPointer := Datenpointer + 4;
Ansteuerung.Position := TO_REAL(DIntPointer^) * DezimalaufloesungPosition;

In der Kopierfunktion habe ich Einen Pointer für INT und einen für DINT Werte. diese möchte ich nun in die interne Struktur übergeben.
Bei dem Punkt, wo der DINTPointer übergeben wird, geht die Steuerung in Ausnahmezustand.
Ich habe die Adresse des DIntPointer einmal um 2 erhöht... also.... DIntPointer := Datenpointer + 6;
Dann kopiert er die Daten, aber warum ist das mit + 4 Falsch?
Kann mir da jemand helfen?
 
Ich habe eine Lösung gefunden... Also es ist wohl so, das Codesys einen POINTER TO DINT nur alle 4 Byte zulässt. Da ich in dem Bytearray allerdings irgendwo mittendrin Daten abgreifen muss funktioniert das nicht.
Ich habe mir nun so beholfen, dass ich die einzelnen 4 Byte erst einmal auf ein Zwischenwert vom TYP DINT kopiere und mit diesem weiter arbeite. Dies funktioniert einwandfrei.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
wenn's gelöst ist, dann ist's ja gut.
Ich mache das grundsätzlich nur über Pointer auf das kleinste Element. Dann muss man jedoch auch das Ziel, d.h. die zu füllende Variable, mit einem Pointer ansprechen, aber man kann damit die Daten herholen wo man will.


PROGRAM WordArray_to_Real
VAR_INPUT
pWord_Quelle: POINTER TO ARRAY[0..1] OF WORD;
p_Real_Ziel: POINTER TO ARRAY[0..1] OF WORD; (* aus Kompatiblitätsgründen wird auch der REAL-Pointer als
WORD-Pointer definiert *)
END_VAR
VAR
i:BYTE;
END_VAR
--------------------------------------------
(* Umspeichern eines Real-Wertes AUS einem WORD-Array *)
FOR i:=0 TO 1 DO
p_Real_Ziel^ := pWord_Quelle^ ; (* 2 Byte umspeichern *)
p_Real_Ziel := p_Real_Ziel+1; (* Pointer inkrementieren *)
pWord_Quelle := pWord_Quelle+1;
i:=i+1;
END_FOR

Das kann man noch intensiver und universeller ausbreiten, wenn man Pointer auf Bytes einrichtet und die Variable i als Länge des logischen Wertes mitgibt.

Aber programmieren kann man so vieles ...

Viele Grüße
THomas
 
Ja so geht das natürlich, weil du ein WORD Hast. Wenn du ein Word und danach dint hast, dann geht es grad wenn du Glück hast (und der dint pointer passt).
Wenn der DINT Pointer aber auf ein nicht DINT Speicherbereich schaut dann hast du eben Pech...

Bsp:
Adresse 0: => DINT Bereich
Adresse 2: => Kein DINT Bereich
Adresse 4: => DINT Bereich

Wenn man von ADR 2 einen DINT kopieren will, dann funktioniert das nicht.
Versuchs mal ;-)

Mach dir ein ARRAY OF BYTE und versuche mal schritt für schritt den Pointer eines DINT um ein BYTE zu erhöhen und dann den Wert zu kopieren. Wird nicht klappen
 
Zurück
Oben