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

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

Thema: Verständnisproblem bei DB aufruf im FC

  1. #11
    Registriert seit
    13.09.2010
    Beiträge
    2.292
    Danke
    178
    Erhielt 375 Danke für 355 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    IN: DB_Nummer INT
    TEMP: DB_NummerW WORD


    FC xx:
    L DB_Nummer
    T DB_NummerW

    AUF DB[DB_NummerW]

    nun funzt´s !

  2. #12
    Registriert seit
    22.05.2014
    Beiträge
    24
    Danke
    7
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hi!

    Kann mir jemand verraten, wie ich in einem FB auf Daten von einem Global-DB zugreifen kann? (Die DB-Nummer ist variabel und wird dem FB via INT übergeben)

    Meine Vorstellung ala:
    Code:
    U DB[#IN_int].DBX174.7
    R DB[#IN_int].DBX200.7
    funktioniert ja leider nicht

    Könnte sich jemand meiner erbarmen?

    lG
    Michael
    wir hätten noch gebrauchte Ware auf Lager:

    http://www.sps-forum.de/suche-biete/...chte-ware.html

  3. #13
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.351
    Danke
    452
    Erhielt 692 Danke für 517 Beiträge

    Standard

    Code:
    L    #IN_int
    T    #IN_int_TMP     //Muss Temp oder Merker sein
    
    
    AUF  DB[#IN_int_TMP]
         U DBX174.7
         R DBX200.7
    Solch ein symbolloses Addressgestochere wird halt schnell undurchsichtig.
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  4. Folgender Benutzer sagt Danke zu RONIN für den nützlichen Beitrag:

    Mich89 (13.02.2017)

  5. #14
    Registriert seit
    22.05.2014
    Beiträge
    24
    Danke
    7
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Erstmal Danke!

    Muss ich den Befehl "AUF DB" jedes mal vor einem Zugriff durchführen, oder bleibt der DB während des ganzen FB Zyklus erhalten, bis auf Widerruf durch ein erneutes "AUF" mit anderer DB-Nr?


    Wenn ich die Symbole erhalten will, muss ich wohl den ganzen Global-DB in der Instanz nachbauen und dann den DB am Ende des FB abgleichen, oder?

    lG
    Michael
    wir hätten noch gebrauchte Ware auf Lager:

    http://www.sps-forum.de/suche-biete/...chte-ware.html

  6. #15
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.351
    Danke
    452
    Erhielt 692 Danke für 517 Beiträge

    Standard

    Zitat Zitat von Mich89 Beitrag anzeigen
    Muss ich den Befehl "AUF DB" jedes mal vor einem Zugriff durchführen, oder bleibt der DB während des ganzen FB Zyklus erhalten, bis auf Widerruf durch ein erneutes "AUF" mit anderer DB-Nr?
    Solange bis du entweder ein AUF mit einem anderen DB oder einen gewöhnlichen Zugriff auf einen anderen DB machst.

    Zitat Zitat von Mich89 Beitrag anzeigen
    Wenn ich die Symbole erhalten will, muss ich wohl den ganzen Global-DB in der Instanz nachbauen und dann den DB am Ende des FB abgleichen, oder?
    Das hängt stark von deiner Datenstruktur ab wie man soetwas am besten umsetzen kann. Hängt davon ab was deine Daten im DB darstellen. Sind die in irgendwelchen Strukturen oder UDT abgelegt sodass man eventuell eine ganze Struktur an den FB übergeben kann? Was verbirgt sich den hinter den Adressen? Welche Funktion erfüllt das gezeigte Rücksetzen?
    Geändert von RONIN (13.02.2017 um 11:52 Uhr)
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  7. #16
    Registriert seit
    22.05.2014
    Beiträge
    24
    Danke
    7
    Erhielt 0 Danke für 0 Beiträge

    Standard

    hmm.. Wie sieht dann ein Befehl aus, wenn ich einen anderen DB dazwischen habe?

    Code:
          U     DB50.DBX    5.4
          U     #Enable_Servo
      AUF   DB [#TEMP_DB]
          UN    DBX  172.3
          U     DBX  213.1
          UN    DB50.DBX    5.3
          UN    DB50.DBX    4.7
      AUF   DB [#TEMP_DB]
          S     DBX  174.7
    
          U     DB50.DBX    5.3
          U     DB50.DBX    4.7
      AUF   DB [#TEMP_DB]
          R     DBX  174.7
    bzw aufgeräumter:

    Code:
          U     DB50.DBX    5.4
          UN    DB50.DBX    5.3
          UN    DB50.DBX    4.7
          U     #Enable_Servo
      AUF   DB [#TEMP_DB]
          UN    DBX  172.3
          U     DBX  213.1
          S     DBX  174.7
    
          U     DB50.DBX    5.3
          U     DB50.DBX    4.7
      AUF   DB [#TEMP_DB]
          R     DBX  174.7
    So?

    Oder muss ich temporäere Variablen verwenden und darf "AUF" nur am Anfang einer Anweisung verwenden?


    Code:
      AUF   DB [#TEMP_DB]
          UN    DBX  172.3
          U     DBX  213.1
          U     DB50.DBX    5.4
          UN    DB50.DBX    5.3
          UN    DB50.DBX    4.7
          U     #Enable_Servo
          S      #temp_var
    
          U     DB50.DBX    5.3
          U     DB50.DBX    4.7
          R     #temp_var
    
      AUF   DB [#TEMP_DB]
          U    #temp_var
          =    DBX  174.7
    Das hängt stark von deiner Datenstruktur ab wie man soetwas am besten umsetzen kann. Hängt davon ab was deine Daten im DB darstellen. Sind die in irgendwelchen Strukturen oder UDTS abgelegt sodass man eventuell eine ganze Struktur an den FB übergeben kann? Was verbirgt sich den hinter den Adressen? Welche Funktion erfüllt das gezeigte Rücksetzen?
    Der entsprechende DB wird aus UDTs generiert, stimmt.
    Es geht um den FB283 (SINA_FB), welcher mir einen DB mit UDT30000 (Basis) und UDT30010 (UDT_TVB+MDI_TLG110) erzeugt. Mich interessiert nur der UDT30010, welcher bei 162.0 anfängt und 90 Byte hat. (Sollte ich also mit Pointer hineinmappen, oder?)
    (Am liebsten wäre es mir, wenn ich den Global-DB weglassen könnte und direkt in den Instanz-DB integriere, aber das ist ja unsauber und unleselich...)


    Der erste Code-Auszug war nur ein Beispiel. Im Code-Auszug dieses Beitrags geht es darum den MDI-Modus je nach Rahmenbedingung zu aktivieren (Referenziert, Enable, kein Manuell-Betrieb, ...) oder deaktivieren (Manuell-Betrieb).


    Zum Background:
    Ich schreibe gerade einen FB, der mir die Ansteuerung einer Sinamics-Achse vereinfachen soll. Desweiteren soll das anfügen einer neuen Achse vereinfacht werden und die generelle Ansteuerung über mehrere Projekte (unterschiedliche Maschinentypen) vereinheitlichen.


    Nachtrag:

    Ich lass das jetzt mal mit dem "AUF DB" und übertrage den entsprechenden UDT mit SFC 20.

    Code:
    //Zuerst kopiere ich den WR_PZD und RD_PZD um, damit ich die Pointer auch lesend verwenden kann
          L     P##WR_PZD                   // WR_PZD ist IN- Variable vom Typ ANY
          LAR1                              //AR1 zeigt nun auf die Anfangsadr. der Eingangsvariable
          L     P##WR_PZD_temp              // --> source = temporäre Variable vom Typ ANY
          T     #p_tmp1                     // p_tmp1 (DWORD) ist ein Zeiger auf source
    
    // copy in-parameter ANY to tmp ANY
          L     D [AR1,P#0.0]
          T     LD [#p_tmp1]                //Byte 0 bis Byte 3 des ANY kopieren
          L     #p_tmp1
          +     32
          T     #p_tmp1                     // zeiger auf temp. ANY um 4 Byte weiterstellen
          L     D [AR1,P#4.0]
          T     LD [#p_tmp1]                // Byte 4 bis Byte 7 des ANY kopieren
          L     #p_tmp1
          +     32
          T     #p_tmp1                     // zeiger auf temporären ANY um 4 Byte weiterstellen
          L     W [AR1,P#8.0]
          T     LW [#p_tmp1]                // Byte8 bis Byte10 des ANY kopieren
    
    //Habe ich aus einer Siemens Hilfe kopiert und abgeleitet, ist das so richtig?
    
    
          CALL  SFC   20
           SRCBLK :=#WR_PZD_temp                   //Pointer auf DB Adresse mit Bereich
           RET_VAL:=#SFC_int1
           DSTBLK :=#Achse.RD_PZD_POSBETR    //UDT im Static Bereich meines FB
    
          CALL  SFC   20
           SRCBLK :=#RD_PZD_temp                    //Pointer auf DB Adresse mit Bereich
           RET_VAL:=#SFC_int2
           DSTBLK :=#Achse.WR_PZD_POSBETR    //UDT im Static Bereich meines FB
    
    .
    .
    .
    Bearbeitung
    .
    .
    .
    //Am Ende des Bausteins übertrage ich den WRITE Bereich des UDT wieder in den Global-DB
    
          CALL  SFC   20
           SRCBLK :=#WR_PZD_temp                    //Pointer auf DB Adresse mit Bereich
           RET_VAL:=#SFC_int2
           DSTBLK :=#Achse.WR_PZD_POSBETR    //UDT im Static Bereich meines FB
    Geändert von Mich89 (13.02.2017 um 14:05 Uhr)
    wir hätten noch gebrauchte Ware auf Lager:

    http://www.sps-forum.de/suche-biete/...chte-ware.html

  8. #17
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.351
    Danke
    452
    Erhielt 692 Danke für 517 Beiträge

    Standard

    Zitat Zitat von Mich89 Beitrag anzeigen
    Code:
          U     DB50.DBX    5.4
          UN    DB50.DBX    5.3
          UN    DB50.DBX    4.7
          U     #Enable_Servo
      AUF   DB [#TEMP_DB]
          UN    DBX  172.3
          U     DBX  213.1
          S     DBX  174.7
    
          U     DB50.DBX    5.3
          U     DB50.DBX    4.7
      AUF   DB [#TEMP_DB]
          R     DBX  174.7
    So?
    Ja, genau so. Dementsprechend ist das mischen von AUF und "starren Global-DB-Zugriffen" schwierig.
    Wenn du aber was wiederverwendbares baust, dann haben solche Global-DB-Zugriffe (U DBxx.DBXyyy) da eh weniger was verloren.
    Was steckt denn hinter deinem DB50?

    Zitat Zitat von Mich89 Beitrag anzeigen
    Am liebsten wäre es mir, wenn ich den Global-DB weglassen könnte und direkt in den Instanz-DB integriere, aber das ist ja unsauber und unleselich...
    Was wäre daran so schlimm?
    Wenn du den SINA-FB (kenn den jetzt nicht genau) und dessen Daten ansteuern willst, dann könntest du den ja als Multiinstanz in einen FB-packen und dir eine passende Schnittstelle nach außen bauen.
    Sonst könntest du den jeweiligen UDT auch über die Schnittstelle übergeben, also die Daten als Kopie in den FB/FC übernehmen um am Ende rückschreiben.
    Tipps sind natürlich schwierig ohne wirklichen Einblick wie es funktionieren soll. Aber das oben gezeigte ist halt alles andere als ideal.
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  9. #18
    Registriert seit
    22.05.2014
    Beiträge
    24
    Danke
    7
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Der DB50 steuert die Einspeisung an (also Zwischenkreis und Netzschütz) und liefert mir Summensignale (Alle Achse fehlerfrei, positionierbereit,...)
    wir hätten noch gebrauchte Ware auf Lager:

    http://www.sps-forum.de/suche-biete/...chte-ware.html

Ähnliche Themen

  1. Verständnisproblem S7 400 H FH usw.
    Von Bender25 im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 09.06.2015, 21:24
  2. DP/RS232 Verständnisproblem
    Von Beren im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 23.06.2011, 08:30
  3. AWL Verständnisproblem
    Von invoices im Forum Simatic
    Antworten: 12
    Letzter Beitrag: 12.08.2010, 11:35
  4. Verständnisproblem mit pointer ?
    Von Waelder im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 03.08.2009, 09:02
  5. Verständnisproblem Zeiger/AWL
    Von kiestumpe im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 15.06.2006, 09:12

Lesezeichen

Berechtigungen

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