Array Bereich in SCL in String wandeln

hubert

Level-2
Beiträge
401
Reaktionspunkte
26
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo SPS Freunde.

Habe male eine Frage? Wie kann ich folgenden Bereich in SCL in eine STRING wandeln. Dieser Ausschnitt stammt von einem FB.

VAR
Kartencode : STRUCT
Code_Anfang_16h02 : BYTE; // Beginnzeichen Codekarte 16#02
Code_Nr : ARRAY [1..10] OF BYTE; // Kartennummer
Code_CR_13 : BYTE; // Carray Return 13
Code_LF_10 : BYTE; // Line feed
Code_Ende_16h03 : BYTE; // Endezeichen Codekarte 16#03
END_STRUCT;

Was ich in eine STRING umwandeln möchte ist das komplette ARRAY Kartencode.Code_Nr [1..10] of Byte.
Habe es nun mit verschiedenen Möglichkeiten probiert aber ich bekommen es einfach nicht ohne Fehler hin. Könntet Ihr mir vieleicht weiterhelfen wäre dringend? In AWL darf in nicht schreiben, denn es ist SCL gefordert, fragt aber nicht wiso.
 
Hi,
einfach mit Blockmove kopieren.
Wobei "ret_SFC" bei dir unter Var oder Var_Temp als INT deklariert sein muss.
Würde bei dir etwa so aussehen:

ret_SFC := BLKMOV(SRCBLK:=Kartencode.Code_Nr, DSTBLK := DEIN_STRING);

Gruss Zefix
 
Zuviel Werbung?
-> Hier kostenlos registrieren
wenn es dir darum geht das array an eine andere stelle zu kopieren dann so wie zefix schreibt.

sollten die einzelnen bytes aus zahlen bestehen die du in einen string wandeln möchtest, schau die die fc5,16,30 aus den IEC an.

beachte, das du das verwaltungsbyte vorher belegen musst.

in awl sieht das dann so aus
Code:
temp: strg String[7] 0.0
 
      L     7                           //dem verwaltungsbyte die länge des strings übergeben
      T     LB     0
      CALL  FC     5                    //DI_STRING
       I      :=L#-678901
       RET_VAL:=#strg
      NOP   0
willst du einen string mit sfc20 kopieren....
Code:
      CALL  SFC   20
       SRCBLK :=P#L 0.0 BYTE 9          //muss 2 länger sein als der string
       RET_VAL:=MW10
       DSTBLK :=P#DB10.DBX0.0 BYTE 9
      NOP   0
 
Hi,

Hubert wollte ja ein Beispiel für SCL.

Bin mir jetzt nicht sicher, aber eine direkte Zuweisung funktioniert evtl. auch:

Dein_String:=Kartencode.Code_Nr ;

Der String darf jedenfalls nicht kürzer sein als dein "Kartencode.Code_Nr"

Gruss Zefix
 
Hallo Zefix und Volker.

Habe die SCL Version mit BLKMOV (SCF20) ausprobiert und es funktionierte Super. Das ist genau das was ich haben wollte.
Code:
VAR
Kartencode : STRUCT
Code_Anfang_16h02 : BYTE; // Beginnzeichen Codekarte 16#02
Code_Nr : ARRAY [1..10] OF BYTE; // Kartennummer
Code_CR_13 : BYTE; // Carray Return 13
Code_LF_10 : BYTE; // Line feed
Code_Ende_16h03 : BYTE; // Endezeichen Codekarte 16#03
END_STRUCT;
STRING_Card : STRING [10];
END_VAR
BEGIN
RET_VAL_BLOCKMOV := BLKMOV (SRCBLK:=Kartencode.Code_Nr, DSTBLK := STRING_Card);

Die andere Version wie von Zefix vorgeschlagen Funktioniert leider nicht:
Code:
STRING_Card := Kartencode.Code_Nr ;
Dies wir immer beim übersetzen mit dem Fehler "Unterschiedlich Datentyp beendet".

Ich bedanke mich bei schon mal für eure schnelle Hilfe. Kann aber sein, das ich noch fragen habe, da ich in SCL noch nicht so gewandet bin.
 
Zurück
Oben