Step 7 BLKMOV mit Pointer für STRING in SCL

patteb

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo alle zusammen, ich habe folgendes Problem:
Ich möchte per BLKMOV einen String aus DB4 in DB3 kopieren, die geforderten Pointer habe ich mir mit mit einer Struct selbst gebastelt.

Code:
FUNCTION SFC20Tester:int
    VAR_TEMP
        ret: INT;
        temp:INT;
        pSRC : ANY; // analog zu pDST
        pAnySRC AT pSRC :
            STRUCT
                S7Code : BYTE;
                DataType : BYTE;
                Length : INT;
                DBNumber : INT;
                MemoryArea : BYTE;
                ByteAddressMSB : BYTE;
                ByteAddressLSB : WORD;
            END_STRUCT;
        pDST : ANY; // analog zu pDST
        pAnyDST AT pDST :
            STRUCT
                S7Code : BYTE;
                DataType : BYTE;
                Length : INT;
                DBNumber : INT;
                MemoryArea : BYTE;
                ByteAddressMSB : BYTE;
                ByteAddressLSB : WORD;
            END_STRUCT; 
    END_VAR
    
    
    BEGIN
    //Füttern der Pointer mit schon bekannten Werten
    pAnySRC.S7Code := 16#10;   //Fixer Wert
    pAnySRC.DataType := 16#13; //String
    pAnySRC.Length := 256;     //Gesamte Stringlänge
    pAnySRC.DBNumber := 4;
    pAnySRC.MemoryArea := 16#84;   //Speicherbereich DB
    pAnySRC.ByteAddressMSB:=0;
    pAnySRC.ByteAddressLSB:=INT_TO_WORD(1316*8);
    
    pAnyDST.S7Code := 16#10;   //Fixer Wert
    pAnyDST.DataType := 16#13; //String
    pAnyDST.Length := 256;     //Gesamte Stringlänge
    pAnyDST.DBNumber := 3;
    pAnyDST.MemoryArea := 16#84;   //Speicherbereich DB
    pAnyDST.ByteAddressMSB:=0;
    pAnyDST.ByteAddressLSB:=INT_TO_WORD(790*8);
    
    temp:=BLKMOV(SRCBLK := pSRC,
                        RET_VAL:=ret,
                            DSTBLK := pDST);
                            
     SFC20Tester:=ret;
END_FUNCTION


Sieht jemand meinen Fehler? Wenn ich das testweise umbaue und INT kopiere, geht es ohne Probleme.
Das Funktion liefert meist den Rückgabewert dez. 1834 bzw. hex 72A (daraus werde ich aber nicht besonders schlau).

Ich danke schonmal für eure Hilfe!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für deine schnelle Antwort, aber leider hatte das nicht den gewünschten Effekt. Würde mich auch wundern, dann "fehlen" ja quasi die beiden Header-Felder des Strings.
Ich hab auch schon ausprobiert, als DataType Byte anzugeben (16#02), weil BLKMOV ja anscheinend Strings wie Array of Byte verschiebt.
 
Kannst du zum Testen alles in einen FB schieben und mit statischen, anstatt lokalen Variablen arbeiten.
Möglicherweise sind die Lokaldaten "voll".

Kannst unter Eigenschaften des FC nachlesen.
 
Ich hab meine "Probleme" gefunden:
1. Wenn ich als Typ String angebe, dann ist length:=1
2. und das ist mir extrem peinlich: ich hab versucht die Änderung in der DB3 im "Beobachten"-Modus nachzuvollziehen. Das geht für Strings aber nicht. Tja, typischer Anfängerfehler. Hab mir stattdessen in einer Variablentabelle die einzelnen Bit angesehen, und die ändern sich auch. Ob die so Sinn ergeben, weiß ich so allerdings noch nicht
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du kannst zur Überprüfung die einzelnen DBBs in der VAT beobachten als char.
PS: Ich habe Fehler von blockmove erhalten, wenn das Ziel inden temporären Lokaldaten der FC lag. Statische Lokaldaten (IDB) bzw Global-DBs machen hingegen keine Probleme.
 
Zuletzt bearbeitet:
Ja, hab das mit der VAT überprüft, es läuft soweit :)

Ich versteh deine zweite Aussage nicht ganz: Die Daten selber gehen ja gar nicht in die Function, sondern nur die Pointer
 
"Ich habe Fehler von blockmove erhalten, wenn das Ziel inden temporären Lokaldaten der FC lag."

Das war bei mir häufig die Fehlerursache (wobei ich nicht verstehe, warum blkmov das nicht kann. liegt das daran dass der so adressierte Tempbereich aus sicht des Blkmov die temporären Vorgänger-Lokaldaten sind (V)?). Das ist bei dir aber nicht der Fall.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
BLKMOV kann problemlos in den TEMP-Bereich des Aufrufers kopieren. Wenn es bei Dir nicht ging dann solltest Du uns mal Deinen Code zeigen.

Vielleicht ist es ja was ganz simples, wie z.B. wenn im Code in #1 pAnyDST statt pDST am BLKMOV stehen würde, dann würde es auch nicht funktionieren. Oder war die Kopiermenge zu groß für Deinen TEMP-Bereich?

Harald
 
Zurück
Oben