Hilfe, ich begreif die pointer nicht

drmicha

Level-2
Beiträge
15
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe mir mehrmals die Beispiele zur Verwendung der Pointer angesehen. Entweder bin ich zu blöd oder übersehe was ganz einfaches.
Ich habe einen FB in dessen Instanzdatenbaustein in einem struct bei zs1.d1 ein Doppelwort mit 32 Zuständen gespeichert ist. Die einzelnen bits müsste ich in einen Globaldatenbaustein jeweils auf das bit 0 von 32 aufeinanderfolgenden bytes transportieren. Dann müsste ich das zs.d2 des IDB jeweils auf das bit 1 der 32 aufeinanderfolgenden bytes des GDB bringen usw. Das wird der Koppel- DB für die Visualisierung. Egal was ich probiere, ich bekomme nur Syntaxfehler. Ich müsste 32 mal die Bits einzeln auslesen und mit 8 Bit oder 1 Byte Abstand wieder abspeichern, das ist mir klar, aber wie ist die exakte Syntax?
Gruss Micha
 
Welche Art von pointern meist DU.

16 Bit Pointer(wahrscheinlich nicht)

32 Bit pointer Speicherindirekt ohne Bereichsübergreifung ?

32 Bit pointer Registerindirekt mit Bereichsübergreifung ?
 
Vielleicht einfach mal deinen bisherigen Programm-Code hier einstellen und ggf. auf die Stellen hinweisen, bei denen es bei dir hakt - dann bekommen wir das sicher hin ... :)

Gruß
LL
 
Nachtrag

Also da muss ich wohl etwas weiter ausholen. Ich bin kein ausgebildeter Programmierer und kenne SPSen und NCUse nur aus der Instandhaltersicht bei der Fehlersuche. Nun soll ich meinen Horizont erweitern und mich mit Programmieraufgaben befassen.:confused:

Welche Art von pointern meist DU.

16 Bit Pointer(wahrscheinlich nicht)

32 Bit pointer Speicherindirekt ohne Bereichsübergreifung ?

32 Bit pointer Registerindirekt mit Bereichsübergreifung ?

Wenn ich meine Fragestellung richtig beurteile, wahrscheinlich den letzten:confused:

Hast du schon in den FAQ nachgesehen?

Das meinte ich mit den Beispielen, die ich (noch) nicht begreife.

Vielleicht einfach mal deinen bisherigen Programm-Code hier einstellen und ggf. auf die Stellen hinweisen, bei denen es bei dir hakt - dann bekommen wir das sicher hin ... :)

Gruß
LL
Also: Quelldaten kommen aus dem Instanzdatenbaustein DB19, dort liegen sie als mehrere Doppelwörter. Das erste DW liegt auf 190.0. Die Daten müssen in DB40, ab Byte 0 bis Byte 31 in nullte Bit. Das nächste DW liegt bei 194.0 im DB19, die Daten müssen in DB 40, Byte 0 bis 31 ins Bit 1 usw.
Ich tippere das mal so ein, das PG steht in der Firma.
L 190 ; erstes Doppelwort in der Quelle
SLD 3
TAR1
L 0 ;erste Byteadresse im Ziel
SLD 3
TAR2
L 32
sc01: T #schleife ; Sprungmarke, Schleifenmerker in stat, integer
Auf DB19 ; ist das nötig, wenn ich das im FB19 programmiere?
u DIX [AR1, P#0.0] ; ist das richtig auch im DW?
Auf DB 40
= DBX [AR2, P#0.0]
L P#0.1 ; ein Bit erhöhen?
+AR1
L P#1.0 ; ein Byte erhöhen?
+AR2
L #schleife
loop sc01

Das dann für das nächste Doppelwort in der Quelle wiederholen mit geänderten Adressen.
Wie in der Eingangsmail schon geschrieben, habe ich wahrscheinlich irgendetwas Grundlegendes zu Pointer(n) nicht verstanden.
Gruß Micha
 
Zuviel Werbung?
-> Hier kostenlos registrieren
In was für einer Bausteintyp arbeitest du ?
Das AR1 Register wird Bei FC Aufrufen vom System benutzt.
Das AR1 Register wird Bei FC Aufrufen,für die Übergabe von Datentypen >4byte,verwendet.
Das AR2 Register wird Bei FB Aufrufen vom System benutzt.
Das AR2 Register enthält den Adressoffset für die Multiinstanzfahigkeit.
Beim Zugriff auf Statische Daten innerhalb eines FB benutzt das System
ebenfalls AR2.
 
hi,

imho brauchst du zwei verschachtelte Schleifen um das zu realisieren.

1. Schleife: Doppelwörter laden
2. Schleife: Bits schreiben

Das ganze sieht mir auf den ersten Blick ziemlich zusammengeschustert aus.

Micha
 
Hallo,
ich bleibe mal bei deinem Code ... weiterentwickeln kann man den später ...
Code:
L 190 ; erstes Doppelwort in der Quelle
SLD 3
[B][COLOR=red]LAR1[/COLOR][/B]  
L 0 ;erste Byteadresse im Ziel
SLD 3
[COLOR=red][B]LAR2[/B][/COLOR]
L 32
sc01: T #schleife ; Sprungmarke, Schleifenmerker in stat, integer
 
Auf DB19[COLOR=red][B] // ist nötig, da du von DB19 nach DB40 kopieren willst[/B][/COLOR]
u DIX [AR1, P#0.0][COLOR=red][B] //[/B][/COLOR] ist das richtig auch im DW?  [COLOR=red][B]ich verstehe die Frage hier nicht[/B][/COLOR]
Auf DB 40
= DBX [AR2, P#0.0]
L P#0.1 // ein Bit erhöhen?
+AR1
L P#1.0 // ein Byte erhöhen?
+AR2
L #schleife
loop sc01
[COLOR=red][B]// das Erhöhen der Pointer hängt mit deiner Zielsetzung zusammen. In diesem Code würdest du die fortlaufenden Bits der Quelle jeweils in das Bit 2^0 der fortlaufenden Bytes des Ziels schreiben ...[/B][/COLOR]
to be continued ...
 
Hallo,
ich bleibe mal bei deinem Code ... weiterentwickeln kann man den später ...
Code:
L 190 ; erstes Doppelwort in der Quelle
SLD 3
[B][COLOR=red]LAR1[/COLOR][/B]  
L 0 ;erste Byteadresse im Ziel
SLD 3
[COLOR=red][B]LAR2[/B][/COLOR]
L 32
sc01: T #schleife ; Sprungmarke, Schleifenmerker in stat, integer
 
Auf DB19[COLOR=red][B] // ist nötig, da du von DB19 nach DB40 kopieren willst[/B][/COLOR]
u DIX [AR1, P#0.0][COLOR=red][B] //[/B][/COLOR] ist das richtig auch im DW?  [COLOR=red][B]ich verstehe die Frage hier nicht[/B][/COLOR]
Auf DB 40
= DBX [AR2, P#0.0]
L P#0.1 // ein Bit erhöhen?
+AR1
L P#1.0 // ein Byte erhöhen?
+AR2
L #schleife
loop sc01
[COLOR=red][B]// das Erhöhen der Pointer hängt mit deiner Zielsetzung zusammen. In diesem Code würdest du die fortlaufenden Bits der Quelle jeweils in das Bit 2^0 der fortlaufenden Bytes des Ziels schreiben ...[/B][/COLOR]
to be continued ...

Es muss doch...
u DBX [AR1, P#0.0]
und nicht
u DIX [AR1, P#0.0]
heißen.
 
Also ich würde da eine separate FC nehmen und Quelle / Ziel sauber als Zeiger übergeben.

Code:
FUNCTION FC 1 : VOID
TITLE =Aus Bit wird Byte
VERSION : 0.1
 
VAR_INPUT
  Quelle : ANY ; 
  Ziel : ANY ; 
END_VAR
VAR_TEMP
  DB_Q : WORD ; 
  DB_Z : WORD ; 
  Anzahl : INT ; 
  HW_Anzahl : INT ; 
END_VAR
BEGIN
NETWORK
TITLE =Aus Bit wird Byte
      L     P##Quelle;        // Quelle lesen
      LAR1  ; 
      L     W [AR1,P#4.0];    // DB aus der Quelle lesen
      T     #DB_Q; 
      L     W [AR1,P#2.0];    // Anzahl der Bytes aus der Quelle lesen
      SLW   3; // mal 8 Bits
      T     #HW_Anzahl; 
      L     D [AR1,P#6.0];    // Startwert lesen
      L     DW#16#7FFFF;      // Bereichskennung ausblenden
      UD    ; 
      LAR1  ; 
 
      L     P##Ziel;          // dto mit Ziel
      LAR2  ; 
      L     W [AR2,P#4.0]; 
      T     #DB_Z; 
      L     D [AR2,P#6.0]; 
      L     DW#16#7FFFF; 
      UD    ; 
      LAR2  ; 
 
      L     #HW_Anzahl; 
Anf:  T     #Anzahl; 
      AUF   DB [#DB_Q];       // Quell DB öffnen
      U     DBX [AR1,P#0.0];  // Wenn Bit = True
      AUF   DB [#DB_Z];       // Ziel DB öffnen
      =     DBX [AR2,P#0.0];  // dann Bit 0 in Byte setzen
      +AR1  P#0.1;            // Bitadresse der Quelle erhöhen
      +AR2  P#1.0;            // Byteadresse des Ziels erhöhen
      L     #Anzahl; 
      LOOP  Anf;              // Schleifenzähler
END_FUNCTION
 
Zuviel Werbung?
-> Hier kostenlos registrieren
schon viel weiter

Hallo und guten Nachmittag

In was für einer Bausteintyp arbeitest du ?
FB, IDB, GDB

Sorry ich hatte nur das Kernproblem beschrieben, dass ich die Adressregister anfangs retten und später zurückschreiben muss, weiss ich;)

hi,

Das ganze sieht mir auf den ersten Blick ziemlich zusammengeschustert aus.
Micha

Mir auch, deshalb frage ich ja hier:)

Hallo,
ich bleibe mal bei deinem Code ... weiterentwickeln kann man den später ...
Code:
Auf DB19[COLOR=red][B] // ist nötig, da du von DB19 nach DB40 kopieren willst[/B][/COLOR] 1)
u DIX [AR1, P#0.0][COLOR=red][B] //[/B][/COLOR] ist das richtig auch im DW?  [COLOR=red][B]ich verstehe die Frage hier nicht[/B][/COLOR] 2)
[COLOR=red][B]// das Erhöhen der Pointer hängt mit deiner Zielsetzung zusammen. In diesem Code würdest du die fortlaufenden Bits der Quelle jeweils in das Bit 2^0 der fortlaufenden Bytes des Ziels schreiben ...[/B][/COLOR] 3)
to be continued ...

1) Ich bin im FB19, der DB19 ist der InstanzDB dazu
2) Ich war mir nicht sicher, ob innerhalb eines Doppelworts die Bitadresse so angesprochen wird.
3) Nu genau, das wolld isch doch;)
Aber da war doch noch was mit AR2 sichern/wiederherstellen. :ROFLMAO:
Ja, siehe oben.

Es muss doch...
u DBX [AR1, P#0.0]
und nicht
u DIX [AR1, P#0.0]
heißen.
Der eine ist aber doch der Instanzdatenbaustein von dem anderen, das passt schon.

Also, ich danke Euch allen, ich bin jetzt soweit, dass die Daten aus dem Doppelwort ausgelesen und Byteweise in die Bits eingetragen werden. Ich muss nur noch die Zuordnung entsprechend anpassen, weil die Bits von rechts nach links hochzählen, die Bytes aber bei Doppelwort- Operationen von links nach rechts aufsteigend übertragen werden. Also aus B#16#122448FF wird 214284FF, aber das kriege ich einfach durch die Zuordnung zur Visualisierung hin, ohne noch irgendwelche Tausch- oder Rotieroperationen zu bemühen.
Ihr könnt Euch nächste Woche auf Fragen zu Wincc flexible freuen, natürlich in der richtigen Abteilung des Forums:)
Gruß Micha
 
32 Bit Pointer

wie ist die Bitstruktur bei einem 32 Bit Pointer?

ich habe die Struktur für den 6 bytepointer gefunden,
Byte 0/1 Db nummer oder Leer
Byte 2/3 Speicherbereich und ein Teil der Byteadresse
Byte 4/5 Byte und Bitadresse

ist in einem 32 Bit Pointer die Db Nummer weggelassen?

Thomas
 
wie ist die Bitstruktur bei einem 32 Bit Pointer?

ich habe die Struktur für den 6 bytepointer gefunden,
Byte 0/1 Db nummer oder Leer
Byte 2/3 Speicherbereich und ein Teil der Byteadresse
Byte 4/5 Byte und Bitadresse

ist in einem 32 Bit Pointer die Db Nummer weggelassen?

Thomas
Hallo,
dieser Pointer übergibt nur den Bit-Adressen-Offset relativ zu dem von dir gewählten Speicherbereich (E, A , M etc.).
Weitere Info's dazu gibt auch die Step7-Hilfe z.B. unter "indirekte Adressierung".

Gruß
LL
 
Zurück
Oben