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

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

Thema: AWL UDT Symbolische zugriffe und verweis auf Unstrukturierten DB

  1. #1
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.620
    Danke
    777
    Erhielt 647 Danke für 493 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    guten Morgen

    Schwierig den Titel zu beschreiben das was sinnvolles bei rauskommt.

    Ich versuchs ausführlicher.
    Ich habe einen DB der aus einer Quelle generiert wird darin sind Wort sozusagen fortlaufend deklariert. Das sind dann Blöcke an z.B. 20 Worten die sich immerwieder wiederholen. Und jeder Block ist für einen FB aufruf gedacht.

    in einem FB möchte ich nun gerne eine UDT Strukur verwenden und zwar als INOUT bzw. ich will sowohl lesen wie auch schreiben.

    Am FB will ich dann entweder einen Pointer zum DB anhängen oder halt den ersten Wort Datenpunkt des gewünschten Blocks des DBs. Und dann im FB diesen Block in den UDT bereich übernehmen dass ich da wieder alles symbolisch habe.

    Ich hätt da jetzt einen Pointer nehmen können als IN dann mit Blkmove diesen auf den UDT bereicht kopieren. Aber ich hab in diesem Block eben auch Parameter welche ich zurück in den DB schreiben will und das auch noch nicht nur aus dem FB sondern auch aus anderen Programmteilen.

    Hat da jemand eine IDEE wie ich das gescheit löse? Oder einen erhellenden Suchbegriff?

    mfG René
    Zitieren Zitieren AWL UDT Symbolische zugriffe und verweis auf Unstrukturierten DB  

  2. #2
    Registriert seit
    22.01.2008
    Ort
    Allgäu, da wo die Kühe schöner sind als die Mädels
    Beiträge
    1.774
    Danke
    50
    Erhielt 729 Danke für 434 Beiträge

    Standard

    Einlesen über Blockmove in den statischen Bereich.

    Rausschreiben händisch, indirekt adressiert.
    Was der Baustein nicht geändert hat, wird auch nicht rausgeschrieben.
    Gruss Audsuperuser

    Herzlich Willkommen im Chat:
    SPS-Forum Chat (Mibbit) | SPS-Forum Chat (MIRC)

  3. #3
    Registriert seit
    17.07.2009
    Ort
    Am Rande der Ostalb
    Beiträge
    5.491
    Danke
    1.141
    Erhielt 1.243 Danke für 974 Beiträge

    Standard

    Solange du im zyklischen Ablauf bist und nicht durch irgendwelche Alarm-OBs auf die Daten zugreifst, kann es doch keine Probleme mit den Zugriffen aus anderen Programmteilen geben.
    Ich lege mir immer die passende UDT im Stat-Teil des FBs an und kopiere die Daten beim Eintritt komplett dort rein und schreib beim Austritt komplett zurück.
    Da der Blockmove-Befehl recht schnell ist, hab ich zumindest bei meinen Anlagen keine Probleme damit.

    Gruß
    Dieter

  4. #4
    Avatar von vollmi
    vollmi ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.620
    Danke
    777
    Erhielt 647 Danke für 493 Beiträge

    Standard

    Das problem ist eben.

    Da kommt z.B. ein Wort rein (z.B. Wort 2 des Blocks)

    DB1.DBW0 // status
    DB1.DBW2 // Befehl

    Code:
    TYPE UDT1
    VERSION : 0.1
    
    
    
      STRUCT 	
       Status : INT ;	
       Befehl : INT ;	
      END_STRUCT ;	
    END_TYPE
    Jetzt kommt auf Wort2 ein wert rein z.B. 4 im Baustein will ich dass dann aber auslesen mit
    L #Befehl

    Wenn das geschehen ist will ich da mit
    T #Befehl
    was reinschreiben.

    Klar ich könnte jetzt den Block da reinkopieren alles bearbeiten und dann wieder rauskopieren. Ich dachte halt es wäre irgendwie möglich nur zu sagen DU liegst eigentlich in diesem DB. als würde man direkt mit Pointern schaffen ohne das wirklich erst umzukopieren. sozusagen eine AT sicht mit Struktur auf einen Globalen DB Bereich.

    Aber wird wohl wirklich auf Blockmove rauslaufen. Dachte halt ich könnt mir den sparen

    mfG René

    mfG René

  5. #5
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.727
    Danke
    398
    Erhielt 2.404 Danke für 2.002 Beiträge

    Standard

    Zitat Zitat von vollmi Beitrag anzeigen
    ... Ich dachte halt es wäre irgendwie möglich nur zu sagen DU liegst eigentlich in diesem DB. als würde man direkt mit Pointern schaffen ohne das wirklich erst umzukopieren. sozusagen eine AT sicht mit Struktur auf einen Globalen DB Bereich.
    Hallo René,

    aber genau so müßte das doch sogar gehen (kann ich leider gerade aber nicht testen).
    Du machst dir einen IN-Parametzer (oder IN_OUT-Parameter) vom Typ deines DB's (UDT) und legst darauf komplett deine AT-Sicht, die die DB-Struktur dann so interpretiert, wie von dir gewünscht.
    Die Größen müßten hier nur zusammen passen.

    Gruß
    Larry
    Geändert von Larry Laffer (19.01.2015 um 09:42 Uhr)

  6. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    vollmi (16.01.2015)

  7. #6
    Avatar von vollmi
    vollmi ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.620
    Danke
    777
    Erhielt 647 Danke für 493 Beiträge

    Standard

    Ja leider nicht in AWL

    mfG René

  8. #7
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.727
    Danke
    398
    Erhielt 2.404 Danke für 2.002 Beiträge

    Standard

    Sorry ... ich hatte nur das Stichwort mit der AT-Sicht gelesen und dann den Rest da hinein interpretiert.

    Dann eine andere Frage : woher kommt den der DB in der unstrukturierten Form (wer beschreibt den wie) und ist es nicht ggf. möglich, ihn strukturiert anzulegen und dann so zu benutzen ...?

    Gruß
    Larry

  9. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    vollmi (16.01.2015)

  10. #8
    Avatar von vollmi
    vollmi ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.620
    Danke
    777
    Erhielt 647 Danke für 493 Beiträge

    Standard

    Der DB wird durch eine Excel Datenpunktliste erstellt. Leider ist es nicht so einfach möglich da UDTs draus zu machen da die Datenpunkte in der Struktur auch verschiedene Kommentare dazu brauchen. Ein datenpunkt in der Struktur hat z.B. eine gänzlich andere Anlagenbezeichnung im Text als der rest der Struktur.

    Das stört mich im Programm nicht, da ich hier nur mit den Objekten arbeite. Aber im Bediensystem soll man dann schon sehen das z.B. die Türe welche durch eine Profibusklappe eingelesen wird nicht direkt zur Klappe gehört sondern einen anderen Standort hat.

    Sonst wäre das schon meine erste Wahl gewesen die UDTs direkt in der Datenpunktliste vorzuhalten. Würde die grösse der Datenpunktliste auch erheblich reduzieren.

    mfG René

  11. #9
    Avatar von vollmi
    vollmi ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.620
    Danke
    777
    Erhielt 647 Danke für 493 Beiträge

    Standard

    Ich hab das in SCL jetzt so gemacht. Vielleicht interessiert es ja jemanden.

    Code:
    FUNCTION_BLOCK Obj_Beispiel
    
    
    
    
    TITLE = 'Beispiel als Objekt ausgeführt'
    // Beispiel wie man einen UDT frei an einen Pointer hängt.
    // Um z.B. eine unspezifizierte Datenmenge mit einem UDT zu belegen und trotzdem Symbolisch den Baustein anhängen zu können
    //
    // V1.0 Startversion
    VERSION : '1.0'
    AUTHOR  : VoR
    NAME    : KLP
    FAMILY  : TUV
    
    
    VAR_INPUT
        LS_PAR : ANY;  // Hier wird das Erste Wort aus dem LS DB aufgelegt
          pLS_PAR AT LS_PAR : ANY_POINTER;
    END_VAR
    
    
    VAR_OUTPUT
        Istposition : INT; // Anzeigevariable
    END_VAR
    
    
    VAR_TEMP
       KLP : LS_ABL_KLP; // temporäre Variablen mit UDT Belegt
    END_VAR
    
    
    (*Pointer auf UDT schreiben zum arbeiten*)
      pLS_PAR.Bereichstyp := 2;   // Typ des Bereichs soll Byte sein (INT = 2)
      pLS_PAR.Anzahl_Werte := 22; // Länge des Pointers weil wir einen Any ohne Länge angeben wollen
                                   // Muss so lange sein wie der UDT der angezeigt werden soll.
      Ret :=  BLKMOV(SRCBLK := LS_PAR ,DSTBLK := KLP); // Kopieren in die Temporäre Variable.  
    
    
    (*Eigentlicher Programmteil starten*)
      KLP.BF_Soll := TRUE; // Klappe soll nach Sollwert fahren
      Istposition := KLP.Istposition / 10; // Istwert der Klappe umrechnen
    
    
    (*Hier wird der Pointer zurückgeschrieben*)
    Ret :=  BLKMOV(SRCBLK := KLP ,DSTBLK := LS_PAR);
    END_FUNCTION_BLOCK
    Aufgerufen wird der Baustein dann so:
    Code:
    call Obj_Beispiel, IDB_Obj_Beispiel
       LS_PAR :=  "IO".ErstesWort

  12. #10
    Registriert seit
    25.03.2012
    Beiträge
    314
    Danke
    60
    Erhielt 9 Danke für 8 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Larry Laffer Beitrag anzeigen
    Du machst dir einen IN-Parametzer (oder IN_OUT-Parameter) vom Typ deines DB's und legst darauf komplett deine AT-Sicht
    Könntest du dazu ein kurzes Codesample liefern? Was heißt "Typ des DB", kenne nur den Parametertyp BLOCK_DB

Ähnliche Themen

  1. Antworten: 3
    Letzter Beitrag: 11.04.2014, 15:37
  2. Antworten: 14
    Letzter Beitrag: 19.02.2013, 09:16
  3. Any Pointer verweis auf Bool ko!pieren
    Von BoxHead im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 18.01.2013, 19:33
  4. UDT in AWL und SCL
    Von Thomas_v2.1 im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 15.06.2008, 22:12
  5. symbolische Adressierung in AWL
    Von wiede im Forum Simatic
    Antworten: 14
    Letzter Beitrag: 09.02.2008, 15:36

Lesezeichen

Berechtigungen

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