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

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

Thema: Probleme beim adressieren im Datenbaustein..

  1. #1
    Anonymous Gast

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    bei meiner S7 habe ich folgendes Problem:
    Im Datenbaustein befinden sich diverse Parameter für verschiedene Funktionen. Es gibt 10 Devices, wesshalb für jedes Device ein Parametersatz im DB abgelegt ist, für mein Verständnis also ein Array von 10 Devices mit jeweils gleichen Elementen aber unterschiedlichen Werten. Obwohl in der Definition des DB niergendwo ARRAY steht sondern 10 mal hintereinander der gleiche UDT. (Nee was kompliziert ausgedrückt)

    Beispiel

    DB:
    +-----1-----------
    Zeit1 S5TIME
    Zeit2 S5TIME
    Anz INT
    Flag BOOL
    +-----2-----------
    Zeit1 S5TIME
    Zeit2 S5TIME
    Anz INT
    Flag BOOL
    +-----3-----------
    Zeit1 S5TIME
    Zeit2 S5TIME
    Anz INT
    Flag BOOL
    +-----4-----------
    :

    Jede Funktion ermittelt nun über zwei Parameter
    Parameter 1: Daten Baustein Nummer
    Parameter 2: Offset des Datenbereichs im Datenbaustein
    wie folgt den zu verwendenden Datenbereich (sprich ARRAY Eintrag)

    L #DB_Device
    T #DB_Device_Temp
    LAR1 P#0.0 // Zeiger mit Null in Adressregister laden

    L #Offset_Device // Offset laden (Device Bereich)
    SLD 3 // um 3 nach links schieben um Zeigerstruktur zu erzeugen
    +AR1 // Zum Adressregister addieren

    AUF DB [#DB_Device_Temp]

    Dann werden die Werte wie folgt aus dem Datenbaustein entnommen:

    L DBB [AR1,P#22.0]

    Falls also jemand unter Euch ist der versteht was hier beschrieben ist, insbesondere SPS mäßig, wäre es nett wenn ihr mir sagen könntet wie ich statt der festgelegten Position P#22.0 direkt den Eintrag angeben könnte also z.B. Zeit2. Dann kann ich den UDT ändern und muß nicht durch alle Funktionen und die Positionen anpassen, da die Namen ja bleiben.

    Ich hoffe nur, dass das einer verstanden hat... :->

    Grüße
    Neuling

    PS: Vielleicht gibts ja auch ne bessere Methode ?
    Zitieren Zitieren Gelöst: Probleme beim adressieren im Datenbaustein..  

  2. "
    L #Offset_Device // Offset laden (Device Bereich)
    SLD 3 // um 3 nach links schieben um Zeigerstruktur zu erzeugen
    In welchem Format ist Dein Offset gespeichert? Könnte es sein, dass es schon im Zeigerformat und nicht als INT gespeichert ist, so dass Dein Pointer effektiv um 8 multipliziert?

    Oops, sorry, erst Frage zu Ende lesen, dann antworten!

    Mmmm, im Edit-Fenster kann man das originale Post nicht mehr sehen!"


  3. #2
    Registriert seit
    16.12.2004
    Ort
    Schleswig-Holstein
    Beiträge
    400
    Danke
    21
    Erhielt 23 Danke für 20 Beiträge

    Standard

    L #Offset_Device // Offset laden (Device Bereich)
    SLD 3 // um 3 nach links schieben um Zeigerstruktur zu erzeugen
    In welchem Format ist Dein Offset gespeichert? Könnte es sein, dass es schon im Zeigerformat und nicht als INT gespeichert ist, so dass Dein Pointer effektiv um 8 multipliziert?

    Oops, sorry, erst Frage zu Ende lesen, dann antworten!

    Mmmm, im Edit-Fenster kann man das originale Post nicht mehr sehen!

  4. #3
    Anonymous Gast

    Standard

    Hi RMA,

    also die Adressierung funktioniert ja mit
    L DBB [AR1,P#22.0]
    nur würde ich gerne statt der , ich sag mal Position P#22.0, gerne
    den vergebenen Namen z.B. Zeit2 einsetzten, also
    L DBB [AR1,Zeit2]
    falls das syntaktisch überhaupt so geht ?!

    Grüße

  5. #4
    Registriert seit
    29.01.2004
    Beiträge
    322
    Danke
    10
    Erhielt 22 Danke für 22 Beiträge

    Standard

    Hallo
    Liegen deine Arrays am Anfang des DBs oder gibt es noch einen DB-Kopf?
    Denn wenn dein Offset-Device auf den Anfang des entsprechenden Arrays zeigt und deine Arrays nur aus den 4 Einträgen besteht, verstehe ich die Offseterhöhung P#22.0 nicht.

    Man könnte aber eine kleine Funktion schreiben, wo als Eingänge die DB-Nummer und der "Datensatz" und als Ausgänge die Daten erscheinen.

    Gruß

    Andreas

    P.S. Ich habe gerade deine Antwort auf RMA gelesen. Du kannst folgendes machen:

    L #Offset_Device
    sld 3
    L P#22.0
    +D
    T Zeit2 (Doppelwort)

    ....

    L DBB[Zeit2]

    Gruß

    Andreas

  6. #5
    Registriert seit
    20.10.2004
    Beiträge
    650
    Danke
    5
    Erhielt 26 Danke für 26 Beiträge

    Standard

    hallöchen wieso nicht ganz einfach

    "datenbaustein"."UDT"."zeit1"


    Code:
     L     "db".test2.zeit2
    oder meintest du was anderes

  7. #6
    Registriert seit
    16.12.2004
    Ort
    Schleswig-Holstein
    Beiträge
    400
    Danke
    21
    Erhielt 23 Danke für 20 Beiträge

    Standard

    Hi Neuling,

    am einfachsten geht das wenn Du dass in einem FB machst, dann kannst Du Dein Offset als Parameter übergeben. Dann würde es ungefähr so gehen:

    VAR_INPUT

    Zeit_Offset : INT //Byte-Nr der Zeit

    END_VAR

    NETWORK

    AUF DBnn

    L #Zeit_Offset //Offset holen
    SLD 3 //ändern in Byte.Bit Format
    LAR1
    L DBB[AR1,P#0.0]

    Wenn man mehrere hintereinander laden möchte dann ist #Zeit_Offset nur die Addresse des ersten Parameters und dann wenn die Parameter alle gleich aufgebaut sind (wovon ich ausgehe), dann brauchst Du nur Konstant dazu zu addieren bevor Dein SLD3.

    Ich hoffe das hilft Dir auf dem Weg.

    Beispiele findest Du auf der Siemens Support-Seit wenn Du eine Suche startest mit dem Begriff "symbolische Programmierung, indirekte Adressierung"

  8. #7
    Anonymous Gast

    Standard

    Also,

    @Znarf
    da ich keine Lust hatte sämtliche Einträge meiner Striktur >30 einzutragen hatte ich beispielhaft die kleinen Arrayeinträge geschrieben bei denen natürlich keine Position 22 vorkommt
    Soweit ich das sehe ist Deine Lösung aber auch nicht flexibel wenn sich die Struktur des UDT verändert z:b: beim hinzufügen eines neuen Wertes vor Position 22. Dann stimmt der Bezug Zeit2 nicht mehr und der Kopf müsste auch hier wieder angepaßt werden.

    @kpeter
    das geht aber nur bei der direkten Adressierung im DB und nicht bei der Adressierung über DB Nummer und Offset. Eine Übergabe an unterschiedliche Funktion scheint mir dann problematisch.

    Grüße und danke schon mal für Eure schnellen Antworten

  9. #8
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.220
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard

    Du mußt so zugreifen wie es im Programm steht, ein Symbol kannst du an dieser Stelle nicht nutzen, da das Symbol ja wieder direkt mit der Adresse im DB verbunden ist. In SCL kann man einfacher auf Array's zugreifen, da könnte das schon eher gehen.

    Hier kann man sowas machen:

    Ein UDT mit den Variablen definieren.
    Im DB eine Variable "Prog Array[1..10] of Udt1" anlegen.

    im SCL-Baustein z.Bsp. folgendes programmieren:

    Code:
    FOR I := 1 TO Anzahl DO
           Wert := "TestDB".Prog[I].bond_contr_Win_1_Value_1;    
    END_FOR;
    IN AWL (von SCL übersetzt) sieht das so aus:

    Code:
          SET   
          SAVE  
          =     L      6.1
          L     #Anzahl
          L     1
          T     #I
          TAK   
          T     LW     8
          TAK   
    A7d0: L     #I
          L     LW     8
          <=I   
          SPBN  A7d1
          L     #I
          ITD   
          L     L#-1
          +D    
          L     L#480
          *D    
          L     L#32
          +D    
          LAR1  
          AUF   "TestDB"
          L     DBW &#91;AR1,P#0.0&#93;
          ITD   
          T     #Wert
          L     #I
          L     1
          +I    
          T     #I
          SPA   A7d0
    A7d1&#58; L     100
          T     #RET_VAL
          CLR   
          U     L      6.1
          SAVE  
          BE
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  10. #9
    Anonymous Gast

    Standard

    Hi Ralle,

    na in SCL sieht das ja schon ganz nach meinem Geschmack aus, vielleicht sollte ich mal SCL versuchen...

    Dabke !

  11. #10
    Registriert seit
    06.10.2003
    Beiträge
    3.410
    Danke
    449
    Erhielt 504 Danke für 407 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    den UDT, den du in deinem DB verwendest, könntest du auch als eine Lokalvariable in deinem Baustein verwenden. Dann legst du einen Pointer als Bausteinparameter an, der auf den ersten Eintrag deines Arrays zeigt. Aus den Pointerdaten kannst du die DB-Nummer, die Startadresse im DB und die Länge des UDT gewinnen. Mit der als Eingangsparameter übergebenen "Parametersatz-Nummer", der Startadresse und der Länge des UDT ermittelst du den Offset deiner jeweiligen Daten und kopierst sie in einer Schleife in deine UDT-Lokalvariable. Jetzt hast du symbolischen Zugriff auf die Kopie des jeweiligen Parametersatz. Falls du Daten veränderst, müssen diese natürlich am Ende des Bausteins auf die gleiche Weise in den DB zurück kopiert werden. Das hört sich jetzt vielleicht etwas aufwendig an, ist es auch ein wenig . Bei grösseren Datenmengen ist es aber ganz praktisch. Änderungen an der Datenstruktur macht man dann nur noch im UDT und man hat im Baustein symbolischen Zugriff auf den adressierten Datensatz.


    Gruss, Onkel

Ähnliche Themen

  1. Probleme beim Installieren vom TIA V11 Pro
    Von Nordischerjung im Forum Simatic
    Antworten: 15
    Letzter Beitrag: 08.07.2011, 13:59
  2. Hilfe beim Datenbaustein erzeugen
    Von Hans.S im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 03.01.2010, 12:53
  3. Probleme beim Start von S7
    Von papabär im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 22.09.2008, 19:46
  4. Probleme beim Exportieren S5 von IBH
    Von bernd67 im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 16.01.2007, 23:11
  5. Probleme beim speichern beim Symatic Manager
    Von Anonymous im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 10.06.2005, 06:36

Lesezeichen

Berechtigungen

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