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

Ergebnis 1 bis 9 von 9

Thema: Pointer verändern

  1. #1
    Registriert seit
    21.02.2010
    Beiträge
    23
    Danke
    3
    Erhielt 4 Danke für 3 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,
    ich bin blutiger CodeSys-Anfänger und kämpfe mit folgendem Problem:
    Ich habe einen DINT-Wert auf den ich mit einem POINTER TO WORD zeige um das erste wort dieses Wertes zu lesen. Das funktioniert soweit.
    Wie aber muss ich den Pointer verändern um auf das zweite Wort zu zeigen? Wenn ich diesen Pointer um 1 erhöhe sollte dieser doch auf das zweite Wort zeigen, da der Pointer doch Wort-gross ist - oder liege ich da falsch?
    Code:
    pt:POINTER TO WORD;
    wert:DINT;
    wort1:WORD;
    wort2:WORD;
     
    pt := ADR(wert);
    wort1:= pt^;
    (* was muss da hin? *)
    wort2:= pt^;
    Gruss und Danke
    Zitieren Zitieren Pointer verändern  

  2. #2
    Registriert seit
    06.07.2007
    Beiträge
    2.811
    Danke
    174
    Erhielt 274 Danke für 253 Beiträge

    Standard

    Ich bin mir nicht sicher, aber versuchs mal wie folgt:

    Code:
    pt := pt + SIZEOF(WORD);
    A programmer is just a tool which converts caffeine into code.

  3. Folgender Benutzer sagt Danke zu Cerberus für den nützlichen Beitrag:

    Schnicker (04.03.2010)

  4. #3
    Registriert seit
    16.11.2007
    Beiträge
    179
    Danke
    11
    Erhielt 53 Danke für 39 Beiträge

    Standard

    Versuchs mal so:


    Code:
     pt :=( ADR(wert)+2);
    mfG Jan

  5. Folgender Benutzer sagt Danke zu Mr.Spok für den nützlichen Beitrag:

    Schnicker (04.03.2010)

  6. #4
    Schnicker ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    21.02.2010
    Beiträge
    23
    Danke
    3
    Erhielt 4 Danke für 3 Beiträge

    Standard

    Dankeschön erstmal!
    Ich habs jetzt so gemacht:
    Code:
    pt := pt + SIZEOF(wort1);
    ...wie Mr.Spok vorgeschlagen funktioniert aber auch!
    Geändert von Schnicker (04.03.2010 um 12:34 Uhr)

  7. #5
    Registriert seit
    09.11.2007
    Ort
    Rhein Main (Darmstadt)
    Beiträge
    663
    Danke
    61
    Erhielt 112 Danke für 80 Beiträge

    Beitrag

    Die IEC Norm definiert Pointer aber keine Arithmetik dazu.

    Wenn Pointer also nicht als const gesehen werden, ist jede Manipulation abhängig von der Implementation.

    In den mir bekannten CoDeSys Implementationen ist die Bedeutung der Incrementation um 1 identisch mit der Erhöhung um eine Byte Adresse. Das ist somit identisch mit der Sprache PLM von Intel. Das ist aber nicht garantiert und könnte sich sogar in einer neuen Version ändern, wenn man z.B. irgendwann mal bei schnellen 32 Implementationen immer 4 Byte weise zugreift.

    Deshalb Prüfungen bei Anlauf des PRG einbauen, Z.B. ein Array von 2 Items anlegen und den Abstand zwischen den Pointern auf diese Items auswerten.

    Immer funktioniert das Prüfen eines Pointers auf NULL und das ist auch der Hauptgrund, wieso es in der Norm Pointer gibt.

    In C und Verwandten ist die Erhöhung um 1 identisch mit der Erhöhung um Sizeof Itemtyp, der bei der Declaration des Pointer angegeben wurde.

    In C# geht man den sicheren Weg, Pointer sind nicht total tabu, werden aber ausdrücklich als unsave behandelt. Man verwendet Referenzen, was man in CoDeSys mit INOUT Datentypen vergleichen könnte.
    Als Freelancer immer auf der Suche nach interessanten Projekten.
    Zitieren Zitieren Pointer  

  8. #6
    Registriert seit
    29.03.2004
    Beiträge
    5.797
    Danke
    144
    Erhielt 1.707 Danke für 1.239 Beiträge

    Standard

    Zitat Zitat von RobiHerb Beitrag anzeigen
    Die IEC Norm definiert Pointer aber keine Arithmetik dazu.

    Wenn Pointer also nicht als const gesehen werden, ist jede Manipulation abhängig von der Implementation.

    In den mir bekannten CoDeSys Implementationen ist die Bedeutung der Incrementation um 1 identisch mit der Erhöhung um eine Byte Adresse. Das ist somit identisch mit der Sprache PLM von Intel. Das ist aber nicht garantiert und könnte sich sogar in einer neuen Version ändern, wenn man z.B. irgendwann mal bei schnellen 32 Implementationen immer 4 Byte weise zugreift.

    Deshalb Prüfungen bei Anlauf des PRG einbauen, Z.B. ein Array von 2 Items anlegen und den Abstand zwischen den Pointern auf diese Items auswerten.

    Immer funktioniert das Prüfen eines Pointers auf NULL und das ist auch der Hauptgrund, wieso es in der Norm Pointer gibt.

    In C und Verwandten ist die Erhöhung um 1 identisch mit der Erhöhung um Sizeof Itemtyp, der bei der Declaration des Pointer angegeben wurde.

    In C# geht man den sicheren Weg, Pointer sind nicht total tabu, werden aber ausdrücklich als unsave behandelt. Man verwendet Referenzen, was man in CoDeSys mit INOUT Datentypen vergleichen könnte.
    Zumindest die TwinCAT Hilfe sagt dazu:
    Bitte beachten: Ein Pointer wird byte-weise hochgezählt! Über die Anweisung p=p+SIZEOF(p^); kann ein Hochzählen wie im C-Compiler erreicht werden.

    Achtung:
    Wenn Online Change angewendet wird, können sich Inhalte von Adressen verschieben. Beachten Sie dies bei der Verwendung von Pointern auf Adressen.
    In C sieht ein Inkrementieren mit einem ptr++ schöner aus, denn der Compiler kennt eh den Typ auf den der Pointer zeigt und weiß um wieviele Bytes er den Zeiger weitersetzen muss.

    Dass so etwas in einer Norm nicht festgelegt wurde ist nicht so schön, denn dann wären solche Bausteine wieder nur Platformabhängig. In der Oscat-Lib habe ich aber auch schon etwas mit Pointerarithmetik gesehen, und das läuft zumindest nicht nur unter Codesys. Siemens SCL muss man wieder außenvor lassen, denn da gibt es keine Pointer sondern nur die AT-Sicht.

    Gibt es die komplette Norm 61131 eigentlich irgendwo zu Download?

  9. #7
    Registriert seit
    25.07.2007
    Beiträge
    79
    Danke
    2
    Erhielt 12 Danke für 12 Beiträge

    Standard

    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    Gibt es die komplette Norm 61131 eigentlich irgendwo zu Download?
    Guckst du http://www.iec-normen.de/shop/produc...tikelnr=210408

  10. #8
    Registriert seit
    09.11.2007
    Ort
    Rhein Main (Darmstadt)
    Beiträge
    663
    Danke
    61
    Erhielt 112 Danke für 80 Beiträge

    Daumen runter

    Es ist schon sonderbar in unseren Zeiten, wo es Wiki und alles direkt im Net gibt, dass diese Norm von seinen Hütern mit einer "Schutzgebühr" von über 190 Euro der breiten Öffentlichkeit vorenthalten wird.
    Als Freelancer immer auf der Suche nach interessanten Projekten.
    Zitieren Zitieren IEC Norm  

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

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von RobiHerb Beitrag anzeigen
    In den mir bekannten CoDeSys Implementationen ist die Bedeutung der Incrementation um 1 identisch mit der Erhöhung um eine Byte Adresse. Das ist somit identisch mit der Sprache PLM von Intel. Das ist aber nicht garantiert und könnte sich sogar in einer neuen Version ändern, wenn man z.B. irgendwann mal bei schnellen 32 Implementationen immer 4 Byte weise zugreift.
    Ja, schön wäre es, wenn wir sowas noch ändern könnten. Nein, dieses Verhalten wurde (leider) sogar in die V3 Welt gerettet. Was in V3 aber geht, ist der Zugriff mit Index auf einen Pointer:
    p[12]. Dieser Zugriff funktioniert dann genauso wie man es von C her kennt und ist identisch zu folgendem Code
    (p + 12*SIZEOF(basistyp))^

    Pointer sind in der 1131 im übrigen überhaupt nicht vorgesehen.

Ähnliche Themen

  1. Multiplexvariable Index verändern
    Von Bensen83 im Forum HMI
    Antworten: 7
    Letzter Beitrag: 26.03.2011, 23:02
  2. Override verändern bei S120
    Von zloyduh im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 11.11.2010, 17:43
  3. Linie mit VBScript verändern
    Von McLac im Forum HMI
    Antworten: 5
    Letzter Beitrag: 29.07.2009, 14:41
  4. Im DB Anfangswerte verändern
    Von LSOLO im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 20.07.2006, 10:11
  5. E/A- Adressen verändern
    Von JensPipka im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 12.05.2004, 20:56

Lesezeichen

Berechtigungen

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