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

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

Thema: Rezept aus einem Quell-DB in einen Ziel-DB übertragen

  1. #11
    viktor8313 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    12.08.2012
    Beiträge
    11
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Also zuerst möcht ich euch allen für eure Bemühungen mir zu helfen danken!

    Ich arbeite mit Step7 v5.5 SP2 und habe kein SCL. Könnte ich das auf der Weise wie ich ich oben angefangen habe das so umsetzen?
    Ich habe jetzt mein bisherigen Code geändert.

    Wie kann ich aus der Eingangsvariable vom Typ Block_DB die Nummer des angeschlossenen DBs rauskriegen?
    Würde die Schleife so passen? an M001 bis M004 muss ich ja die eigentliche DB Nummer rausfinden in einer Word Variablen speichern und
    dann in meiner Schleife mit AUF [DB_NR], DB_NR als WORD, den entsprechenden DB öffnen? oder?

    Code:
          U     #PRG_LOAD
          SPBN  M099
    
          S     #BUSY                       //Übertragung beginnt, BUSY auf TRUE
    
    //#####[Rezeptnummer 1]#####################################################
          L     #REZEPT_NR
          L     1
          ==I   
          SPB   M001
    
    //#####[Rezeptnummer 2]#####################################################
          L     #REZEPT_NR
          L     2
          ==I   
          SPB   M002
    
    //#####[Rezeptnummer 3]#####################################################
          L     #REZEPT_NR
          L     3
          ==I   
          SPB   M003
    
    //#####[Rezeptnummer 4]#####################################################
          L     #REZEPT_NR
          L     4
          ==I   
          SPB   M004
    
    //##########################################################################
    //# Adresse des REZEPT DBs sichern
    //##########################################################################
    
    M001: AUF   #REZEPT1                    //Adresse des 1. Rezept DBs sichern
          L DBNO  
          T     #QDB_NR
          SPA   M005
    
    M002: AUF   #REZEPT2                    //Adresse des 2. Rezept DBs sichern
          L DBNO
          T     #QDB_NR
          SPA   M005
    
    M003: AUF   #REZEPT3                    //Adresse des 3. Rezept DBs sichern
          L DBNO
          T     #QDB_NR
          SPA   M005
    
    M004: AUF   #REZEPT4                    //Adresse des 4. Rezept DBs sichern
          L DBNO  
          T     #QDB_NR
          SPA   M005
    
    //##########################################################################
    //# Programmschleife
    //#
    //# Übertrage Daten anzahl Bytes(BLOCK_GR) aus Rezept-DB(REZEPT#) in Ziel-DB
    //##########################################################################
    
    M005: L     #BLOCK_GR
          T     #Zaehler
    
          LAR1  P#0.0
    
    
    M006: AUF   DB [#QDB_NR]               //QuellDB aufschalgen
          L     DBB [AR1,P#0.0]
    
          AUF   #DEST_DB                   //Ziel DB aufschalgen
          T     DBB [AR1,P#0.0]
    
          +AR1  P#1.0                       //Registerwert ein Byte weiter
    
          L     #Zaehler
          LOOP  M006
    
    M099: R     #BUSY                       //Programm beendet, BUSY auf FALSE
    Geändert von viktor8313 (24.08.2012 um 00:31 Uhr)

  2. #12
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.746
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Warum ein Busy Bit, wenn du doch sowieso alles in einem Zyklus kopierst?
    Und warum nimmst du nicht den von Ralle vorgeschlagenen FC? (da brauchst du kein SCL, ist ne AWL Quelle!)
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  3. #13
    viktor8313 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    12.08.2012
    Beiträge
    11
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ich möchte gerne ein wenig experemntieren und paar Sachen ausprobieren und nebenbei was dazu zu lernen.

    Ich bekomme noch ein Problem mit dem Adresszeiger, es kommt zum Bereichslesefehler im PLCSim.
    Was muss ich jetzt noch beachten(s. Beitrag #11 ist der aktuelle Code)?

  4. #14
    Registriert seit
    06.10.2009
    Ort
    NRW
    Beiträge
    1.572
    Danke
    63
    Erhielt 259 Danke für 219 Beiträge

    Standard

    Zitat Zitat von viktor8313 Beitrag anzeigen
    Aber wie kann ich den in mein Konzept einbinden, der SFC20 benötigt nur eine DB-Nummer, oder? Ich kann dort nicht meiene Eingangsvariablen benutzen?
    wie kann ich aus Block_DB die aktuelle DB-Nummer rausfinden?

    Ich habe mir das eigentlich deutlich einfacher vorgestellt, aber ich will ja was dabei lernen.
    Code:
     AUF   #DB_Nummer
          L     DBNO
          T     #pt_DB //INT-Variable
    Ich bekomme noch ein Problem mit dem Adresszeiger, es kommt zum Bereichslesefehler im PLCSim.
    Stimmt der Wert in "BLOCK_GR"?

    Sicherheitshalber solltest Du "TEST_DB" nutzen, um:

    a) abzufragen, ob der DB vorhanden ist
    b) die Länge auszulesen.

    Code:
      CALL  "TEST_DB"
           DB_NUMBER :=#pt_DB
           RET_VAL   :=#RET_VAL_SFC24
           DB_LENGTH :=#DB_Laenge
           WRITE_PROT:=#DB_WP
          NOP   0
    
    // DB_Laenge übertragen:
    L #DB_Laenge
    T #Zaehler

    Meine Motivation läuft nackig mit einem Cocktail über eine Wiese.

  5. #15
    Registriert seit
    13.03.2007
    Ort
    Nürnberg
    Beiträge
    563
    Danke
    56
    Erhielt 51 Danke für 46 Beiträge

    Standard

    Zitat Zitat von viktor8313 Beitrag anzeigen
    wie kann ich aus Block_DB die aktuelle DB-Nummer rausfinden?
    vielleicht einfach so:
    AUF #DEST_DB
    L DBNO
    T in eine INT variable; da ist dann die db nummer
    und mit
    L DBLG
    T in eine INT variable; da ist dann die db länge (warscheinlich in bytes)

    (jetzt) nicht ausprobiert (irgendwann vor jahren mal) ; alles aus der S7 Hilfe:
    [ bei "AUF" F1 gedrückt, dann "Inhalt" , dort "DB-Operationen" ]
    --------------------------------------------------------------------------------------------------
    L DBNO (Lade die Nummer des Global-Datenbausteins) lädt die Nummer des geöffneten Global-Datenbausteins in AKKU1, nachdem zuvor der Inhalt von AKKU 1 in AKKU 2 gespeichert wurde.
    --------------------------------------------------------------------------------------------------
    L DBLG (Lade die Länge des Global-Datenbausteins) lädt die Länge des Global-Datenbausteins in AKKU 1, nachdem zuvor der Inhalt von AKKU 1 in AKKU 2 gespeichert wurde.
    --------------------------------------------------------------------------------------------------
    Kabelsalat ist Gesund
    (vom CCC abgekupfert)

    Prognosen sind schwierig,
    besonders wenn sie die Zukunft betreffen.
    (Ursprung nicht wirklich bekannt)



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

    viktor8313 (31.08.2012)

  7. #16
    viktor8313 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    12.08.2012
    Beiträge
    11
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ich habe noch eine kleine Frage. Was ich nicht ganz verstehe und bis jetzt nirgendwo gefunden habe ist die Tatsache, dass ich nicht genau weiß wann die Adresse in den Adressregister geladen wird?

    Wenn ich z.B. den DB aufschlage und daten aus dem DB lese dann muss doch schon die absolute Adresse des Datenbausteins im AR befinden oder nicht?

  8. #17
    Registriert seit
    13.03.2007
    Ort
    Nürnberg
    Beiträge
    563
    Danke
    56
    Erhielt 51 Danke für 46 Beiträge

    Standard

    Steht eigentlich im obigen Beispiel drin:


    AUF DB [#QDB_NR] //QuellDB aufschalgen
    L DBB [AR1,P#0.0]

    AUF DB - hat so erstmal nichts mit
    L DBB xxx
    zu tun

    anders das:
    L DB10.DBB5

    das ergibt "eigentlich" :
    AUF DB 10
    L DBB5

    LAR1 P#0.0
    lädt ins AR nur einen Zeiger auf eine Adresse in einen DB der zum zeitpunkt von
    L DBB [AR1,P#0.0]
    dann eben gerade offen ist.

    neben
    DBB [AR1,P#0.0]
    gibt es noch
    L DBW [AR1,P#0.0]
    L DBD [AR1,P#0.0]
    U DBX [AR1,P#0.0] hier ist dann auch .x relevant
    so dann auch
    L MB [AR1,P#0.0]
    L MW [AR1,P#0.0]
    L MD [AR1,P#0.0]
    U M [AR1,P#0.0] das selbe statt mit DB mit Merkern

    obigen Beispiel - Zitat:
    Code:
    M005: L     #BLOCK_GR
          T     #Zaehler
    
          LAR1  P#0.0
    
    M006: AUF   DB [#QDB_NR]               //QuellDB aufschalgen
          L     DBB [AR1,P#0.0]
    
          AUF   #DEST_DB                   //Ziel DB aufschalgen
          T     DBB [AR1,P#0.0]
    
          +AR1  P#1.0                       //Registerwert ein Byte weiter
    
          L     #Zaehler
          LOOP  M006
    Geändert von Senator42 (31.08.2012 um 19:21 Uhr)
    Kabelsalat ist Gesund
    (vom CCC abgekupfert)

    Prognosen sind schwierig,
    besonders wenn sie die Zukunft betreffen.
    (Ursprung nicht wirklich bekannt)



  9. #18
    viktor8313 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    12.08.2012
    Beiträge
    11
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Danke Senator42!

    Die Beispiele die Du aufgeführt hast kenne ich bereits aus meinem Buch. Ich habe jedoch irgendwie anscheinend ein Problem beim Lesen, denn die CPU(PLCSim) geht auf Stop und bei der Diagnose finde ich immer einen Fehler, Breichslesefehler vor?

    Ich habe jetzt mich anhand eines Beispiels von SoftMachine aus Beitrag#7 orientiert und folgendermaßen gelöst.
    Zum kopieren verwende ich SFC20 "BLKMOV" und baue mir zwei Pointer vom Typ ANY, wie in der Siemens-Hilfe beschrieben.(Danke SoftMachine!)

    Code:
          U     #PRG_LOAD
          SPBN  M099
    
          S     #BUSY                       //Übertragung beginnt, BUSY auf TRUE
    
          L     0
          T     #SRC_DB_NR
          T     #DST_DB_NR
          T     #BLKMOV_RetVal
    
    //#####[Rezeptnummer 1]#####################################################
          L     #REZEPT_NR
          L     1
          ==I   
          SPB   M001
    
    //#####[Rezeptnummer 2]#####################################################
          L     #REZEPT_NR
          L     2
          ==I   
          SPB   M002
    
    //#####[Rezeptnummer 3]#####################################################
          L     #REZEPT_NR
          L     3
          ==I   
          SPB   M003
    
    //#####[Rezeptnummer 4]#####################################################
          L     #REZEPT_NR
          L     4
          ==I   
          SPB   M004
    
    //##########################################################################
    //# Adresse des REZEPT DBs sichern
    //##########################################################################
    
    M001: AUF   #SRC_DB1                    //Adresse des 1. Rezept DBs sichern
          L     DBNO
          T     #SRC_DB_NR
          SPA   M005
    
    M002: AUF   #SRC_DB2                    //Adresse des 2. Rezept DBs sichern
          L     DBNO
          T     #SRC_DB_NR
          SPA   M005
    
    M003: AUF   #SRC_DB3                    //Adresse des 3. Rezept DBs sichern
          L     DBNO
          T     #SRC_DB_NR
          SPA   M005
    
    M004: AUF   #SRC_DB4                    //Adresse des 4. Rezept DBs sichern
          L     DBNO
          T     #SRC_DB_NR
          SPA   M005
    
    //##########################################################################
    //# Programmschleife
    //#
    //# Übertrage Daten anzahl Bytes(BLOCK_GR) aus Rezept-DB(REZEPT#) in Ziel-DB
    //##########################################################################
    
    M005: NOP   0
          AUF   #DSC_DB
          L     DBNO
          T     #DST_DB_NR
    
    // Build Anypointer Source
          L     P##PSrc
          LAR1  
    // System-Code
          L     B#16#10
          T     B [AR1,P#0.0]
    // Datatype Byte
          L     B#16#2
          T     B [AR1,P#1.0]
    // Number of Bytes to Copy
          L     #BLOCK_GR
          T     W [AR1,P#2.0]
    // DB-Nr of Source Datablock
          L     #SRC_DB_NR
          T     W [AR1,P#4.0]
    // Begin at DBX0.0
          L     P#DBX 0.0
          T     D [AR1,P#6.0]
    
    
    // Build Anypointer Destination ############################################
          L     P##PDsc
          LAR1  
    // System-Code
          L     B#16#10
          T     B [AR1,P#0.0]
    // Datatype Byte
          L     B#16#2
          T     B [AR1,P#1.0]
    // Number of Bytes to Copy
          L     #BLOCK_GR
          T     W [AR1,P#2.0]
    
    // DB-Nr of Destination Datablock
          L     #DST_DB_NR
          T     W [AR1,P#4.0]
    // Begin at DBX0.0
          L     P#DBX 0.0
          T     D [AR1,P#6.0]
    
    
    // Blockmove, Transfer Data ################################################
          CALL  "BLKMOV"
           SRCBLK :=#PSrc
           RET_VAL:=#BLKMOV_RetVal
           DSTBLK :=#PDsc
    
    
    M099: R     #BUSY                       //Programm beendet, BUSY auf FALSE
    Ich danke euch allen, Ihr habt mir sehr geholfen!!!
    Geändert von viktor8313 (31.08.2012 um 20:15 Uhr)

  10. #19
    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
    Zitat Zitat von viktor8313 Beitrag anzeigen
    Ich habe jetzt mich anhand eines Beispiels von SoftMachine aus Beitrag#7 orientiert und folgendermaßen gelöst.
    Zum kopieren verwende ich SFC20 "BLKMOV" und baue mir zwei Pointer vom Typ ANY, wie in der Siemens-Hilfe beschrieben.(Danke SoftMachine!)

    Ich danke euch allen, Ihr habt mir sehr geholfen!!!
    Danke für die Blumen !
    Gern geschehen, so soll es ein, dafür ist dieses Forum da
    Geändert von SoftMachine (31.08.2012 um 21:55 Uhr)
    kind regards
    SoftMachine

Ähnliche Themen

  1. Antworten: 8
    Letzter Beitrag: 22.03.2012, 18:05
  2. Antworten: 9
    Letzter Beitrag: 25.10.2011, 13:22
  3. Antworten: 11
    Letzter Beitrag: 20.10.2010, 17:28
  4. Antworten: 8
    Letzter Beitrag: 28.11.2008, 13:50
  5. Ausgang von einem BK9100 aus einem BC9050 steuern
    Von merlin im Forum CODESYS und IEC61131
    Antworten: 2
    Letzter Beitrag: 28.09.2008, 10:51

Lesezeichen

Berechtigungen

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