SCL: DB-Bereiche umkopieren

dinner4one

Level-1
Beiträge
44
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Forum,

ich suche nach einer einfachen Möglichkeit aus einem F-DB eine Anzahl von Worten einzulesen und diese in ein UDT eines normalen DBs zu schreiben.
Z.B.

VAR_INPUT
OFFSET : Pointer; //Zeiger auf das Startwort
END_VAR
VAR_OUTPUT
ZIEL : UDTxy;
END_VAR

ZIEL.Word1 := OFFSET + 0
ZIEL.Word2 := OFFSET + 1

...ist das möglich? Wie würde der Syntax aussehen?
 
Hallo d4o,
das geht in SCL sogar sehr schön :
Code:
VAR_OUTPUT
    Daten        : UDT1 ;   // UDT Status Station
       a_Daten AT Daten : ARRAY [1..5] OF WORD ;
END_VAR
VAR_TEMP
    DB_Pointer   : INT ;
    i            : INT ;
    j            : INT ;
END_VAR

BEGIN
FOR i := 1 TO 5 BY 1 DO
      j := (i -1) * 2 ;
      a_Daten [i] := WORD_TO_BLOCK_DB (w_DB).DW [DB_pointer + j] ;
END_FOR ;
END_FUNCTION
im skizzierten Fall ist der UDT 5 Worte groß ...

und umgekehrt geht es so ähnlich ...
Code:
VAR_INPUT
    Daten        : UDT1 ;   // UDT Status Station
       a_Daten AT Daten : ARRAY [1..5] OF WORD ;
END_VAR

VAR_TEMP
    DB_Pointer   : INT ;
    i            : INT ;
    j            : INT ;
END_VAR
 
BEGIN
FOR i := 1 TO 5 BY 1 DO
       j := (i -1) * 2 ;
       WORD_TO_BLOCK_DB (w_DB).DW [DB_pointer + j] := a_Daten [i] ;
END_FOR ;
END_FUNCTION
ich habe dir in den Beispielen die Zuweisung von w_DB (WORD) und DB_Pointer (INT) unterschlagen. Ich denke, die Lücke kannst du selber füllen ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
...ja das ist verstanden.

Ich hatte an etwas gedacht das mir das Parametrieren meiner Funktion erleichtert.

Wenn ich in VAR_INPUT eine BLOCK_DB Variable nehme kann ich leider nicht gezielt, in dem sich öffnenden Auswahlfenster des Editors, ein Wort in einem DB auswählen sondern nur den DB selbst. Somit muss ich für den Offset des Wortes eine 2. INPUT-Variable benutzen. Ich möchte beides mit einem INPUT realisieren und aus diesem Wert den DB + Wordoffset ermitteln. Daher dachte ich es lässt sich über einen POINTER erledigen - denn wenn ich damit das Auswahlfenster öffne kann ich die DBs (mit +) öffnen und darin ein beliebiges Wort auswählen. Dann sollte in dem Pointer eigentlich soetwas wie "DBxy.DWxy" stehen. Ich habe aber keine Ahnung wie ich aus dem POINTER die DB-Nummer und den WORD-Offset generiere.

puhh, hoffe ich konnte mich verständlich machen.
 
puhh, hoffe ich konnte mich verständlich machen.

Na klar ...
Hier heißt dein Stichwort ANY-POINTER. Hierzu gibt es ein sehr schönes Beispiel von Volker in der Rubrik FAQ. Aber zum Thema SCL habe ich da auch noch einen Code-Schnipsel ...
Code:
VAR_INPUT
  DB_Pointer      : ANY ;    // Zeiger auf Datenbaustein / -Adresse
END_VAR

VAR_TEMP
  DB_Ziel : word ;
  DB_Ziel_DW : INT ;
  
  xAny : STRUCT
         ID_Code   : BYTE ;
         DataTyp   : BYTE ;
         Anzahl    : WORD ;
         DB_Nr     : WORD ;
         SpeicherPtr : DWORD ;
  END_STRUCT ;
  hAny AT xAny : ANY ;
END_VAR

BEGIN
   hAny := DB_Pointer ;
   DB_Ziel := xAny.DB_Nr ;
   DB_Ziel_DW := DWORD_TO_INT(xAny.SpeicherPtr AND dw#16#00FF_FFFF) / 8 ;
END_FUNCTION
Kommst du damit weiter ...?
 
... ach ja, ich vergaß ...
die Übergabe an die Funktion erfolgt nun mit P#DB100.DBW10 (z.B.)
oder p#DB100.DBX10.0 BYTE 20 (für einen Bereich).

Gruß
LL
 
Zurück
Oben