Adresse von Struct in TEMP ermitteln

cosmomaster

Level-2
Beiträge
72
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe Probleme beim ermitteln der Adresse einer Temporären Variable vom Typ Struct.

Warum wird nicht eine Adresse von 32 ermittelt?
Bitte schaut euch das Bild an.
 

Anhänge

  • Adresse von struct in TEMP.JPG
    Adresse von struct in TEMP.JPG
    79,8 KB · Aufrufe: 104
Hallo,

Sind das nicht die vorherigen Loaldaten des aufrufenden Bausteins?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
er lädt doch die 32, nur wird sie dir nicht im adressregister angezeigt, weil du die adresse nicht dahin, sondern in den akku1 lädst...
L -> akku1
LAR1 -> adressregister 1
 
Und warum nicht so?

Code:
[FONT=Courier New]     L    P##cmd_Mod
     SRW  3
     T    #BASE.ADR_INT
[/FONT]

Du arbeitest sinnloserweise mit dem Adressregister
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Adressregister,Pointer...Bitte um Hilfe!!!

Hallo zusammen,
wer kann mir erklären was das alles bedeutet?
AUF #DB_dat
LAR1 P#0.0
L DBW [AR1,P#0.0]
SLD 3
T #ErrorWord
U DBX [AR1,P#2.0]
= #reset
Warum muss man DBW im AR um 3 bits nach links schieben und dann ins AKKU1 laden?

 
Warum muss man DBW im AR um 3 bits nach links schieben und dann ins AKKU1 laden?


genau kann dir das nur der programmierer sagen.

eine mögliche theorie:
im DB_dat.DBW0 steht eine nummer, die den fehler repräsentiert.
zu dem fehler gehört ein anderes datenbausteinfeld (<= word) in dem irgendwas zu dem fehler steht, eine beschaltung der warnlampen oder eine eindeutige fehler-id oder was weiß ich.
mit dem laden der fehlernummer und dem schieben um 3 nach links wird die fehlernummer gleich zur byte-adresse des "anderen datenbausteinfelds", so dass in der folgenden bearbeitung nur noch ein LAR1 #ErrorWord notwendig ist um einen pointer auf dieses feld zu adressieren.
 
genau kann dir das nur der programmierer sagen.

eine mögliche theorie:
im DB_dat.DBW0 steht eine nummer, die den fehler repräsentiert.
zu dem fehler gehört ein anderes datenbausteinfeld (<= word) in dem irgendwas zu dem fehler steht, eine beschaltung der warnlampen oder eine eindeutige fehler-id oder was weiß ich.
mit dem laden der fehlernummer und dem schieben um 3 nach links wird die fehlernummer gleich zur byte-adresse des "anderen datenbausteinfelds", so dass in der folgenden bearbeitung nur noch ein LAR1 #ErrorWord notwendig ist um einen pointer auf dieses feld zu adressieren.
Hallo 4L,

für diese Antwort ein Danke von mir, da sie jetzt wirklich mal klar und deutlich formuliert ist. :D
Hätte ich es nicht gewusst, hätte ich es nun kapiert. ;)

Deine zweideutigen, nichtssagenden Antworten wie, "lies doch selber" haben mir noch nie gefallen. :|

Und mittlerweile ist es ja auch so, wenn wir dem TE nicht ziemlich schnell mit kurzen klaren Sätzen geholfen haben,
kommt sogleich Harald mit seinem ausführlichen Bericht. ;)
@Harald, ich hoffe Du liest da jetzt meine Achtung und keine Kritik raus. :cool:
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Deine zweideutigen, nichtssagenden Antworten wie, "lies doch selber" haben mir noch nie gefallen. :|

lies doch selber hab ich noch nie geschrieben... höchstens einen link zum entsprechenden handbuch mit einem verweis auf die stelle da ... aber auch nur, wenn es da eindeutig beschrieben steht...

aber hat ja jeder seinen eigenen selektiven filter :rolleyes:
 
Hallo vierlagig,
vielen dank für deine Antwort.
So wie ich jetzt verstehe mit dem Befehl
AUF #DB_dat
LAR1 P#0.0

erzeuge ich eine Pointerkonstante P#0.0 für DB_dat.
Mit dem Befehl
L DBW [AR1,P#0.0]
erzeuge ich die Grösse des Pointers und die Byteadresse im DB_dat.
Mit dem "magischen " Befehl
SLD 3
erzeuge ich platz für die Bitadresse des Ponters
Ist es richtig?
Danke im voraus
 
erzeuge ich eine Pointerkonstante P#0.0 für DB_dat.
Mit dem Befehl
L DBW [AR1,P#0.0]
erzeuge ich die Grösse des Pointers und die Byteadresse im DB_dat.
Mit dem "magischen " Befehl
SLD 3
erzeuge ich platz für die Bitadresse des Ponters
Ist es richtig?

Wenn du schon eine Pointer hast, was willst du mit dem Schieben noch erreichen?

Du könntest dir und uns helfen, wenn du schreibst was du mit dem Programmcodeschnipsel willst.
Was willst du programmieren und wie willst du dieses Ziel erreichen?

Sorry, kann nicht mehr helfen, meine Glaskugel ist in Reparatur.


bike
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Bike,

der mit
L DBW [AR1,P#0.0]
geladene Wert ist wohl eine DBW-Nr., auf die später zugegriffen werden soll.

Mit
SLD 3
wir ein weiterer Pointer erzeugt, der dann mit
T #ErrorWord
für nachfolgende Bearbeitung zur Verfügung stehen soll...

Gruss
 
Na, nochmal etwas ausführlicher:

AUF #DB_dat //schlägt den DB auf

LAR1 P#0.0 //lädt einen leeren Pointer auf das Ziel Byte 0 und Bit 0 in das Adressregister 1

//Lädt ein Datenwort aus dem aufgeschlagenen Datenbaustein, das mit dem leeren Pointer P#0.0 und
//dem angegebenen Offset (weiterer "Pointer" P#0.0) adressiert ist
L DBW [AR1,P#0.0]

//Der geladene Wert befindet sich jetzt nun im Akku und ist wohl eine DBW-Nr., die später benötigt wird

SLD 3 //der geladene Wert wird zum Pointerformat "umfunktioniert" (Bitadresse freischieben)
T #ErrorWord //der umfunktionierte Wert wird transferiert und steht hier für weitere Zugriffe bereit

U DBX [AR1,P#2.0] //weiss ich nicht...
= #reset

....
und dann vermutlich so:

AUF DB_WasWeissIch //DB aufmachen
LAR1 #ErrorWord //umfunktionierten Pointer ins AR1 laden
L DBW [AR1,P#0.0] //benötigten Wert holen

Na, hoffentlich richtig zu so später Stunde !
Das Bett ruft schon...

Grüsse
 
Na, ich hab' nun auch mal meine Glaskugel befragt. Meine spekuliert so:
Code:
//Es gibt einen/mehrere DB mit etwa dieser Struktur direkt am Anfang des DB:
// 0.0  Auftrag : STRUCT
// +0.0  ErrorNummer : INT
// +2.0  CMD_Reset : Bool
// ...
// =?.0 END_STRUCT

AUF #DB_dat
LAR1 P#0.0         //Lade die Anfangsadresse der Struktur "Auftrag" in AR1

L DBW [AR1,P#0.0]  //Lese [#DB_dat].Auftrag.ErrorNummer
SLD 3              //multipliziere mit 8 (oder mache daraus einen Byte-Pointer?)
T #ErrorWord       //Ergebnis merken in der lokalen Variable #ErrorWord (Word?!)

U DBX [AR1,P#2.0]  //Lese [#DB_dat].Auftrag.CMD_Reset
= #reset           //und merken in der lokalen Variable #reset
ErrorNummer könnte ein Index auf eine Tabelle mit 8-Bit-Einträgen oder auf ein Byte-Array sein. Es kann aber auch sein, daß das SLD 3 garnichts mit einem Pointer zu tun hat und der Wert aus anderen Gründen mit 8 multipliziert wird.
Die Struktur könnte beispielsweise eine Message / ein Kommando aus einer Visu sein, wo die Nummer eines Objektes drinsteht und ein Bit(feld?), was mit diesem Objekt gemacht werden soll. Oder die Antwort auf eine Anfrage, ob eine bestimmte ErrorNummer schon quittiert wurde. Oder ...

Da die Struktur direkt am Anfang des DB liegt (ab DBB0), kann man den Code auch wie folgend schreiben. (Das AR1 wurde möglicherweise nur deshalb benutzt, um den Anfang der Struktur irgendwie symbolisch zu adressieren oder um bei einer späteren Adressverschiebung der Struktur nur eine Zeile im Programm anpassen zu müssen.)
Code:
AUF #DB_dat
L DBW 0
SLD 3
T #ErrorWord

U DBX 2.0
= #reset

Eine weitere Theorie zum Sinn dieses Codes hat vierlagig schon in #10 gebracht.
Ich sage ebenfalls:
genau kann dir das nur der programmierer sagen.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
und dann vermutlich so:

AUF DB_WasWeissIch //DB aufmachen
LAR1 #ErrorWord //umfunktionierten Pointer ins AR1 laden
L DBW [AR1,P#0.0] //benötigten Wert holen
Wenn ErrorWord ein Pointer sein sollte, dann vermutlich eher so:
Code:
AUF DB_WasWeissIch //DB aufmachen
LAR1 #ErrorWord    //umfunktionierten Pointer ins AR1 laden
L [COLOR="Red"]DBB[/COLOR] [AR1,P#0.0]  //benötigten Wert holen

Harald
 
Hallo zusammen,
herzlichen dank für die ausführliche und sehr kostbare Antworten!
Wenn ich den zweite Netzwerk betrachte dann meiner Meinung nach mit dem Befehl SLD 3 wird der Platz für die Bit Adresse des Pointers erzeugt.In einem bestimmten Fall
Formalparameter #ErrorWord=100(dezimal)
L #Adr
ITD
SLD 3
T #Adr_temp

AUF #DB_dat
LAR1 #Adr_temp

U #ResetErrors
= DBX [AR1,P#0.0]

U #ErrorMustQuit
= DBX [AR1,P#0.1]

U #ErrorActive
= DBX [AR1,P#0.3]

L #ErrorMask
T DBW [AR1,P#4.0]

L MW [#ErrorWord]
T DBW [AR1,P#2.0]

UC "ErrorV1"
L DBW [AR1,P#2.0]
T MW [#ErrorWord]

U DBX [AR1,P#0.4]
= #ErrorBit

DB_dat ist ein globaler Datenbaustein für einnen bestimmten Fall: DB250
Er sieht so etwa aus

0.0 STRUCT
+0.0 error_header_general "TErrorV1_header"
+16.0 error STRUCT
+0.0 Em_Stop "TErrorV1"
+6.0 Em_Stop_InputLeft "TErrorV1"
+12.0 Em_Stop_InputRight "TErrorV1"
+18.0 Em_Stop_OutpLeft "TErrorV1"
usw......
END_STRUCT
DB_WasWeißiCH existiert nicht in dem fall anstatt ihn- MW100.
Ist das richtig ?
Danke im Voraus





 
Zurück
Oben