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

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 17 von 17

Thema: AWL UDT Symbolische zugriffe und verweis auf Unstrukturierten DB

  1. #11
    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


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hi Flux

    Hier noch so ein beispiel.

    Code:
    FUNCTION_BLOCK SlaveBSENDRCV
    
    
    TITLE = 'Kommunikationsbaustein'
    // Dieser Baustein bietet den Server an.
    // Passt zum Baustein MasterCom mit BSEND/RECV
    //
    // 1.0 Erste Version
    
    
    
    
    VERSION : '1.0'
    AUTHOR  : VoR
    NAME    : KLP
    FAMILY  : TUV
    
    
    VAR_INPUT
      DB_1_Recv : BLOCK_DB ; // DB der von AS nach LST geht
      DB_1_Send : BLOCK_DB ; // DB der von LST nach AS geht
      ID : WORD ;    //Primäre Verbindung
      ID_Red : WORD ;    //Sekundäre Verbindung
    END_VAR
    VAR
      PUT : "BSEND";    
      GET : "BRCV";    
      save_status_Put : WORD ;    
      save_status_GEt : WORD ;    
      Zeit_alt : TIME ;    
    END_VAR
    VAR_TEMP
      zDB_1_Recv : ANY ;  
            pDB_1_Recv AT zDB_1_Recv : ANY_POINTER;  
      zDB_1_Send : ANY ;
            pDB_1_Send AT zDB_1_Send : ANY_POINTER;     
      wDummy : WORD ;    
      RetVAL : INT ;    
      Write_Prot : BOOL ;    
      Zeit : TIME ;  
      Anzahl_Werte_RECV:  WORD;  
      Anzahl_Werte_SEND:  WORD;  
    
    
    END_VAR
    
    
      DB_1_send.DW[0] := DB_1_recv.DW[0]; // Watchdog wieder zurückkopieren
    
    
    
    
    Zeit := TIME_TCK();
    
    
    (*Pointer aufbereiten*)
    (*Empfangen*)
      pDB_1_Recv.syntaxid         := B#16#10; ;                                 // Typ des Bereichs soll Byte sein (INT = 2)
      pDB_1_Recv.Bereichstyp      := 2;                                         // Typ des Bereichs soll Byte sein (INT = 2)
      pDB_1_Recv.DB_Nr            := WORD_TO_INT(BLOCK_DB_TO_WORD(DB_1_Recv));  // Länge des Pointers weil wir einen Any ohne Länge angeben wollen
      RetVAL := TEST_DB(DB_NUMBER := BLOCK_DB_TO_WORD(DB_1_Recv),DB_LENGTH := Anzahl_Werte_RECV ,WRITE_PROT := Write_Prot);
      pDB_1_Recv.Anzahl_Werte     := WORD_TO_INT(Anzahl_Werte_RECV);             // Länge des Pointers weil wir einen Any ohne Länge angeben wollen
      pDB_1_Recv.Startadresse     := DW#16#84000000;  
      
      (*Senden*)
      pDB_1_send.syntaxid         := B#16#10; ;                                 // Typ des Bereichs soll Byte sein (INT = 2)
      pDB_1_send.Bereichstyp      := 2;                                         // Typ des Bereichs soll Byte sein (INT = 2)
      pDB_1_send.DB_Nr            := WORD_TO_INT(BLOCK_DB_TO_WORD(DB_1_send));  // Länge des Pointers weil wir einen Any ohne Länge angeben wollen
      RetVAL := TEST_DB(DB_NUMBER := BLOCK_DB_TO_WORD(DB_1_send),DB_LENGTH := Anzahl_Werte_SEND ,WRITE_PROT := Write_Prot);
      pDB_1_send.Anzahl_Werte     := WORD_TO_INT(Anzahl_Werte_SEND);             // Länge des Pointers weil wir einen Any ohne Länge angeben wollen
      pDB_1_send.Startadresse     := DW#16#84000000;  
      
    
    
       
      PUT(ID := ID // IN: WORD
                ,R_ID := w#16#3 // IN: DWORD
                ,SD_1 := zDB_1_Send // INOUT: ANY
                ,LEN :=  Anzahl_Werte_SEND   // INOUT: WORD
                ); 
    
    
     
              
              PUT.REQ := TRUE;
              
              IF PUT.ERROR OR PUT.DONE THEN
                Put.Req := False;
              END_IF;
             
              IF PUT.ERROR THEN
               save_status_Put := PUT.STATUS; 
            END_IF;      
            
             
       
    
    
    
    
          GET(EN_R := TRUE // IN: BOOL
               ,ID := ID // IN: WORD
               ,R_ID := w#16#1 // IN: DWORD
               ,RD_1 := zDB_1_ReCV // INOUT: ANY
               ,LEN :=  Anzahl_Werte_RECV // INOUT: WORD
               ); 
       
    
    
    
    
            
              IF GET.ERROR THEN
               save_status_GET := GET.STATUS; 
            END_IF;  
    
    
     END_FUNCTION_BLOCK
    Mit den Beispielen zuvor solltest du in der lage sein sämtliche Schönheiten der Symbolischen Pointeradressierung auszuschöpfen. Habe ich alles aufgrund dieses Treads zusammengebastelt und erfüllt so ziemlich alles was man sich an Adressierungen wünschen kann.

    mfG René

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

    Standard

    Danke für dein Beispiel.

    Wo ist denn besagte AT Sicht auf den DB? In deinem Beispiel arbeitest du zwar strukturiert, aber nicht symbolisch:
    DB_1_send.DW[0] := DB_1_recv.DW[0]; // Watchdog wieder zurückkopieren

    Ich hab bisher für das gleiche entweder die DBNo : INT oder DB : ANY als IN verwendet. Sehe da jetzt keinen großen Unterschied zu BLOCK_DB.
    Geändert von Flux (17.01.2015 um 18:31 Uhr)

  3. #13
    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

    Direkte AT Sicht scheint so nicht zu gehen wie du dir das vorstellst.
    Ich sehe das nur so dass du den Block DB einliest, den Pointer so auflöst wie ich im letzten Beispiel und dann per Blockmove in eine Temporäre Struktur (UDT oder Struct kopierst) Dann Symbolisch damit arbeitest. die Structur am schluss wieder per Pointer und Blockmove zurückschreibst.

    mfG René

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

    Standard

    Ok, dann weiß ich Bescheid. Hatte aus LLs Aussage entnommen, man könnte direkt ne AT Sicht auf den BLOCK_DB Eingang legen, ohne den Kopiervorgang. .

  5. #15
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.190
    Danke
    923
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    Du kannst einen UDT an IN_OUT übergeben, dann kannst Du ohne umkopieren symbolisch zugreifen.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  6. #16
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard

    Sorry - das sollte so nicht verstanden werden - ich korrigiere mal den Beitrag ...

  7. #17
    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 PN/DP Beitrag anzeigen
    Du kannst einen UDT an IN_OUT übergeben, dann kannst Du ohne umkopieren symbolisch zugreifen.
    OK, ich meine das mal für eine Kommunikationsschnittstelle getestet zu haben.

    FB1 und FB2 sollten über nen IN_OUT : UDT_Telegramm kommunizieren. Das Telegramm enthält bspw. ein Update-Bit.

    FB1 wurde zuerst aufgerufen, dann FB2. Und das Problem war, dass FB1 bspw. das von FB2 gesetzte Update-Bit nicht sehen konnte..

    Dafür hätte ich das UDT in einen Global DB auslagern müssen, dann wäre es wahrscheinlich gegangen.

    Ausweg war dann, ein UDT_1nach2 und ein UDT_2nach1 zu definieren, ab dem Moment wurde es mir zu unelegant und ich bin auf das Anypointer + Blockmove Konstrukt umgestiegen.
    We must all suffer from one of two pains: the pain of discipline or the pain of regret. The difference is discipline weighs ounces while regret weighs tons.

Ä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
  •