Step 7 Verhalten von BLKMOV (SFC20) im Fehlerfall

holgermaik

Level-3
Beiträge
1.433
Reaktionspunkte
373
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo
Komme eher aus Codesys und habe nichts über das Verhalten von BLKMOV im Fehlerfall gefunden.
S7-300 programmiert mit Step7.x
Annahme:
QuellDB : 10 Byte
ZielDB: 20 Byte
Kopierauftrag: 20 Byte
1. Werden die gültigen 10 Byte kopiert? J/N?
2. Werden die Byte 11 bis 20 im ZielDB verändert? J/N
3. Wie oft wird OB121 aufgerufen? 1x oder 10x

Habe leider keine CPU da um es zu probieren.
Grüße
 
an den blockmove legst du ja 2 any-zeiger an
z.b.
quelle p#db10.dbxSTARTBYTE.STARTBIT byte 20
ziel p#db20.dbxSTARTBYTE.STARTBIT byte 20
1. ich verstehe gerade nicht genau warum du bei quell/ziel-db eine anzahl von bytes angibst.
oder ich interpretiere das gerade falsch. oder warum ist die quelllänge nicht gleich der ziellänge?
aber soweit ich das weiss kopiert der blkmov soviele byte wie er ereichen kann.
also... ziel db ist z.b. zu kurz. es werden so viele byte transferiert wie der ziel-db hergibt. ratval wird einen fehler liefern.
2. weiss ich aus dem bauch raus nicht genau. soweit ich weiss.... nein
3. bei jedem aufruf des kopiervorgangs
 
Hintergrund:
Der QuellDB und ZielDB sowie die Länge der Daten sollen später dynamisch festgelegt werden.
Um bei Rechenfehlern das Ergebnis hervorsagen zu können ist das Verhalten des SFC20 schon interessant.
Daraum auch die Frage wie oft der OB121 aufgerufen wird. Hier muss ich ja dann ein Entscheidung treffen was passieren soll.
 
TIA Portal Hilfe-Auszug
Allgemeine Regeln beim Kopieren
Quell- und Zielbereich dürfen sich nicht überlappen. Wenn der Quell- und der Zielbereich unterschiedlich lang sind, wird nur bis zur Länge des kleineren Bereichs kopiert.
Wenn der Quellbereich kleiner als der Zielbereich ist, wird der Quellbereich komplett in den Zielbereich geschrieben. Die restlichen Bytes des Zielbereichs bleiben unverändert.
Wenn der Zielbereich kleiner als der Quellbereich ist, wird der Zielbereich komplett beschrieben. Die restlichen Bytes des Quellbereichs werden ignoriert.
Wenn ein Bereich vom Datentyp BOOL kopiert wird, muss die angegebene Länge des Bereichs durch 8 teilbar sein, da sonst die Anweisung nicht ausgeführt wird
 
Zuviel Werbung?
-> Hier kostenlos registrieren
QuellDB : 10 Byte
ZielDB: 20 Byte
Kopierauftrag: 20 Byte
Wie kommt es überhaupt dazu, daß aus einem Quellbereich von nur 10 Byte 20 Byte kopiert werden sollen?? Was läuft da schief?

Bei SFC20 werden nicht ganze DB kopiert, sondern Speicherbereiche, deren Länge in den Quell- und Ziel-ANY-Pointern angegeben ist.

Harald
 
Wie kommt es überhaupt dazu, daß aus einem Quellbereich von nur 10 Byte 20 Byte kopiert werden sollen?? Was läuft da schief?

Bei SFC20 werden nicht ganze DB kopiert, sondern Speicherbereiche, deren Länge in den Quell- und Ziel-ANY-Pointern angegeben ist.

Harald
Die Pointer können ja auch symbolisch angegeben sein, und die Strukturen geändert werden. Beim nächsten Übersetzen wird der Pointer dann automatisch aktualisiert.
 
Was läuft da schief?
garnichts
Es ging lediglich darum, was der Baustein macht wenn der Quellbereich ungültig ist.

für alle die es interessiert
ich habe heute mit einer S7-317-2 PN/DP folgendes probiert
- Kopierauftrag größer als der Quelldatenbaustein
- Offset + Länge Kopierauftrag länger als die Restlänge des Quelldatenbausteins
- Startadresse außerhalb einer gültigen Adresse
Bei allen drei Versuchen wurden keine Daten kopiert und der Zielbereich blieb unverändert. Der RetVal gab jedesmal einen Fehlercode aus.
Ein Aufruf eines Fehler OB z.B. OB121 erfolgte nicht. (wie ich es eigentlich erwartet hätte)

Wahrscheinlich kann man dieses Verhalten nicht für alle CPU und Step 7 Versionen verallgemeinern. Siehe #5 von DeltaMaikAir.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hintergrund:
Der QuellDB und ZielDB sowie die Länge der Daten sollen später dynamisch festgelegt werden.
Um bei Rechenfehlern das Ergebnis hervorsagen zu können ist das Verhalten des SFC20 schon interessant.
Daraum auch die Frage wie oft der OB121 aufgerufen wird. Hier muss ich ja dann ein Entscheidung treffen was passieren soll.
Am besten die Größe der Quell/Ziel-DBs und die Länge der zu kopierenden Daten vor dem Ausführen des BLKMOV auf Plausibilität prüfen. Dann kommst du gar nicht erst in diese Situation
 
Verwendet man den Baustein wie in der Hilfe beschrieben, dann funktioniert er auch so wie beschrieben.
Die Aussage, dass sich die Bereiche nicht überschneiden dürfen, ist nicht pauschal gültig.
Bei der S7-300/400 verwendet Siemens verschiedene Prozessoren und abhängig davon verhält sich der Blkmov verschieden.
Bei einer 317 können sich Bereiche überschneiden, bei einer 312 nicht.
 
Bei einer 317 können sich Bereiche überschneiden, bei einer 312 nicht.

Wenn ich das noch richtig im Kopf habe, werden die Bytes intern im Prinzip in einer Schleife aufsteigend kopiert, ein überlappendes Kopieren von unten nach oben bringt demnach nicht das gewünschte Ergebnis, ein überlappendes Kopieren von oben nach unten schon.
 
Moin holgermaik,

Du schreibst, dass es
1. eine Annahme ist und Du
2. keine SPS zum ausprobieren da hast

Handelt es sich um ein Neues Programm? Warum dann S7-300 und nicht S7-1500?
Ausprobieren ginge zudem auch mit PLCSIM.

VG

MFreiberger
 
Zurück
Oben