Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: UDT Indirekt Adressieren

  1. #1
    Registriert seit
    25.07.2006
    Beiträge
    3
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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
    Zitieren Zitieren UDT Indirekt Adressieren  

  2. #2
    Registriert seit
    07.05.2004
    Ort
    Campbelltown
    Beiträge
    2.437
    Danke
    131
    Erhielt 276 Danke für 86 Beiträge

    Standard

    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
    Gegen Schwachsinn, Schwachköpfe und armselige Trittbrettfahrer kann man nicht argumentieren.

    Gott sieht alles, auch Signaturen in Geheimschrift,,... aber er petzt nicht.

  3. #3
    Registriert seit
    10.05.2005
    Beiträge
    1.996
    Danke
    220
    Erhielt 233 Danke für 204 Beiträge

    Standard

    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

  4. #4
    EULANER ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    25.07.2006
    Beiträge
    3
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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
    Zitieren Zitieren Udt  

  5. #5
    Registriert seit
    10.05.2005
    Beiträge
    1.996
    Danke
    220
    Erhielt 233 Danke für 204 Beiträge

    Standard

    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

  6. #6
    EULANER ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    25.07.2006
    Beiträge
    3
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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

  7. #7
    Registriert seit
    09.11.2007
    Beiträge
    321
    Danke
    52
    Erhielt 3 Danke für 3 Beiträge

    Beitrag

    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

    Gruß NSN

  8. #8
    Registriert seit
    17.05.2010
    Ort
    Paderborn
    Beiträge
    824
    Danke
    84
    Erhielt 125 Danke für 94 Beiträge

    Standard

    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
    Geändert von MCerv (11.11.2010 um 19:44 Uhr) Grund: duplikat
    Grüße
    Michael

    1001101110110100... Das ist meine Welt

  9. #9
    Registriert seit
    09.11.2007
    Beiträge
    321
    Danke
    52
    Erhielt 3 Danke für 3 Beiträge

    Standard

    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?

  10. #10
    Registriert seit
    17.05.2010
    Ort
    Paderborn
    Beiträge
    824
    Danke
    84
    Erhielt 125 Danke für 94 Beiträge

    Idee


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von NeuerSIMATICNutzer Beitrag anzeigen
    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!
    Angehängte Grafiken Angehängte Grafiken
    Grüße
    Michael

    1001101110110100... Das ist meine Welt
    Zitieren Zitieren So meine ich das  

Ähnliche Themen

  1. PEW; PAW indirekt Adressieren
    Von casius im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 02.10.2017, 09:00
  2. SCL indirekt Adressieren
    Von Nafura im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 19.05.2011, 21:42
  3. SFC 20 indirekt adressieren
    Von drmicha im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 19.10.2009, 09:24
  4. Typ Struct Indirekt adressieren
    Von Jordy im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 23.01.2008, 10:11
  5. ANY-Pointer indirekt adressieren
    Von Anonymous im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 14.02.2004, 15:41

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •