ANY Pointer auf Array of Real im Instanz-DB

Potz Blitz

Level-1
Beiträge
6
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin moin

ich habe einen Multiinstanzfähigen Instanz-FB.

In den statischen Variablen habe ich ein ARRAY[1..500] of REAL angelegt. Das Array soll sich wie ein Schieberegister verhalten. Das heißt, ich kopiere per SFC20 die Bytes die Felder 1-499 an 2..500.

Hierfür baue ich mir einen ANY auf die Quelle und einen aufs Ziel. Aber irgendwie schiebt mir der SFC20 die REALS nicht einen Schritt weiter, sonder macht murks (meldet aber keinen Fehler). Könnt Ihr da mal draufgucken? Baue ich den Pointer falsch?

Code:
      LAR1  P##P_ANY_Quelle        // Pointer ins Adressregister 1
      L     W#16#10
      T     LB [AR1,P#0.0]
      L     W#16#8                      // HEX08 für REAL
      T     LB [AR1,P#1.0]
      L     499                             // Pointerbreite (Anzahl Elemente im Array minus eins)
      T     LW [AR1,P#2.0]
      L     DINO                           // Lade Instanz-DB Nr. in Akku 1
      T     LW [AR1,P#4.0]
      L     54                              // Anfangsadresse im DB (Startadresse des Arrays]
      SLD   3
      T     LD [AR1,P#6.0]
      L     B#16#85                     // Speicherbereich => HEX85 für Instanz-DB
      T     LB [AR1,P#6.0]



     LAR1  P##P_ANY_Ziel            // Pointer ins Adressregister 1
      L     W#16#10
      T     LB [AR1,P#0.0]
      L     W#16#8                      // HEX08 für REAL
      T     LB [AR1,P#1.0]
      L     499                             // Pointerbreite (Anzahl Elemente im Array minus eins)
      T     LW [AR1,P#2.0]
      L     DINO                           // Lade Instanz-DB Nr. in Akku 1
      T     LW [AR1,P#4.0]
      L     58                              // Anfangsadresse im DB (Startadresse des Arrays + 4 Bytes]
      SLD   3
      T     LD [AR1,P#6.0]
      L     B#16#85                     // Speicherbereich => HEX85 für Instanz-DB
      T     LB [AR1,P#6.0]

      CALL  SFC   20
       SRCBLK :=#P_ANY_Quelle
       RET_VAL:=#RETVAL
       DSTBLK :=#P_ANY_Ziel
 
Ich habe das irgendwie so in Erinnerung, dass der SFC keine überlappenden Speicherbereiche mag.
Ich wüßte jetzt auch nicht, wie der so etwas intern lösen können sollte.

Mir würde hier nur einfallen, die ganze Sache in einer Schleife zu verarbeiten.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

mal ein Auszug aus der Hilfe von SFC20.

Bedingungen für Quell- und Zielfeld
Quell- und Zielfeld dürfen sich nicht überlappen. Ist das angegebene Zielfeld größer als das Quellfeld, dann werden auch nur so viele Daten in das Zielfeld kopiert, wie im Quellfeld stehen.

Sollte eigentlich klar sein. Ich würde es auch über ein kleine Schleife lösen. Ist ja gleich programmiert.
 
Dann mußt du dir den Quell-Speicher erst irgendwo anders hinkopieren und dann von dort aus auf den um eins versetzten Ziel-Speicher.
Ohne es jetzt nachgesehen zu haben würde ich sagen, dass du da zeitmäßig mit der Schleife besser wegkommst.

Du mußt aber selber wissen, was du tust ...
 
Zurück
Oben