Doppelwort auf Out Parameter Typ Arry of bit

mkd

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

mich hat eine sogenannte Denkblokade erwischt :confused:

Folgende Ausgangsposition:

Ich habe einen DB in dem in einem Doppelwort einzelne Daten im Bitformat abgelegt sind.
Jetzt möchte ich in einem FB ein out Parameter als Array of Bool (0..31) anlegen und die Daten aus dem Doppelwort hinein kopieren.

Erster Ansatz war folgender:

Code:
L DBxx.DBDxx //Bit Daten im Doppelwort
TAD //drehen
T #tempDoppelwort //Lokale Variable an Adresse L0.0

U L 0.0
= #OutArray[0]

U L 0.1
= #OutArray[1]

U L 0.2
= #OutArray[2]

//usw.


Funktioniert, gefällt aber nicht wirklich bei 32 Bits :cry:

Kann ich das out Array nicht irgendwie indirekt adressieren wie:

Code:
LAR 1 P##OutArry

L  DBxx.DBDxx //Bit Daten im Doppelwort
T D[AR1,P#0.0]



Oder ist das totaler Stuss? Ich bin leider nicht so fit was die Programmierung mit indirekter Adressierung angeht und würde mich freuen wenn mir jemand auf die Sprünge helfen kann.



Gruß
Daniel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

da habe ich mich gleich mal bedankt ;)

Also, folgendes funktioniert

Code:
LAR1  P##OutArray

L     #tempDoppelwort
TAD   
T     D [AR1,P#0.0]
das auch
Code:
LAR1  P##OutArray
 LAR2 P##tempDoppelwort

L     D [AR2,P#0.0]
TAD   
T     D [AR1,P#0.0]
In meinem Fall nutze ich dann Variante 1, auch wenn ich nicht wirklich verstehe warum ich mit TAD die Reihenfolge der Akkus tauschen muss damit Bit 0 im Doppelwort auch Index0 [0] im Array ist :confused::confused::confused:

In einem anderen FAQ Beitrag habe ich gelesen, dass man nicht ohne weiteres AR2 in einem FB nutzen darf. Was hat das auf sich und wie kann ich trotzdem AR2 ohne Probleme nutzen?

und wech...
 
In meinem Fall nutze ich dann Variante 1, auch wenn ich nicht wirklich verstehe warum ich mit TAD die Reihenfolge der Akkus tauschen muss damit Bit 0 im Doppelwort auch Index0 [0] im Array ist :confused::confused::confused:
hast du schon mal was von BIG und LITTLE ENDIAN gehört??
Stichwort:Bytereihenfolge
Hier zum Nachlesen:http://de.wikipedia.org/wiki/Little_Endian

In einem anderen FAQ Beitrag habe ich gelesen, dass man nicht ohne weiteres AR2 in einem FB nutzen darf. Was hat das auf sich und wie kann ich trotzdem AR2 ohne Probleme nutzen?

Wenn du einen Multiinstanzfähigen FB hast dann mußt du bei indirekter Adressierung den Offset von AR2 dazuzählen, da der FB das AR2 benutzt.
Ausserdem immer wenn man die Adressregister verbiegt,

Code:
am anfang
 
TAR1 #AR1save
TAR1 #AR2save
 
Programm
 
und am ende 
LAR1 #AR1save
LAR2 #AR2save
damit der nachstehende Baustein wieder ein sauberes AR zur Verfügung hat.
 
Hi,

o.k. also sind die Daten im Doppelwort wohl als Big Endian gespeichert und das Array ist entsprechend als Little Enday aufgebaut.

Die Begrifflichkeiten kannte ich nicht, sehr wohl aber das Problem durch "try and error" Tests. Sonst hätte ich ja kein
Code:
TAD
eingefügt :cool:

Das Sichern der AR´s vor indirekter Adressierung und zurückschreiben danach habe ich, dank des Forums, bis jetzt zur "Sicherheit" immer angewendet.

Wenn du einen Multiinstanzfähigen FB hast dann mußt du bei indirekter Adressierung den Offset von AR2 dazuzählen, da der FB das AR2 benutzt.

Kannst du das evt. näher erläutern? Wie groß und warum Offset?



Gruß
Daniel
 
Beste Variante:
Code:
LAR1  P##OutArray

L     #tempDoppelwort
TAD   
T     D [AR1,P#0.0]

AR1 muss in der Regel nicht gesichert werden (solange man keinen eigenen Code hat, der davon abhängt). AR2 würde ich sichern, damit die Verwendbarkeit der Funktion nicht eingeschränkt wird.

Welche TAD/TAW/... Variation nötig ist, zeigt sich am besten durch Online-Beobachten.
 
Zurück
Oben