Zugriff auf DWORD in FB

hank12

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

Habe in einem FB unter den EIngangsvariablen IN mehrere Boolsche Parameter definiert: Die Adressen die vergeben sind:
52.0
52.1
52.2
..
52.7

Möchte nun in einem Netzwerk in dem FB selber auf das ganze Wort zugreifen?

???
L DBW52
???

Ist das korrekt?
 
nein!

wenn du so unsauber zugreifen willst, dann DIW [edit] DIB wenn es nur das byte ist -> siehe dazu auch sps-killa [/edit]

aber schöner wäre hier ein ARRAY[0..7] of BOOL oder ein struct

gibts ne FAQ zu ;)
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
hallo,

du musst in deinem beispiel ein Byte laden.

Code:
l dib 52

meiner Meinung nach sauberer, da du nun bei Bausteinänderungen nix mehr ändern musst:

Code:
lar1 ar2
[COLOR=red]//[/COLOR]l p#xxx.x //Erstes Bit deines Bytes [COLOR=red]- Dank berechtigter Kritik geändert [/COLOR][COLOR=lime]in[/COLOR]
[COLOR=lime]l p##IN0 [/COLOR][COLOR=#000000]//Erstes Bit deines Bytes (IN - Parameterbezeichnung)[/COLOR]
+ar1
l dib [ar1, p#[0.0]

Micha
 
Zuletzt bearbeitet:
oder so...

Das mit DIW und so find ich auch sehr unschön.

Ich habe es früher schon einmal so gelöst:

L P##IN0
LAR1
L B [AR1,P#0.0]
T TempByte
 
Hallo SPS-Killer

könntest Du bitte das zweite (bessere) Beispiel etwas erleutern?
Wieso muß ich bei Bausteinänderungen da nichts mehr änder?
Wenn ich weitere IN Var erstelle verschiebt sich doch die Adresse unter Umständen, oder?

Gruß
Thomas
 
Zuviel Werbung?
-> Hier kostenlos registrieren
L P##IN0
LAR1

lädt die Adresse des ersten IN-Bits in das AR1, danach wird das Byte über diese Adresse geladen.

L B [AR1,P#0.0]

Wenn sich IN0 verschiebt, ändert sich die Adresse. Da die ja erst zur "Laufzeit" geladen wird, wird also die richtige Adresse geladen und somit auch das richtige Byte.
 
IN 1 Sollwert REAL ADD 0.0
IN 2 Istwert REAL ADD 4.0

Wenn ich nun mit diesem Pointer auf 4.0 zeige bleibt die Adresse auch richtig, wenn ich einen weiteren IN zwischen IN 1 und IN 2 einfüge und sich damit IN2 auf 8.0 verschieben würde???

Sorry, aber ich versteh das irgendwie noch nicht. Hab noch nie mit AR gearbeitet.

Gruß
Thomas
 
IN 1 Sollwert REAL ADD 0.0
IN 2 Istwert REAL ADD 4.0

Wenn ich nun mit diesem Pointer auf 4.0 zeige bleibt die Adresse auch richtig, wenn ich einen weiteren IN zwischen IN 1 und IN 2 einfüge und sich damit IN2 auf 8.0 verschieben würde???

Sorry, aber ich versteh das irgendwie noch nicht. Hab noch nie mit AR gearbeitet.

Gruß
Thomas

Genau so ist das.
Allerdings muss ich gestehen, dass aus meinem Beispiel (P#xxx.x)
nicht klar hervorgeht, dass ich symbolisch adressieren möchte!

d.h. du schreibst nicht

Code:
l p#4.0
 
sondern
 
l p##in2 //IN- Parametername
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Jetzt scheint mir ein kleines Licht auf zu gehen...

Also ich lade die Adress des "Symbols" in das AR und adressiere dann von diesem Bezugspunk aus?

Also wenn ich das zweite Bit meiner IN2 haben möchte

L P##Istwert
L AR1
L [AR1,P#0.1]

richtig?
 
Ich bin ja schon in der Ecke... :rolleyes:

Würde das denn gehen?

L P##Istwert
L AR1
U [AR1,P#0.1]


L P##Istwert
L AR1
L B [AR1,P#1.0]
 
Vielleicht nochmal eine kleine Anmerkung dass es so nicht multiinstanz-fähig ist.

richtig - für die MI-fähigkeit mußt du zum AR1 noch das AR2 vom bausteinstart addieren, sollte aber kein problem sein.

MI UND indirekte adressierung sollte man sowieso nur gemeinsam verwenden, wenn man weiß, was man tut :D
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Jetzt bin ich wieder verwirrt.
:confused:

Bezieht ihr euch jetzt nur auf das Beispiel aus dem FAQ Bereich, oder ist mein Beispiel jetzt bei MI auch unbrauchbar???

Gruß
 
bei MI gilt AR1 + AR2 = dein AR1 ... grundsätzlich

gibt derzeit noch nen anderen thread der das beleuchtet ... irgendwas mit multiinstanzen im selben sub ...
 
von vierlagig:
aber schöner wäre hier ein ARRAY[0..7] of BOOL oder ein struct

.... wie kann ich denn die Bits in eine Arry schreiben?
und wie greif ich adann auf das array zu? innerhalb dem FB?


grüsse
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

du kannst wie von vierlagig beschrieben deine Eingangsvariablen deklarieren..
Code:
MyIn   ARRAY[0..7] of BOOL
oder als Struct:

Code:
MyStructIn   Struct
   myFirstBool    BOOL
   mySecondBool   BOOL
Die erste Variante kannst du mit
Code:
U MyIn[0]
und die zweite mit
Code:
U MyStructIn.myFirstBool
ansprechen.

Welche Variante dir lieber ist hängt von dir ab. Ob du weißt, in welchem Bit die Info steckt, die du brauchst oder ob du lieber symbolisch addressierst.

Grüße
 
Zurück
Oben