Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 9 von 9

Thema: BLKMOV mit Pointer für STRING in SCL

  1. #1
    Registriert seit
    19.09.2014
    Beiträge
    4
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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!
    Zitieren Zitieren BLKMOV mit Pointer für STRING in SCL  

  2. #2
    Registriert seit
    19.06.2008
    Ort
    Ostalbkreis
    Beiträge
    3.140
    Danke
    201
    Erhielt 553 Danke für 498 Beiträge

    Standard

    Versuch mal Länge:= 254

  3. #3
    patteb ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    19.09.2014
    Beiträge
    4
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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.

  4. #4
    Registriert seit
    19.06.2008
    Ort
    Ostalbkreis
    Beiträge
    3.140
    Danke
    201
    Erhielt 553 Danke für 498 Beiträge

    Standard

    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.

  5. Folgender Benutzer sagt Danke zu Verpolt für den nützlichen Beitrag:

    patteb (03.03.2015)

  6. #5
    patteb ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    19.09.2014
    Beiträge
    4
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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

  7. #6
    Registriert seit
    25.03.2012
    Beiträge
    314
    Danke
    60
    Erhielt 9 Danke für 8 Beiträge

    Standard

    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.
    Geändert von Flux (04.03.2015 um 17:52 Uhr)

  8. #7
    patteb ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    19.09.2014
    Beiträge
    4
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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

  9. #8
    Registriert seit
    25.03.2012
    Beiträge
    314
    Danke
    60
    Erhielt 9 Danke für 8 Beiträge

    Standard

    "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.
    We must all suffer from one of two pains: the pain of discipline or the pain of regret. The difference is discipline weighs ounces while regret weighs tons.

  10. #9
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.314
    Danke
    932
    Erhielt 3.327 Danke für 2.688 Beiträge

    Standard


    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
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

Ähnliche Themen

  1. Sonstiges Instanz DB in Global DB verschieben - blkmov in SCL
    Von newirobi im Forum Simatic
    Antworten: 12
    Letzter Beitrag: 23.08.2014, 19:06
  2. TIA Pointer am INPUT mit SCL zerlegen?
    Von PlutoRB im Forum Simatic
    Antworten: 15
    Letzter Beitrag: 21.01.2014, 23:19
  3. BLKMOV, ein FB und der Any-Pointer
    Von Krumnix im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 11.06.2009, 09:18
  4. blkmov in SCL
    Von Felse im Forum Simatic
    Antworten: 31
    Letzter Beitrag: 25.03.2009, 14:20
  5. SCL Beispiel für ANY Pointer Bearbeitung
    Von clweb im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 18.08.2008, 20:38

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •