TIA Datenbausteinbereich umkopieren mit blokmove

Waldi1954

Level-1
Beiträge
64
Reaktionspunkte
18
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Forummitglieder,

um einen Datenbereich mit Versatz in einen andere Bereich zu kopieren benutze ich Blokmove.
Der Quell- und Zieldatenbereich wird über Any-Pointer zusammengestellt.
Die Steuerung ist eine 1515-2 PN. Die Pointeradressen sind korrekt.
Wenn ich versuche die Daten im Instands DB umzukopieren, stürzt die Steuerung ab, mit der Meldung Bereichsfehler.
Wenn ich jedoch einen globalen Datenbaustein verwende, kopiert er mir diese Bereich problemlos um.
Warum kann ich die Daten nicht im Instands DB umkopieren?
Weiß an dieser Stelle nicht weiter. Der Anweisungscode wurde in AWL geschrieben.
Hatte jemand schon einmal das selbe Problem?
Das Programm war Lauffähig auf S7-300 und wurde migriert nach TIA 1500.
P.s. der Instands DB ist nicht mit optimierten Zugriff erstellt.

Gruß Waldi
 
Scheint so als wäre die ANY-Adresse doch nicht korrekt.
Ohne Deinen Code zu kennen kann man nur raten.
Benutzt Du vielleicht Multiinstanzen und verarbeitest den Multiinstanz-Offset aus AR2 nicht oder falsch? Oder verändert Dein Code das AR2? Wie lautet die Fehlermeldung genau? Passiert der Fehler bei dem BLKMOV oder an anderer Stelle?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald

erst mal Danke für deine Antwort
Der IDB ist eine Multiinstanz. Die Adressbereich sind genau so vorhanden wie in ANY Pointer Deklariert.
Der DB ist ca. 10 KB groß und der Zielbereich ist 2047 Byte lang.
Deine Frage mit dem Offset habe ich nicht ganz verstanden. Das AR2 wird von mir nicht geändert.
Der BD wird nur einmal verwendet.
ANY Pointer.jpg

Quelle P#DB200.DBX94.0 Byte 227
Ziel P#DB200.DBX457.0 Byte 227
 
Kann ja sein, das ich mich jetzt auch furchtbar irre:
Aber entweder DB mit DBX
oder aber DI mit DIX.

DB mit DIX ist eigentlich vom Gefühl her blödsinn.

Mfg
Manuel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
P.S. In Step7 kann man mit DIX und Co. nur so arbeiten:
AUF DI200
U DIX200.0

Ein vollqualifizierter Zugriff ist nur mit DB200.DBX200.0 möglich.

Insofern mit höchster Wahrscheinlichkeit, bezogen auf deinen Any-Pointer entweder DIX ohne DB-Nummer, oder DBX mit DB-Nummer.

Mfg
Manuel
 
Hallo MSB

man kann ja nur eine Nummer bzw. 0 in Word 4 von ANY eintragen.

// Quelldaten-Pointer
LAR1 P##L_ptQuelldaten
L B#16#10 // S7-Kennung
T B [ AR1 , P#0.0 ]
L B#16#2 // Datentyp=Byte
T B [ AR1 , P#1.0 ]
L #L_iLaenge // Wiederholfaktor
T W [ AR1 , P#2.0 ]
L DINO <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // DB-Nummer
T W [ AR1 , P#4.0 ]
L #"ADR PA-SelectString 2"// Speicherbereich, Byte/Bit-Adr.
T D [ AR1 , P#6.0 ]

Das geht nicht
P#Di200.DiX94.0 Byte 227 lässt sich nicht Parametrieren

Mit Wert 0 in Word 4 des ANY wird P#DiX94.0 Byte 227
eingetragen, geht aber auch nicht, wird aber von der 300 akzeptiert.
Auch bei direkter Vorgabe mit p#xxxxx geht es nicht, Instanz wird nicht akzeptiert.
 
Hier mal ein Beispiele, dass ich von einem Kollegen übernommen habe.
Vielleicht hilft das ein wenig weiter. tut auf einer 1500-er Dienst.
Es wird ein Any-Struct ausgegeben, der dann manipuliert wird (DB-Nummer wird geändert) und eine AT-Ansicht davon (Any) wird an den Blk_Move(Variant) gelegt.

Schnappschuss (2016-01-08 22.44.40).jpg

PS: Ich seh gerade, rechts im Baustein fehlt am Ende noch:

L W [ AR1 , P#8.0 ]
T #AdressOut.AnyPoint.ByteBitAdr
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Diagnosemeldung besagt "Fehler bei Lesezugriff auf Bereich 0 Adresse 0". Also Zugriff auf Adresse P#0.0 ohne Bereichsangabe.
Kann man in dem TIA zur Fehler-auslösenden Programmstelle gehen? Vielleicht ist das garnicht bei dem BLKMOV?
Wie wird die Adresse in der Variablen #"ADR PA-SelectString 2" berechnet? Kann es sein, daß da auch mal 0 drinsteht wenn BLKMOV aufgerufen wird?

Harald
 
Hmm, müßte BLKMOV fehlerhafte ANY-Pointer (wie P#0.0 ohne Bereichskennung) nicht eigentlich abfangen?
Hast Du vielleicht auch noch indirekte Lese-Operationen mit nicht initialisiertem Pointer/AR1?
Oder pfuscht mal wieder der Compiler?

Harald
 
.. Deine Frage mit dem Offset habe ich nicht ganz verstanden. ..
Dann hast du es wahrscheinlich auch nicht berücksichtigt. Wenn du auf diese Art und Weise auf statische Lokaldaten zugreifst, bzw. auch auf Bausteinparameter eines FBs, dann musst du die Startadresse der FB-Instanz zu den Adressen addieren, dann klappt das auch mit Multiinstanzen. Diese Startadresse steht im AR2.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen


Nochmals kurz zur Erinnerung,
dieses Programm läuft seit ca. einem Jahr auf einer Et 200 S und holt Produktion und Personaldaten von einer SK Interbase Datenbank ab.
Kurz zum Adressregister zwei.
Ich habe des AR2 kurz vor BlokMove ausgelesen, mit dem Wert H 8400 0000 also zeigt er auf einen globalen DB mit der Pointer Adresse null.
Der Instanz DB wird nicht als MultiDB genutzt. Er ist nur Multiinstanzfähig.



Aber egal was ich für eine Adressen eingebe, dies kann nicht zum Absturz der Steuerung führen sondern müsste mit einer Fehlermeldung
beendet werden.(Ret_Val)

Ich mache nach dem Aufruf von BlokMove einem Programmaussprung um sicherzustellen, dass kein nachfolgender Programmcode den Absturz verursacht.
Wenn ich die Bereiche symbolisch übergebe, wird die Anweisung ausgeführt.
Bei der 300 kann immer nur ein Instanz DB geöffnet sein. Bei der 1500 ?


Ich vermute, dass beim Aufruf mit einen ANY Pointer, ein Systemfehler bei BlokMove verursacht wird. Entweder in der CPU oder im Compiler. Werde mich am Montag mit der Hotline in Verbindung setzen, vielleicht weiß ich danach mehr.


Ich bedanke mich nochmals für euren Einsatz. Ich werde auf jeden Fall den Beitrag mit der Fehlerursache ergänzen.


Mit Grüße Waldi


 
Hallo zusammen

Habe das Problem gelöst.:D:D:D:D
Ursache ist die Deklaration des ANY-Pointers.

Bei 300 Datentyp ANY
Bei 1500 Datentyp CONN_ANY
wird dann aber auch falsch übersetzt von der Migration. Habe auch nirgends ein Hinweis darauf gefunden dass das so zu ändern ist.

Sorry War zu schnell geht leider auch nicht.:confused::confused::confused::confused::confused:

Viele Grüße Waldi
 
Zuletzt bearbeitet:
Der Instanz DB wird nicht als MultiDB genutzt. Er ist nur Multiinstanzfähig.
Aufgrund Deines Nichtwissens der Rolle des AR2 bei der Multiinstanz Adressberechnung ist Dein FB vermutlich NICHT multiinstanzfähig. Er ist wohl lediglich als multiinstanzfähig markiert, aber tatsächlich nicht multiinstanzfähig programmiert.


Aber egal was ich für eine Adressen eingebe, dies kann nicht zum Absturz der Steuerung führen sondern müsste mit einer Fehlermeldung
beendet werden.(Ret_Val)
Tut es doch! Wenn Du mal einen Blick auf Deine Bilder wirfst, da sieht man daß der MOVE_BLK_VARIANT einen Fehler meldet.


der Zielbereich ist 2047 Byte lang.
[...]
Ziel P#DB200.DBX457.0 Byte 227
Deine Angaben sind widersprüchlich bzw. ungenau. In den Bildern arbeitest Du mit einer Länge von 243 Byte.

Auf den Bildern rufst Du nicht BLKMOV auf sondern MOVE_BLK_VARIANT. Warum?
Dein Aufruf des MOVE_BLK_VARIANT liefert einen Fehlerstatus -32430 = W#16#8152
Status W#16#8152 bedeutet: Der Operand am Parameter SRC ist nicht typisiert.

Ich kenne die S7-1500 nicht, könnte mir aber aufgrund anderer bekanntgewordener Firmwarefehler und Compilerfehler vorstellen, daß trotz Fehlermeldung ein Zugriff auf die fehlerhafte Adresse ausgeführt wird.

Doch bist Du ganz sicher, daß die fehlerauslösende Programmstelle das BLKMOV bzw. MOVE_BLK_VARIANT ist? Kannst Du die Fehlerstelle eindeutig identifizieren? Verschwindet der Bereichsfehler, wenn Du den Aufruf des MOVE_BLK_VARIANT deaktivierst/überspringst?


Ich kann mir auch noch vorstellen, daß das Problem vielleicht von einer fehlerhaften Verwendung von TEMP-Speicher kommt. Meine Frage in #9 hast Du nicht beantwortet.
Wie wird die Adresse in der Variablen #"ADR PA-SelectString 2" berechnet? Kann es sein, daß da auch mal 0 drinsteht wenn BLKMOV aufgerufen wird?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald


1) es gibt in der 1500 keinen anderen Baustein als in dieser Variante, welcher den SFC20 entspricht.
2) mit der Speicherlänge von 2048 wollte ich nur ausdrücken dass der Zielbereich lang genug ist um nicht ins leere zu springen.
3) Der Instand DB wird nicht als Multiinstanz benutzt . Multiinstanz wird bei der 1500 nur als optimierte Zugriff eingebunden, also symbolisch.


Dieser Instanz DB ist nicht mit optimierten zugriff erzeugt, sodass er feste Adressen hat.
Die Adressen auf die ich springen will sind im DB vorhanden. Bei einem Multi DB spring ich auch nicht ins Leere, sondern nur auf einer falsche Adresse, da er länger ist.

Ich benutze keine Multiinstanz DBs.
Der MoveBlok_Variant auf den du dich beziehst ist ein anderer Typ den es in der 1500 noch gibt.

Der um den es geht, ist der als Text kommentierte BlokMove. Sorry hätte ich besser kommentieren müssen.


Bei dem Versuch diesen Baustein einen ANY Pointer zuzuweisen, stürzt die Steuerung schon beim Aufruf des Bausteins sofort ab.
Ich habe dem ANY Pointer auch einen globalen DB mit fester Adresse zugewiesen. Übergabe als P#DBxxx geht, als Pointer nicht.

Nicht der Inhalt des Pointer ist die Ursache, sondern die Verwendung als Parameter-Übergabe.

Temp nein. Erst zuweisen, dann aufrufen. Typ ist ANY.
Ich benutze ständig in meinen Programmen indirekte Programmierung, kenne mich also schon damit aus.
Übersehen kann jeder mal was.


Gruß Waldi


 
Zuletzt bearbeitet:
Ich habe dir doch hier ein Beispiel gegeben. Damit mache ich das in einer 1500-er.
Klar für Multiinstanzen muß man da noch AR2 beachten, siehe PN/DP, aber ich würde das erstmal ohne Multiinstanz testen und dann, wenn es funktioniert weitergehen.
Das kannst du noch für dich abwandeln.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo
Antwort von der Hotline
Bezogen auf ANY
Indirekte Adressierung ist nur noch Symbolisch möglich. Zwar ging es noch über Umwegen, aber beim nächsten Update kann das zu Problemen führen.
Hinweis von der Hotline!
Warum ist in STEP 7 (TIA Portal) V12 die Mischung vonRegisterpassing und expliziter Parameterübergabe bei der S7-1500 nicht möglich?

https://support.industry.siemens.com/cs/de/de/view/67655405

Gruß Waldi
 
Hallo
Antwort von der Hotline
Bezogen auf ANY
Indirekte Adressierung ist nur noch Symbolisch möglich. Zwar ging es noch über Umwegen, aber beim nächsten Update kann das zu Problemen führen.
Hinweis von der Hotline!
Warum ist in STEP 7 (TIA Portal) V12 die Mischung vonRegisterpassing und expliziter Parameterübergabe bei der S7-1500 nicht möglich?

https://support.industry.siemens.com/cs/de/de/view/67655405

Gruß Waldi

Jetzt wenn du dem geneigten Mitleser noch mitteilst, was deine Antwort sowie dein Link mit deinem Problem zu tun haben sollen ...?

Wenn das was du da machst, sprich einen BLKMOV (nicht MOVE_BLK_VARIANT wie von Harald erkannt) zukünftig zu Problemen führt,
dann war lapidar gesprochen Siemens bei einem Firmware-Update mal wieder zu dämlich, was leider eine immer häufiger zutreffende Variante zu sein scheint.

Mfg
Manuel
 
Hallo Manuel

habe das Beispiel von Ralle ausprobiert. Ist allerdings etwas schwer zu verstehen. Nicht aus mangelnden Kenntnissen,
sondern an fehlenden Informationen. Aus einer Symbolik alleine lässt sich nicht alles erkennen.
Es ist ja nur ein Teilauszug, den man nicht zurück verfolgen kann. Aber das Ergebnis war das Selbe.
Der Link verweist auf Handbücher. Unter anderem geht es auch um das LAR1 + AR2 mit den Hinweis, dass die korrekte Ausführung der Funktion nicht mehr unterstützt wird.
Den genaueren Textinhalt bitte selber nachlesen. Die 1500 ist von Siemens auf Symbolik ausgerichtet. BlokMove kann in SCL problemlos verwendet werden.
Außerdem wurde es von der Hotline an einen Beispiel-Programm nachvollzogen, mit der Aussage, dass es nicht mehr unterstützt wird.

Ich gebe nur die Info von der Hotline weiter.
Du spricht immer wieder von MoveBlok. Ich habe doch in diesen Beitrag darauf verwiesen, dass es sich um den geklammerten BlokMove handelt.
Öffne doch bitte TIA und rufe den Baustein mit der Anweisung call SFC20 auf und es wird genau dieser erscheinen.
MoveBlok kann nur Array mit gleichen Tatentypen umkopieren.

Noch ein Hinweis in eigener Sache. Die Zitathinweise mit dem Gesamtauszug finde ich nicht sehr hilfreich.
Stattdessen wäre es besser, die Einwende mit Fragen des Sachinhaltes zu stellen bzw. zu beantworten. Diese müssen nicht immer 100% korrekt sein.
Auch wage Vermutungen oder Hinweise können manchmal weiterhelfen.
Mit Grüßen Waldi
 
Zuletzt bearbeitet:
Zurück
Oben