Adresse an Pointer übergeben

schuld

Level-1
Beiträge
39
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

ich habe folgendes Problem:
ich habe ein Hochregallager mit welchem über 2 Zaehler (x- und Y-Richtung) die Position ermittelt wird vor welchem Fach er sich befindet.
Zudem habe ich ein UDT angelegt in dem die Informationen zu den jeweiligen Bausteinen hinterlegt werden.

Die Position habe ich ermittelt und ich lege es in der Statischen Variable "Fach_aktuell" ab.
Das UDT habe ich ebenfalls in dem FB implementiert (brauche ich das überhaupt?!)

Ich habe nun Probleme die adresse an den Zeiger zu übergeben und auf den Inhalt des UDT's zuzugreifen.

ich habe es folgendermaßen Versucht:
Code:
      L     #Fach_aktuell
      DEC   1
      L     P#0.0
      +R    
      LAR1
und zwar entspricht das erste Element im UDT dem Fach1 (also der adresse 0.0)
Deshalt dekrementiere ich die Variable "Fach_aktuell" und addiere es zur adresse hinzu.

Ist das überhaupt so realisierbar und wie kann ich dann die Elemente des UDT's ansprechen?!
 
Hallo,
wenn du Pointer verrechnest, so ist deine Rechen-Operation +D nicht +R
wenn du aus einem INT-Wert heraus einen Pointer bilden willst. so mußt du daraus eine Bit-Adresse machen (der Pointer adressiert nämlich im Bit-Bereich). Also muß nach deinem DEC 1 ein SLD 3 kommen (also x 8 ). Damit würdest du dann eine Byte-Adresse ansprechen. Einen Offset p#0.0 brauchst du nicht addieren (weil Wert +0 bleibt Wert).

Für weitere Hilfestellung bräuchte ich ein paar mehr Info's ...

Gruß
Larry
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Dein Code addiert Bit-Adressen, Du müßtest aber je Fach den Pointer um die Länge der zugehörigen Datenstruktur erhöhen.
Ungefähr so: Pointer = (#Fach_aktuell - 1) * Länge_eines_Facheintrags * 8) + Anfangsadresse_erster_Facheintrag

* 8 macht man mit SLD 3

Kannst Du Deinen UDT mal herzeigen?
Ist Dein UDT ein ARRAY OF STRUCT (jedes Fach ein Struct) oder ein ARRAY OF BYTE (jedes Fach ein Byte)?

Harald
 
Hi Larry Laffer,

im Anhang mal der Komplette Code!
Mit dem Code ermittle ich die Position des Faches. Das funktioniert soweit.
Insgesamt habe ich 4 Reihen á 5 Fächer also insgesamt 20 Fächer.
Steht der Greifer nun vor dem Fach1 dann beinhaltet die Variable "#Fach_aktuell" den Wert 1.

Dann habe ich ein ein UDT das 20 Integervariablen enthält (für jedes Fach eine Variable)

sooo ... also wenn ich nun eine "1" bekomme von "#Fach_aktuell" dann soll sich der Pointer auf Fach1 stellen
Bei einer 16 soll analog dazu die 16te Variable angesprochen werden.

... also wie gesagt ich häng genau an der letzten stelle.

Gruss Schuld
 

Anhänge

Zuletzt bearbeitet:
dann wäre dein Code :
Code:
 L     #Fach_aktuell
 DEC   1
 SLW 4   //entsprich x16 wegen Wort-Adressierung
 L p#UDT_Variable  // wenn der UDT in deinem Baustein (FC oder FB) direkt deklariert ist
 +D
 LAR1
 L W [ar1,p#0.0]
Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Larry Laffer,

also wenn ich das so realisiere wie du mir vorgeschlagen hast dann bekomm ich folgendes Bild (siehe Anhang)
Mein UDT habe ich als statische Variable deklariert und Faecher genannt.


Da steht aber eine riesen Zahl drin!! :P muss das so sein?!?
Und was muss ich nun machen damit ich zB eine 2 in die Variable zu schreiben auf die der Zeiger zeigt?!


Danke schon mal für eure Hilfen und Mühen!
Schuld
 

Anhänge

  • AWL-Code.JPG
    AWL-Code.JPG
    136 KB · Aufrufe: 30
Zuletzt bearbeitet:
@Verpolt: :confused: doch wohl eher 32 Bits ...

Da steht aber eine riesen Zahl drin!! :P muss das so sein?!?
Die riesen Zahl ist nicht der Inhalt sondern der Adress-Pointer auf die Speicherstelle ...

Und was muss ich nun machen damit ich zB eine 2 in die Variable zu schreiben auf die der Zeiger zeigt?!
Das heißt, du möchtest in das gewählte Fach den Wert 2 hineinschreiben ?
Wenn ja, dann den pointer bilden, wie schon geschehen und dann wie folgt verfahren :
Code:
L 2
T W [ar1,p#0.0]
gruß
Larry
 
... also ich habe das soweit implementiert. Nur bei der überprüfung habe ich probleme.
Wie kann ich nachschauen ob auch das tatsächliche im UDT steht?! ... ich kann meinen UDT nicht auf beobachten schalten.

ich habe meinen utd ja auch in dem FB als statischer BEreich deklariert (Faecher). wie kann ich dort schauen ob es funktioniert?

danke und Grüße
Schuld
 
JOP ... das ist soweit klar aber da tut sich nichts.
Und im FB wo ich den AWL-Code hinterlegt habe ändert sich auch nichts an den Statischen Variablen.

Meine Frage ist also immer noch die gleichige! :(

Ich habe meinen Code nun um Folgendes erweitert:

Code:
      L     #Fach_aktuell
      DEC   1
      SLW   4                           
      L     P##Faecher                
      +D    
      LAR1  
      L     W [AR1,P#0.0]
    
     //bis hier hin war es ja nur die Adresse zuweisen richtig?!

      L     23
      T     W [AR1,P#0.0]
ich mache also im ersten Schritt die Adresszuweisung und im 2ten Abschnitt will ich am aktuellen Fach die Zahl 23 reinschreiben.

Ich habe ein DB100 in dem ich ein Array [0..0] angelegt habe der auf den UDT verweisst.
es soll also Beispielsweise wenn man vor dem Fach 3 steht dort in die 3te Variable eine 23 reingeschrieben werden!! :(

Um jede Hilfe wäre ich sehr dankbar!!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Larry
Weshalb "SLW 4"?
Es ist gleichgültig ob Byte oder Wortzugriff es ist immer "SLW 3".
Na ... dann rechne mal nach ...
wenn der TE mit dem Index 1 das DBW 0 adressieren möchte und mit dem Index 1 das DBW2 und mit dem Index 2 das DBW4 etc. - wie kommst du dann mit deinem SLW3 dahin ? danach noch mal ein SLW oder ein x2 ? Dann kanst du es auch gleich zusammen fassen. Wie schon geschrieben Wort-Adresse - nicht Byte-Adresse ...

Hmm....
Dann ist in der FAQ wohl Nachholbedarf :confused:
Nicht wirklich ... da der Datentyp POINTER ja noch die Adresse eines möglichen DB's enthält - der hier verwendete Adress-Pointer aber nicht.
Du hast also Recht und auch wieder nicht. das AR-Register hat nur eine Größe von 32 Bit (also DWORD).

@TE:
Du schreibst aktuell deine Werte in die im STAT-Bereich deines FB's deklarierte variable Faecher. Da spricht auch nichts dagegen. Wenn du das nun kontrollieren willst dann mußt du dort schauen, wo Faecher dann landet - im Instanz-DB deines FB. Dort taucht der deklarierte UDT bzw. dessen Inhalt und Deklaration dann wieder (im Klartext) auf. Hier kannst du dann auch den Inhalt beobachten.

Gruß
Larry
 
Zurück
Oben