Step 7 Daten von DP Teilnehmer lesen und in DB schieben

PBO-WE

Level-1
Beiträge
165
Reaktionspunkte
6
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo.
Ich komm grade nicht weiter....
Ich habe nach dem http://www.sps-forum.de/faq/12923-any-zeiger-fuer-datentypen.html Beispiel zwei Pointer aufgebaut, die an der SFC20 die src und dst angeben sollen.

Code:
// srcblk
L     B#16#10                     //10h für s7
      T     LB     4
      L     B#16#2                      //Typ Byte 
      T     LB     5
      L     40                          //Anzahl (Wiederholungsfaktor) 40 Byte
      T     LW     6
      L     0                           //Datenbaustein Nummer
      T     LW     8
      L     #PEW_Auma                   //Anfangsadresse Byte 0
      SLD   3                           //Pointer bauen
      T     LD    10
      L     B#16#81                     //Speicherbereich (hier E)
      T     LB    10

// dstblk
 L     B#16#10                     //10h für s7
      T     LB    14
      L     B#16#2                      //Typ Byte 
      T     LB    15
      L     40                          //Anzahl (Wiederholungsfaktor) 40 Byte
      T     LW    16
      L     #DatenDB_Auma               //Datenbaustein Nummer
      T     LW    18
      L     0                           //Anfangsadresse Byte 0
      SLD   3                           //Pointer bauen
      T     LD    20
      L     B#16#84                     //Speicherbereich (hier DB)
      T     LB    20

Am eingang des Bausteins übergebe ich einmal 104 für den DB wo die Daten hinsollen und 400 für die Startadresse der PE Daten.
Die Anys habe ich im Tempbereich angelegt. Es sollen 40 Byte übertragen werden.

Funktioniert aber leider nicht. :(

Von hand funktioniert das mit:
Code:
L     #PEW_Auma
      SLD   3
      LAR1  


      L     PED [AR1,P#0.0]
      T     DB104.DBD 0

Aber schöner wäre es ja mit der SFC20....

Kann mir einer helfen????
Danke
Gruß
Thomas
 
Wenn ich den SFC20 markiere und F1 drücke dann erhalte ich folgendes:
Hilfe zu Systemfunktionen/-funktionsbausteinen schrieb:
Speicherbereich kopieren mit der SFC 20 "BLKMOV"

Mit der SFC 20 "BLKMOV" (block move) kopieren Sie den Inhalt eines Speicherbereiches (= Quellbereich) in einen anderen Speicherbereich (= Zielbereich).

Zulässige Quellbereiche sind:
· Teile von Datenbausteinen
· Merker
· Prozeßabbild der Eingänge
· Prozeßabbild der Ausgänge
"Lokaldaten" ist auch noch zulässig - das hat Siemens vergessen zu erwähnen. :roll:
Etwas weiter unten bei der Parameterbeschreibung steht der zulässige Speicherbereich für SRCBLK: E, A, M, D, L


Da steht nichts von Peripherieeingängen - Du müßtest also selber eine Kopierschleife programmieren.
Oder lege die DP-Adressen ins PAE, dann kannst Du SFC20 benutzen.

Der Unterschied zwischen Prozessabbild (PAE, PAA) und Peripherie ist Dir geläufig?
Der srcblk-Anypointer in Deinem Code zeigt nicht auf Peripherieeingänge sondern auf Eingänge im Prozessabbild (Speicherbereichskennung B#16#81 = PAE).


Beim Rangieren von nur 40 Bytes würde ich allerdings einfach eine Latte L + T benutzen. Das hat außerdem den Vorteil, daß es komplett in den Referenzdaten erscheint.
Code:
      L     PED 400
      T     DB104.DBD 0
      L     PED 404
      T     DB104.DBD 4
...
      L     PED 436
      T     DB104.DBD 36

Die Zugriffsbreite (PEB, PEW oder PED) muß der Konfiguration des DP-Slaves entsprechen. Ist eine Konsistenz > 4 Byte projektiert, dann brauchst Du SFC14 "DPRD_DAT".

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo und danke für die Antwort.

So richtig war mir das mit den E und PE nicht bewusst. Das hab ich beim Beobachten gesehen, wenn ich den Antrieb in der HW Konfig beobachte und Peripherie umschalte.
Komm mir grade wie ein völliger Depp vor. Nicht dass ich viel Erfahrung hätte, aber dass ich schon wieder an so kleinigkeiten scheitere... :???:

Hab jetzt das hier probiert, aber das klappt auch nicht.
Code:
 L     #PEW_Auma
      SLD   3
      LAR1  

//L     #DatenDB_Auma
//SLD   3
//LAR2  

      L     PED [AR1,P#0.0]
      T     DB104.DBD    0
//T     DBW [AR2,P#0.0]

Also das auskommentierte funktioniert nicht.
Da bekomme ich Bereichslängenfehler.
DB ist 104 und PEW 400 40Byte

Ich denke ich werde jetzt mal mit der SFC14 testen.
Danke
Gruß
Thomas
 
Hallo Thomas,
Code:
      L     #PEW_Auma                   //Anfangsadresse Byte 0
Das läd nur den Inhalt von PEW_Auma, nicht die Adresse.
Versuche mal statt dessen
Code:
      L     p##PEW_Auma                   //Anfangsadresse Byte 0 
      T     LD10

Schau Dir mal FB2, NW 9 an, das klappt auf alle Fälle. Hier wird aud den dem Lokalbereich (IDB) in denen DB kopiert.
 

Anhänge

  • Io-link-save_rest_2011-10-10.zip
    1,6 MB · Aufrufe: 9
Zuletzt bearbeitet:
Da von Dir keine genaue Variablen-Deklaration gezeigt wird spekuliere ich mal:
- #PEW_Auma enthält die Peripherie-Anfangsadresse als INT (z.B. 400)
- #DatenDB_Auma enthält die DB-Nummer in die kopiert werden soll als INT (z.B. 104)

Dann sollte Dein Code etwa so aussehen:
Code:
      L     #PEW_Auma
      SLD   3
      LAR1  

      L     #DatenDB_Auma
      T     #tmp_Int_DBno
      AUF   DB [#tmp_Int_DBno]
      L     P#0.0
      LAR2  

      L     PED [AR1,P#0.0]
      T     DBD [AR2,P#0.0]

Besser für die Referenzdaten: Du deklariest #DatenDB_Auma nicht als INT sondern als Block_DB
Code:
// schlecht: #DatenDB_Auma ist INT
      L     #DatenDB_Auma
      T     #tmp_Int_DBno
      AUF   DB [#tmp_Int_DBno]

// besser so ersetzen:
// #DatenDB_Auma ist Block_DB
      AUF   #DatenDB_Auma

PS: der Code ist in einem FC? In einem multiinstanzfähigen FB darf AR2 nicht verändert werden bzw. muß gesichert und wiederhergestellt werden.

PPS: ich halte überhaupt nichts von solchen indirekten Schweinereien ohne Referenzdaten - siehe meine Empfehlung in #2

PPS: SFC14 kann nur für Zugriffsbreiten 3 Byte oder >= 5 Byte benutzt werden

PPPS: eigentlich sollte man als SPS-Programmierer in der Lage sein, ein Problem oder Fehlverhalten verständlich formuliert mit allen relevanten Zusatzinformationen zu beschreiben ... :(
Planvolles durchdachtes Vorgehen ist bei der Programmiererei meistens vorteilhafter als irgendwas zusammenzutippen ohne Verständnis, was das eigentlich tut :(

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die Ausführung...
Ich bin ja auch für die Verwendung des Block_DB, aber leider kann man damit den Pointer nicht erstellen.

Und ja, Du hast Recht. Natürlich wäre es besser, wenn man alles versteht, aber leider bin ich in einer Abteilung, die alles macht. Ich bin kein reiner Programmierer und kann mich daher auch nicht Tag Täglich damit befassen.
Ich mache die E_pläne, baue den Schrank und Programmiere alles. Genau so mache ich 6kV Anschlüsse.
Ich baue vielleicht alle 4 Jahre mal ne kleine Anlage auf.
Dafür habe ich mir schon in der Freizeit einiges aneignen müssen.
Und ich habe auch noch diverse andere Hobbys und mach nebenbei noch nen Techniker als Informatiker....
;)

Und manchmal steht man einfach auf dem Schlauch und sieht den Wald vor Bäumen nicht.

Gruß
Thomas
 
Zurück
Oben