Speicherbereich kopieren

tanja

Level-1
Beiträge
8
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich möchte n Datenwörter in einen DB Bereich verschieben.
Das geht mit dem SFC20.

Nur möchte ich vom E0.5 bis E12.5 in den Bereich DB1.dbx0.0 - 12.0 verschieben. Das geht mit dem SFC20 nicht. oder?

Zudem müss ich den Eingabe und Ausgabeberiech über IN / OUT Var an einem FC lesen und schreiben.

z.B.

In = P#E 0.5 BYTE 12
Out = P#DB10.dbx0.0 BYTE 6
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habs probiert. Deine Quelladresse muss bei E0.0 anfangen.
Also es gehen nur ganze Bytes. Und das Ziel muss genauso groß oder größer als die Quelle sein.

P#E 0.0 BYTE 13
P#DB10.DBX0.0 BYTE 13
 
der Baustein gibt dann immer

den Fehlercode 8329 aus "Ausrichtungsfehler beim Schreiben eines Parameters"
bzw. Fehlercode 8128 "Ausrichtungsfehler beim Lesen eines Parameters"

Und wenn ich versuche an SRCBLK eine lokale VAR zu übergeben nimmt der die nicht an.
 
Zuletzt bearbeitet:
was ist mit dem SFC 81? wenn ich das richtig lese kann der das.
Und warum lässt sich der Baustein nicht durch eine InVar Typ Any versorgen?
 
Zuletzt bearbeitet:
ich möchte n Datenwörter in einen DB Bereich verschieben.
Das geht mit dem SFC20.

Zudem müss ich den Eingabe und Ausgabeberiech über IN / OUT Var an einem FC lesen und schreiben.

Die beiden Variablen für den Ein- und Ausgabebereich (ANY) müssen als IN-Variablen (ANY) deklariert werden, OUT-Variablen (ANY) kann man in einem FC oder FB nicht deklarieren.

Weiter müssen die IN-Variablen (ANY) in TEMP-Variablen (ANY) kopiert werden, damit sie als Parameter an den SFC20 (BLKMOV) übergeben werden können.

Code:
// FB200 : ANY-Zeiger
 
// IN_DATEN (ANY) => IN_DATEN_TEMP (ANY)
 
      L     P##IN_DATEN
      LAR1  
 
      L     W [AR1,P#0.0]
      T     LW     0
 
      L     W [AR1,P#2.0]
      T     LW     2
 
      L     W [AR1,P#4.0]
      T     LW     4
 
      L     D [AR1,P#6.0]
      T     LD     6
 
 
// OUT_DATEN (ANY) => OUT_DATEN_TEMP (ANY)
 
      L     P##OUT_DATEN
      LAR1  
 
      L     W [AR1,P#0.0]
      T     LW    10
 
      L     W [AR1,P#2.0]
      T     LW    12
 
      L     W [AR1,P#4.0]
      T     LW    14
 
      L     D [AR1,P#6.0]
      T     LD    16
 
 
// Datensatz kopieren (BLKMOV)
 
      CALL  "BLKMOV"
       SRCBLK :=#IN_DATEN_TEMP
       RET_VAL:=#BLKMOV_RET_VAR
       DSTBLK :=#OUT_DATEN_TEMP

Gruß Kai
 

Anhänge

  • OB1.pdf
    3,2 KB · Aufrufe: 59
  • FB200.pdf
    2,9 KB · Aufrufe: 70
  • DB100.pdf
    4,1 KB · Aufrufe: 37
  • DB110.pdf
    4,3 KB · Aufrufe: 27
die sfc20 kann das

entscheidend ist hier der DATENTYP

wenn der typ byte,word,dword ist, muss die adresse immer bei x.0 beginnen. (siehe dazu auch meinen beitrag in der FAQ)

13 byte = 104 bit

also sollte dies funktionieren (hab ich nicht getestet)

Code:
      CALL  SFC   20
       SRCBLK :=P#E 0.5 BOOL 104
       RET_VAL:=#retval
       DSTBLK :=P#DB1.DBX 0.0 BOOL 104

und alle klicken auf den
post_thanks.gif
button unter diesem post :ROFLMAO: :D
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
      CALL  SFC   20
       SRCBLK :=P#E 0.5 BOOL 104
       RET_VAL:=#retval
       DSTBLK :=P#DB1.DBX 0.0 BOOL 104

Das habe ich auch schon ausprobiert, es funktioniert nicht. :(

Die Anfangsadresse muss bei E0.0 liegen, nur dann funktioniert es.

Der SFC20 liefert hier übrigens den Fehlercode W#16#8128.

Gruß Kai
 
Zuletzt bearbeitet:
SFC20 - Fehlercode W#16#8128

Handbuch Systemsoftware für S7-300/400 System- und Standardfunktionen (Seite 2-3)

Fehlercode: W#16#x1xx

Ein Fehlercode besteht aus einer Parameternummer zwischen 1 und 111, wobei 1 den ersten Parameter, 2 den zweiten Parameter usw. der aufgerufenen SFC anzeigt.
Handbuch Systemsoftware für S7-300/400 System- und Standardfunktionen (Seite 2-5)

Fehlercode: W#16#8x28
Erläuterung: Ausrichtungsfehler beim Lesen eines Parameters

Dieser Fehlercode zeigt an, dass der Verweis auf den Parameter x ein Operand ist, dessen Bitadresse ungleich 0 ist.
http://support.automation.siemens.com/WW/view/de/1214574

Gruß Kai
 
@kai
ok du hast recht. (habs eben mal im simu getestet)
ich dachte die sfc könnte das, wenn man den richtigen datentyp angibt.
aber für folgendes bekomm ich mein danke :D:D :ROFLMAO:

hier mal ein ansatz wie's gehen würde
der test kopiert bits aus einem merkerbereich
(habs nur grob getestet)

Code:
//test zuweisen
      L     24
      T     #anzahl

      L     1
      T     #qstartbyte
      L     4
      T     #qstartbit

      L     11
      T     #zstartbyte
      L     0
      T     #zstartbit

//------------------------------------------
      L     1
      T     #aindex
      L     #qstartbit
      T     #qindex
      L     #zstartbit
      T     #zindex

anf:  NOP   0                           //Schleifenanfang
//quellbit
      L     #qstartbyte                 //byte
      SLD   3
      LAR1  
      L     #qindex                     //bit
      +AR1                              //im arX steht jetzt p#qstarbyte.qindex
//zielbit
      L     #zstartbyte
      SLD   3
      LAR2  
      L     #zindex
      +AR2  

//zuweisen
      U     M [AR1,P#0.0]
      =     M [AR2,P#0.0]

//bit erhöhen
      L     1
      L     #qindex
      +I    
      T     #qindex

      L     1
      L     #zindex
      +I    
      T     #zindex

      L     #aindex
      L     1
      +I    
      T     #aindex
      L     #anzahl
      >I    
      SPB   exit
      SPA   anf

exit: NOP   0
werde den code bei zeiten mal optimieren und flexibel gestallten.
 
Zuletzt bearbeitet:
Zurück
Oben