UDT Indirekt Adressieren

EULANER

Level-1
Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!

Ich habe auf arbeit das Problem, das ich in einen FC/FB einen UDT indierekt Adressieren will.
Hintergrund der Ganzen sache ist, ich will ein Wort auf als Bits im UDT definierte Bereiche legen.
da sie so von einem Frequenzumrichter kommen und ich sie einzeln aufschlüsseln will. in C würde das Ganzen ein Union erledigen.

Leider fehlt mir hier der Ansatzt dazu.

Habe schon einiges Probiert, aber immer mit dem Fehler Bereichslängenüberschreitung.
es Handelt sich um eine 416 2-DP und Step 7 v5.3


Weiterhin will ich auf die Bereich im UDT mit SFC 14/15 (Daten Konsisteten lesen/schreibe. welche ich dann mit dem Any Pointer adressieren müsste. nur, wie komme ich an die Adresse. ich will dem FC/FB aber nur den UDT übergeben.

Wenn einer von euch eine Möglichkeit kennt, Bitte Hilfe

Grüße Stefan
 
Deine Problembeschreibung macht mich ein wenig konfus.

Wo ist dein UDT? Hast du den irgendwo im FC deklariert?

Ein UDT ist ja eine Struct, das hast du ja erkannt. Den Datentypen musst du natürlich auch erst einmal einer Variablen als Datentypen anbieten.

Also, im TEMP-Bereich eine Var mit Namen UDT_Var vom Typ UDTx

Nun kannst du im Programm in AWL folgendes schreiben:

Code:
L P##UDT_Var  // lädt die Adr.
LAR1  // lädt Adr. in Register
L MW100 // irgendein MW das du kopieren möchtest
T LW[AR1,P#0.0]  //  Dein Ziel

pt
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi

Du legst dir deinen UDT an.

Definierst deine Reals, byte, bits wie du lust hast.

Anschliessend leitest due einen DB von UDT ab.



Im Symoleditor:

Symbol Adresse Datentyp Kommentar

FreqUmr DB2 UDT2 Beliebig



Anschliesen kannst du mit z.b. FreqUmr.Freigabe das bit ansprechen.

(Freigabe als bit 5.3 definiert



U FreqUmr.Freigabe
= A 5.0


entspricht z.b.

U DB2.dbx5.3
= A5.0




Karl
 
Udt

Moin!

danke schon mal für die Antworten.

Also, ganz so fremd ist mir das mit dem UDT nicht. Ich habe heute nach einen UDT angelegt, den im Datenbaustein ebenfallst.

Das ganze ist als in_out Parameter am FC gelandet.

Mein Problem ist, ich will nun in diesem FC den UDT indirekt adressieren, quasie indirekt auf den DB zugreifen.
heute nach konnte ich mir erst nur mal so helfen, das ich an dem FC einen ANY Pointer bei in_out angebracht habe und ich somit an die DB Nummer und den Anfang des UDT im DB komme.

..... gefällt mir aber nicht.

da 2 mal das gleiche am FC steht ....

Irgendwie muss mann doch an die DB nummer und die Anfangsadresse kommen, wenn der UDT im in_out bereich steht.

und das ist mein Problem.

der formale zugriff auf diesen im fc stellt kein Problem dar.

Grüße Stefan
 
Hi EULANER

Schreib doch mal deinen Code hier ins Forum.


Einfach so wie du dir das vorstellst, b.z.b. als Kommentar "wie etwas" <funktionieren soll.


Meinst du z.b. db11 für ersten FU
db12 für zweiten FU

U db11.freigabe
. . .

U db12.freigabe
...


Die DB-Nummer kannst du z.b. als "Zahl" übergeben.







Karl
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

ok, ich versuchs mal, da ich hier zu hause kein S7 habe muss ich mir das mal aus den finger ziehen. bitte syntaxprobleme nicht so beachten.

also, ich habe mir einen UDT für Frequenzumrichter erstellt.

Dieser wird mehrfach in einem DB für den jeweiligen FU aufgerufen.

so in dem FC für diesen Frequenzumrichter ist dieser udt als in_out variable deklariert. Somit kann ich für jeden FU einen anderen udt an den FC parametrieren. duch die in_out variable kann ich formal auf den udt zugreifen

bsp.
Code:
L #FU.Sollwert

T .....
und dementsprechend wird je nach deklarierten udt die richtige Adresse im DB für diese stelle genommen.

so weiterhin habe ich in diesem UDT mehrere bits definiert und auf diese Bits die insgesamt ein byte ergeben will ich den Status der vom FU als wort kommt laden.

da

Code:
L PEW 512

T #FU.BIT1   // erstes Bit im definierten Byte

nicht funktioniert will ich das wort indierekt auf die als Bits definierte Bereiche laden

beim Merkern würde das so aussehen

Code:
L PEW
T MB 1

U M 1.0  // einzelne Bit im wort

U M1.1 

= ......
um nun die Indierekte adressierung diese UDT zu erreichen habe ich einen weitern in_out Paramert erstellt vom typ ANY. an den Type ANY und den UDT wird 2 mal der gleiche udt aus dem DB Parametriert.

somit kann ich formal auf den UDT zugreifen

Code:
L #FU. Sollwert

T ...
und aus dem Any Pointer kann ich mir die DB Nummer und den Anfang des UDT im DB ziehen

Code:
 L P##ANY        // an den FC parametrierter udt

lar1

L W[ar1,P#0.0]

L W[ar1,P#2.0]
T DB_Nummer        // DB Nummer ablegen, position richtig ???
L W[ar1,P#4.0]

L W[ar1,P#6.0]

L W[ar1,P#8.0]
T UDT_Start        // Staradresse des UDT, position richtig??? weis gerade aufschlüsselung nicht

// dann kann ich

// den DB wo der UDT ist öffnen
auf DB[DB_Nummer]

// und ab dem Anfang dessen Indierekt addressieren

L P#dbx0.0        // Für Pointerformat
L UDT_Start      // Startadresse des UDT
OD
lar1

L 100 
T dbw[ar1,P#0.0]  // Jetzt kann ich Indierekt auf den richtigen UDT  im Richtigen DB zugreifen auch wenn als Bit definiert


was mir jetzt nicht gefällt ist das ich den ANY parameter an in_out brauche um an die adresse des udt für die indierekte adressierung zu kommen

ich will quasie nur von den als in_out parametrierten UDT die adresse erfahren für die indierekte adressierung.

und da fehlt mir der faden. die SPS muss ja DB Numer und Start wissen für den formalen zugriff, und das soll sie mir verraten.

es ist jetzt viel geworden aber hoffentlich verständlich ....

Grüße Stefan
 
Hallo Leute,

beschäftige mich nun auch etwa mit Pointern und indirekter Adressierung.
Habe ähnlich wie in diesem Thread einen FC zur Ansteuerung eines FU´s erstellt. Hier mal der Code:

L #PAW // Adresse HW-config;
SLD 3
LAR1
L #steuerwort
T PAW [AR1,P#0.0]
L #PAW // Adresse HW-config;

SLD 3
LAR1
L #n_soll
T PAW [AR1,P#2.0]
L #PAW // Adresse HW-config;
SLD 3
LAR1
L #m_limit
T PAW [AR1,P#4.0]
L #PAW // Adresse HW-config;
SLD 3
LAR1
L #motorleistung_kw
T PAW [AR1,P#6.0]
L #PAW // Adresse HW-config;
SLD 3
LAR1
L #nennstrom
T PAW [AR1,P#8.0]
L #PAW // Adresse HW-config;
SLD 3
LAR1
L #rampe_auf
T PAW [AR1,P#10.0]
L #PAW // Adresse HW-config;
SLD 3
LAR1
L #rampe_ab
T PAW [AR1,P#12.0]

Das Steuerwort möchte ich gerne aufschlüsseln in einzelne Bits und diese
als Eingansparameter des FC´s anwenden. Habe dazu schon eine Struct Variable deklariert in 16 einzelne Bits. Wie bekomme ich nun diese 16 Bits an die Stelle wo das #steuerwort (rot markiert) geschrieben wird?

Hoffe ihr versteht was ich meine :confused:

Gruß NSN
 
Wenn man nur ein Wort auf Bit umlegen möchte geht das auch einfacher:

Code:
L MW10
T LW10
und wenn jetzt das LW 10 in Bit's aufgeteilt ist, kann man so direkt drauf zugreifen!

P.S.:
Geht auch umgekehrt!

ja sorry sowas stand auch bereits weiter oben
 
Zuletzt bearbeitet:
So meine ich das

Sorry, hatte bosher noch nicht viel mit indirekter Adressierung zu tun. Du meinst mit MW10 in meinem Fall das #Steuerwort ? Und das LW10 bedeutet was?

Anbei mal ein Beispiel als FC, dann sollte alles klar sein.
Viel Erfolg

P.S.:
Das ist keine indirekte, sondern lokale (bausteininterne) Adressierung!
 

Anhänge

  • DEMO.bmp
    189,8 KB · Aufrufe: 97
Zuviel Werbung?
-> Hier kostenlos registrieren
Ih wollte eigentlich Bools als IN Variable Deklarieren und als Wort indiekt an den FU schreiben.

Ja mach doch. Man nehme jedes Eingangs-Bit und setzte damit ein Lokales-Bit, alles hintereinander und schon kann dort wie in meinem Beispiel, halt nur umgekehrt das Steuerwort an den FU geschrieben werden.
 
@TE:
warum machst du es nicht haargenau so, wie du willst.
Wenn der Struct-Bereich (oder UDT) ein Teil deines Bausteins ist (also in dem Baustein selbst deklariert ist), dann kannst du auch ungefähr so darauf zugreifen :
Code:
[COLOR=red]L     P#steuerwort
LAR1
L W [/COLOR][COLOR=red] [AR1,P#0.0][/COLOR]
[COLOR=red]       [/COLOR]
... ist jetzt allerdings quick'n'dirty da gerade kein Step7 zur Hand ...

Gruß
Larry
 
Zurück
Oben