Pointer Adressieren auf FC Eingangsstruktur (Adressregister eines FCs)

KingKai78

Level-1
Beiträge
37
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo an Alle,

Ich habe volgendes Problem: Ich will in einer Function den Inhalt einer Eingangsstruktur mit 8 Bits als Byte erhalten. Ich dacht dann an einen Pointer auf diese Struktur in etwa so:

L P##IN_Struct_mit_8Bits
LAR1
L B [AR1,P#0.0]
T MB 100

Das Funktioniert aber nicht.
Ich habe bemerkt dass die Eingänge eines FC in der Function nicht als Localvariablen zu Verfügung stehen sondern irgendwie als Pointer auf Localvariablen der Aufrufenden Funktion. Wie kann man diese Vernünftig adressieren?
Hat da jemand eine Lösung?
TIA :s17:
 
Hallo,

um die Anfangsadresse deiner Struct im Adressregister 1 zu kriegen reicht ein

u "struct"."bit1"

im FC aus.

Danach kannst du indirekt weitermachen.

Gruß Micha

Öh, wie meinst du das?

Die Veersion von 4L finde ich das wesentlich einleuchtender und die stimmt auch auf jeden Fall.
 
Wenn du z.B. in einem FC als IN ne Struct hast, die "Test" heisst und mit nem Bit (Name z.B. "b1") beginnt, dann reicht es aus
Code:
u Test.b1
clr

zu schrieben.
AR1 ist dann mit der Startadresse der Struct geladen.

So hab ich das gemeint.

Gruß Micha
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Alles Falsch

Also das funst alles nicht denn die IN-Variablen als !!Struktur!! werden ihrerseits als Pointer behandelt und zwar wird der Datenbereich der in der Aufrufenden Funktion am Eingang gelegten Variablen angeben. Liegt da ein DB dann ists vom Typ n DB, Liegt da eine Temporäre Variable dran dann ists vom Typ V (Localdaten der Vorhärigen Funktion).
Also muss ich den Ponter lesen und meinen neuen Pointer entsprechend stellen.
Ich habe es so gemacht:


L P##IN_Struct_mit_8Bits
LAR1
+AR1 P#2.0
L D [AR1,P#0.0]
LAR1
L B [AR1,P#0.0]
T #TEMP_
8Bits

Diese Lösung funktioniert aber nur wenn es sich um Lokaldaten handelt die an der Eingangstruktur gelegt werden. Wenn z.B. ein DB oder Localdaten angelegt werden sieht es dann so aus:

L P##IN_Struct_mit_8Bits
LAR1
T #D_Temp1
+AR1 P#2.0
L D [AR1,P#0.0]
LAR1
SRD 24
L B#16#84
<>I
SPB next
L #D_Temp1
LAR1
L W [AR1,P#0.0]
T #DBNR
AUF DB [#DBNR]
next: L B [AR1,P#0.0]
T
#TEMP_8Bits




 
Wenn du z.B. in einem FC als IN ne Struct hast, die "Test" heisst und mit nem Bit (Name z.B. "b1") beginnt, dann reicht es aus
Code:
u Test.b1
clr

zu schrieben.
AR1 ist dann mit der Startadresse der Struct geladen.

So hab ich das gemeint.

Gruß Micha

was passiert denn, wenn du das so machst?
Nach dem clr sollte dann die nächste Zeile

L B [AR1,p#0.0]

dein Byte auslesen!
Wo soll der Fehler sein?

Ich verwende das oft so.

Funktioniert bei mir auch wenn ich DB-Struckturen an den FC verschalte...
 
Ja, stimmt, du hast geschrieben Eingangsstruct. Das du da also ein Struct anlegst, hab ich nicht so richtig rausgelesen. Dann muß du natürlich den übergebenen Pointer in seine Bestandteile zerlegen. Das ist dann wie die Übergabe einiger Datentypen an FB. Müßte aber etliches hier im Forum rumschwirren.
 
ich glaub, dass ich das schon richtig verstanden habe.
Du hast blos falsch umgesetzt :D


Oh man du hast natürlich recht. Ich nehme alles zurück. Das Funktioniert tatsächlich mit dem Aufruf des ersten Bits. Dann ist der Pointer direkt gestellt. Mit nem Dreizeiler ist dann alles erledigt.
Vielen Dank

U #RELEASE.AREA1
L B [AR1,P#0.0]
T #TEMP_RELEASE
 
Zurück
Oben