Anfängerfrage Merkerwort

Zuviel Werbung?
-> Hier kostenlos registrieren
das ew hat andif ja jetzt gut erklärt.

ein pointer ist folgendermassen aufgebaut(bild).
(aus der hilfe von s7)
für dich interessant sind die 3 rechten bits und die weiteren 16 links daneben.

wie du siehst, sind die 3 rechten die bitadresse. genau deswegen muss auch um 3 nach links geschoben werden um eine gewünschte zahl im pointerformat darstellen zu können.

beispiele:
L 10
SLD 3
LAR1 //im AR1 steht nun P#10.0
U E[AR1,P#0.0] //fragt e10.0 ab
L EW[AR1,P#0.0] //lädt das ew10

nun gibt es noch p#0.0. das ist der 'versatz'.
U [AR1,P#0.4] //fragt e10.4 ab

auch der versatz kann indirekt erzeugt werden.
L 10
SLD 3
LAR1 //im ar1 steht p#10.0
L 4
+AR1 //die 4 werden zum ar1 hinzuaddiert. im ar1 steht jetzt p#10.4
U E[AR1,P#0.0] //fragt e10.4 ab
L EW [AR1,P#0.0] //das würde die cpu in stop bringen, da es das ew10.4 nicht gibt. nur bei bitoperationen darf die bitadresse <>0 sein.
 

Anhänge

  • Zwischenablage01.gif
    Zwischenablage01.gif
    18,4 KB · Aufrufe: 72
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!

Wir haben das halt trotzdem noch nie gemacht, mit dem EW0 und EW1! und das da E0.3 soweit hinten steht. Wie schimpft sich denn jetzt in meinem Fall der Pointer? 2048.0 oder wie?

@Volker: dein erstes Bsp versteh ich noch, aber beim 2. hörts auf.(das da auf einmal P#10.4 steht). Aber ich will erstmal auf der einen Baustelle durchblicken & nicht schon wieder eine neue eröffnen! Dafür hab ich dann selber noch paar Bsp Fragen....

Danke!

und wie gehts jetzt weiter? Also Akku1 EW0--> wird um 3 Stellen verschoben (aber nur im Ar1 oder generell?)--> AR1 laden-->Pointer# ???--> mW100 in Akku1 und EW0 in Akku 2(verschoben oder nicht?)--> irgendwie transferieren....
 
Zuletzt bearbeitet:
@ug
im prinzip steht das schon hier in der faq. :ROFLMAO:
nur das mit der indirekten bitadresse ist dort noch nicht drin.
habe den beitrag aus der faq überarbeitet und an plc-tippser gesendet damit er das in die faq stellt.

@claudi
bevor ichs 2 mal erkläre. folgendes lesen. wenn dann noch fragen sind, erneut fragen. ;)
Also Akku1 EW0--> wird um 3 Stellen verschoben (aber nur im Ar1 oder generell?)--> AR1 laden-->Pointer# ???--> mW100 in Akku1 und EW0 in Akku 2(verschoben oder nicht?)--> irgendwie transferieren....
ew0 vor dem schieben
2#0000_1000_0000_0000 (dez 2048 )
ew0 nach dem schieben
2#0100_0000_0000_0000 (dez 16384, dieser wert steht jetzt im akku1)
mit lar1 wird nun der pointer (2048.0) im ar1 erzeugt. das hat nichts mit akku zu tun. der bleibt bei dieser anweisung unberührt.
dann wird mw100 in den akku1 geladen und akku1 (also 16384) nach akku2 verschoben.
mit T AW(AR1,P#0.0) wird nun der inhalt von akku1 (also mw100) in die durch das ar1 bezeichnete adresse kopiert
konventionell würde das so aussehen
L MW100
T AW 2048

-------------------------------------------------------------------------------------
hier der geänderte beitrag für die faq. werde folgendes durch den link zur faq ersetzen solbald plc-tippser das in der faq geändert hat.
==================================================================================
Hier ein paar Beispiele zur indirekten Adressierung / Pointer

Ein Merkerwort laden indem wir den Pointer direkt laden.
Code:
L P#30.0
T MD 10
L MW [MD 10] // lädt das mw30
Dies ist unflexibel.
-----------------------------------

Eleganter geht es, indem wir den Pointer selbst erzeugen und über das Adressregister ansprechen.
Code:
  L     30
  SLD   3
  LAR1                    // ergibt einen pointer von P#30.0 in adressregister1 
  L     MW [AR1,P#0.0]    // lädt das mw30
Schon besser. Aber warum schieben wir 3 nach links?
Das liegt am Aufbau des Pointer. vereinfacht: Byteadress(16Bit).Bitadress(3Bit). (genauerers im Bild im Anhang)
Die 30 liegt also durch das schieben in der Byteadresse. die Bitadresse ist 0.
-----------------------------------

Nun gibt es noch den Versatz (p#0.0). Dieser wird zum Pointer im Adressregister hinzuaddiert.
Code:
  L     MW [AR1,P#2.0]    // lädt das mw32 (30 + 2.0)
  U     M [AR1,P#4.4]     // fragt M 34.4 ab
Fast perfekt.
-----------------------------------

Nun wollen wir auch noch die Bitadresse fexibel gestalten.
Code:
  L     30
  SLD   3
  LAR1                    // im ar1 steht p#30.0
  L     4
  +AR1                    // die 4 wird zum ar1 hinzuaddiert. im ar1 steht jetzt p#30.4
  U     E [AR1,P#0.0]     // fragt e30.4 ab
  L     EW [AR1,P#0.0]    // das würde die cpu in stop bringen, da es das ew30.4 nicht gibt.
                          // nur bei bitoperationen darf die bitadresse <>0 sein.
-----------------------------------

Um indirekt auf ein Datenwort zugreifen zu können, ist es zwingend erforderlich den Datenbaustein vorher zu öffnen.
Code:
[COLOR=red]L db10.dbw [AR1,P#0.0]   // dies funktioniert nicht[/COLOR]
 
  AUF   DB    10
  L     DBW [AR1,P#0.0]    // so ist es richtig
-----------------------------------

Anwendungsbeispiel mit einer Schleife
Code:
FILO für Datenbyte (FirstInLastOut)
FiLo         __\ byte1 \________________
            |  /       /                |
            |    byte2 \_________    /__|3.
            |          /         |   \
            |    byte3 \__    /__|2.
            |          /  |   \
            |    byte4 /__|1.
            |          \
            |
            |
quelle    4.|__/ byte
               \
Ablauf: 
1. zielbyte  3 wird nach zielbyte 4 kopiert. das alte byte 4 geht verloren.
2. zielbyte  2 wird nach zielbyte 3 kopiert
3. zielbyte  1 wird nach zielbyte 2 kopiert
4. quellbyte 1 wird nach zielbyte 1 kopiert
Code:
      AUF   #Datenbaustein      //Typ: Block_DB
      L     #Datenende          //Typ: INT
      L     1
      -I    
      T     #index              //Typ: DINT
anf:  NOP   0                   //Schleifenanfang
      L     #index
      SLD   3                   //pointer erzeugen
      LAR1                      //in das Adressregister laden
      L     DBB [AR1,P#0.0]
      T     DBB [AR1,P#1.0]
      L     #index
      L     1
      -I                        //Index um 1 verringern
      T     #index
      L     1
      +I    
      L     #Datenanfang        //Typ: INT
      <=I                       //prüfen ob fertig
      SPB   ende                //wenn ja ende
      SPA   anf                 //sonst schleife wiederholen
ende: NOP   0
      L     #Eintrag            //Typ: BYTE
      T     DBB [AR1,P#0.0]     //neues byte eintragen
-----------------------------------

Es kann auch Adressregister2 (AR2) verwendet werden.
Aber Vorsicht:
Das DI-Register und das Adressregister AR2 werden systemseitig für den FB- und Multiinstanz-CALL verwendet. Bei FC's braucht ihr euch nicht darum zu kümmern.
 

Anhänge

  • Format_eines_Pointer.gif
    Format_eines_Pointer.gif
    18,4 KB · Aufrufe: 73
Zuletzt bearbeitet:
Hallo Volker,

Ok das hat mich wieder einen (kleinen) Schritt nachvorn gebracht!Danke!

ist da der Anfang der AWL nur dafür da, um einen Pointer zu bestimmen oder welchen Sinn hat das?Damit wurde ja hier nicht weiter gearbeitet?!

Claudia
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ist da der Anfang der AWL nur dafür da, um einen Pointer zu bestimmen oder welchen Sinn hat das?Damit wurde ja hier nicht weiter gearbeitet?!
:confused: weiss jetzt nicht genau was du meinst.

LEW 0
SLW 3 //wobei SLD 3 richtiger wäre
LAR1

diese 3 zeilen dienen einzig und allein dazu den pointer zu bilden.
(ist im prinzip das, was oben unter Pointer selbst erzeugen zu finden ist)
 
ew0 vor dem schieben
2#0000_1000_0000_0000 (dez 2048 )
ew0 nach dem schieben
2#0100_0000_0000_0000 (dez 16384, dieser wert steht jetzt im akku1)
mit lar1 wird nun der pointer (2048.0) im ar1 erzeugt. das hat nichts mit akku zu tun. der bleibt bei dieser anweisung unberührt.
dann wird mw100 in den akku1 geladen und akku1 (also 16384) nach akku2 verschoben.
mit T AW(AR1,P#0.0) wird nun der inhalt von akku1 (also mw100) in die durch das ar1 bezeichnete adresse kopiert
konventionell würde das so aussehen
L MW100
T AW 2048

Ja, volker, das meinte ich! Die zahl die dann im Akku2 ist, hat dann keine weitere Bedeutung.

Noch mal kurz zur letzten Anweisung: ums wörtlich zu bezeichnen, heißt das dann: nehme den Inhalt Akku1(MW100) und transferiere ihn auf die Adresse im AR1, die ich dir mit meinem pointer 2048.0 zeige... diese Adresse 2048.0, heißt das dann , das das MW100 an die Stelle gesetzt wird wo 2^11 ist im AR1 oder wie genau muss ich mir das vorstellen?
 
Ich vertrete mal kurz den Volker :p.

Noch mal kurz zur letzten Anweisung: ums wörtlich zu bezeichnen, heißt das dann: nehme den Inhalt Akku1(MW100) und transferiere ihn auf die Adresse im AR1, die ich dir mit meinem pointer 2048.0 zeige... diese Adresse 2048.0, heißt das dann , das das MW100 an die Stelle gesetzt wird wo 2^11 ist im AR1 oder wie genau muss ich mir das vorstellen?

Fast richtig, würde ich sagen.
Volker hat es eigentlich schon geschrieben.
Der Speicher für die Ausgänge ist linear adressiert. Man kan ihn beschreiben, indem man eine Zahl lädt und diese auf ein Ausganswort schreibt. Wenn im EW0, bit 0.3 True ist und alle anderen Bit False, dann entspricht das dezimal der Zahl 2048.

Ohne indirekte Adressierung mußt du zum Zeitpunkt des Programmierens wissen, wohin diese Zahl soll, die bei dir im MW100 steht.

Also:
L MW100
T AW 2048

Wenn du zum Zeitpunkt des Programmierens nicht weißt, wohin die Zahl im MW100 einmal soll (weil es zum Beispiel vom zu produzierenden Produkt abhängig ist), dann mußt du das indirekt adressieren.
Das Pointerformat ist also die Nummer des Ausgangswortes, um 3 bit nach links geschoben, weil die 3 Bit rechts die Bitadresse sind, damit man bei Bedarf mit einem Pointer auch auf einzelne Bits zugreifen kann, ganz einfach eigentlich.

Hoffe, alle Klarheiten beseitigt? :ROFLMAO:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So ich denke bei der Aufgabe ist das meiste geklärt! jetzt mal zu einer ähnlichen.

Und zwar sind die Eingänge 0.3,0.2,0.1 und 0.0 mit 1 belegt und der Rest ist 0. Die AWL lautet:

LEB 0
SLW1
LAR1
LMW 50
TAW (AR1,P#2.2)

So wenn ich das anordne kommt als Dezzahl 3840 raus. Jetzt schiebe ich das aber um 1. Was passiert da jetzt anderes, wg dem multuplizieren?
 
So ich denke bei der Aufgabe ist das meiste geklärt! jetzt mal zu einer ähnlichen.

Und zwar sind die Eingänge 0.3,0.2,0.1 und 0.0 mit 1 belegt und der Rest ist 0. Die AWL lautet:

LEB 0
SLW1
LAR1
LMW 50
TAW (AR1,P#2.2)

So wenn ich das anordne kommt als Dezzahl 3840 raus. Jetzt schiebe ich das aber um 1. Was passiert da jetzt anderes, wg dem multuplizieren?

:sm8:

Na, jetzt wirds ja richtig kniffelig...
 
wenn du die obige faq genau liest kennst du die lösung.
das prinzip ist das gleiche wie vorher.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So ich denke bei der Aufgabe ist das meiste geklärt! jetzt mal zu einer ähnlichen.

Und zwar sind die Eingänge 0.3,0.2,0.1 und 0.0 mit 1 belegt und der Rest ist 0. Die AWL lautet:

LEB 0 <---- ! ! ! ! !
SLW1
LAR1
LMW 50
TAW (AR1,P#2.2)

So wenn ich das anordne kommt als Dezzahl 3840 raus. Jetzt schiebe ich das aber um 1. Was passiert da jetzt anderes, wg dem multuplizieren?


Hallo Claudia,

wie kommst Du jetzt auf 3840. In der AWL steht doch jetzt LEB 0, also "Lade Eingangsbyte 0 in Akku 1".

|--------------EB0----------------|
| ...7 | ..6 | ..5 | .4 | 3 | 2 | 1 | 0 | Die Punkte bitte ignorieren !
| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |

Gruss
Andi F
 
Zuletzt bearbeitet:
Aha, da nimmt man nur das! gut wieder was gelernt! Also steht im Akku 1 jetzt 8, schiebe ich das um 1 kommt 16 in Akku 1. Kommt da jetzt als Pointer 3.6 raus? Dann das MW 50 in Akku 1 und der Wert des MW50 ins AR1 mit Zeiger 5.0? zumindest waren das meine ersten versuche, als ich die Aufgaben, vor paar Tagen gemacht hab?

bei den pointern (vorrausgesetzt meine These stimmt) müsste man ja 3.6 + 2.2 machen. Da es aber ja nur bis x.7 geht wird das mit Überhang gemacht?!

011.110
+
010.010
_________
101.000 = 5.0
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok da hab ich schief geschaut! Zu dem Übertrag hab ich gleich mal ne Frage!

1+1 = 2 --> 10 dual, ergibt 0 Übertrag 1
1+1+1 = 3 ->11 dual, ergibt 1 Übertrag 1? Das hatten wir nie in unseren beispielen, deswegen ist das jetzt geraten!

Was bringt diese pointeraddition für einen Sinn?
 
@volker

Stimmt, sogar das Oktalsystem hat einen Übertrag :ROFLMAO:.

@Claudi

Du hast eine Datenbank, jedes Produkt belegt darin 100 Byte für Daten. Je nach Produkt ist die Anfangsadresse der Datenbank variabel, von der Anfangsadresse an stehen die einzelnen Daten immer am selben Platz. Also errechnest du den Pointer zum Anfang des Produktes, auf den Rest kannst du dann über Pointeraddition ganz prima zugreifen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hmmm, so richtig fehlt mir die Vorstellung. Mal kurz zurück zu der Aufgabe! Stimmt das jetzt, das der Pointer 3.6 entsteht? und das MW50 an das AW kopiert wird, wo der Pointer 6.0 hinzeigt?

Kann ich kurz ne Zwischenfrage stellen? und zwar sollten wir die hexzahl 3F als BCD zahl laden! So und der Ladebefehl ist ja L C# xxx mit dem Wertebereich 0-999 (unsere Arbeitsunterlagen). Wie soll der Ladebfehl dann aussehen?

Wir hatten ein anderes Bsp, da hieß es LC#200 -> daraushaben wir dual Zahl gemacht. 0010 0000 0000 und das war dann die Dezzahl 512. Wenn ich nach dem gleichen Prinzip wie hier geh, müsste das für oben, dann LC#3F sein ?! Aber das glaub ich nicht.....
 
eigentlich hat ralle das doch ausreichend erklärt
im ar1 steht p#3.6. der versatz ist p#2.2
-->p#3.6 + p#2.2 = p#5.8
da es 8 im oktalsystem nicht gibt erfolgt ein übertrag => p#6.0

bei dez. 9 + 1 = 10
bei hex. f + 1 = 10

klar ?!

mw50 wird also nach aw6 transferiert.

2.
L w#16#3f
 
Zuletzt bearbeitet:
Mir hat aber keiner bestätigt, ob meine theorie stimmt, sorry! Und dass das ein Oktalsystem ist hör ich auch das erste mal. Wir haben das mit dual erklärt bekommen, also : 1+1 = 10 (dez = 2) Und 1+1+1 = 11 und ich addiere doch auch Dualzahlen und keine Oktalzahlen.?!
Das die Eingänge nur bis .7 gehen, hab ich wahrgenommen, aber nicht gewusst warum.

Für mich ist dieses Thema einfach nur schrecklich, weil sämtliche Grundlagen fehlen & ich mit bits & bytes einfach nichts anfangen kann.

zu 2.: es soll doch eine BCD Zahl geladen werden. und jetzt wurde doch eine Hexzahl geladen!

Wir sollen das umwandeln und mit LC# xxx darstellen! nicht mit LW#xx

W ist doch das zeichen für hex oder nicht?
 
Zurück
Oben