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

Ergebnis 1 bis 4 von 4

Thema: Probleme mit Pointer TO DINT / Steuerung geht in Ausnahmezustand

  1. #1
    Registriert seit
    04.02.2013
    Beiträge
    271
    Danke
    12
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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?
    Zitieren Zitieren Probleme mit Pointer TO DINT / Steuerung geht in Ausnahmezustand  

  2. #2
    SY50 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    04.02.2013
    Beiträge
    271
    Danke
    12
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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.

  3. #3
    Registriert seit
    04.10.2015
    Beiträge
    3
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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

  4. #4
    SY50 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    04.02.2013
    Beiträge
    271
    Danke
    12
    Erhielt 0 Danke für 0 Beiträge

    Standard


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

Ähnliche Themen

  1. Antworten: 5
    Letzter Beitrag: 25.11.2015, 11:47
  2. Step 7 Probleme mit Any Pointer
    Von D.Fricke im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 21.03.2014, 08:56
  3. Probleme mit zweiter Steuerung im PC Worxs Projekt
    Von Vektorhektor im Forum PHOENIX CONTACT
    Antworten: 2
    Letzter Beitrag: 26.11.2013, 18:46
  4. Antworten: 25
    Letzter Beitrag: 02.01.2013, 22:57
  5. Float Wert to Dword und dann zu DINT geht das?
    Von mcmatthew im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 11.12.2009, 16:50

Lesezeichen

Berechtigungen

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