TIA SCL CHARs to Word

vollmi

Level-3
Beiträge
5.436
Reaktionspunkte
1.409
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi zusammen

Ich habe hier ein Verständnisproblem in SCL.

Ich habe einen Baustein in Step7 in dem ich Telegrammeteile zusammengestellt habe. Dafür musste ich immer zwei Zeichen in ein Word kopieren.

Code:
VAL:  L     'IO'    // zwei Zeichen       
T     #RM_new   // direkt ins Word.

Ich würde gerne dasselbe in SCL machen. nur komme ich mit der Konvertierung nicht klar.
also in etwa so.
Code:
  #RM := 'IO';

Nur diese Implizierte Konvertierung will er nicht akzeptieren. Irgendwie verständlich da 'IO' ja eigentlich ein String ist.
Step7 in AWL hat das aber noch so akzeptiert und hat einfach die zwei aufeinanderfolgenden Zeichen ins Word geschoben und die überflüssigen Bytes ignoriert.

Jemand einen Tip wie ich das möglichst übersichtlich rüberkriege?

mfG René
 
Servus,

ich glaube ich hätte einfach die ASCII-Werte ins Word geschrieben. Dahinter dann den String als Kommentar.
#RM:= 16#494F; // 'IO'

Alternativ kannst du natürlich auch die Konvertierungsfunktionen nutzen. Dies bedeutet allerdings mehr Programmieraufwand und ob es damit wirklich klarer wird bezweifle ich auch.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo René,

wenn du das häufiger brauchst dann olltest du dir dafür eine Funktion (selbst) erstellen, die dir den String (ggf. vielleicht sogar noch mit der Angabe ab welcher Position im String) in einen WORD-Wert konvertiert.
Das müßte dann Zeichen für Zeichen passieren (also ASCII-Code des ersten Zeichens lesen, mal 256, ASCII-Code des 2. zeichens lesen, dazuaddieren).

Gruß
Larry
 
Oder so:
Code:
#RM := SHL(IN := BYTE_TO_WORD(CHAR_TO_BYTE('I')), N := 8) OR CHAR_TO_BYTE('O');

Der Step 7 Compiler ist doch so schlau, dass er daraus in AWL ein:
Code:
      L     W#16#494F
      T     #RM
erzeugt.
 
Danke euch.

Ich hab das jetzt so verpackt.
Code:
FUNCTION "DCHAR_TO_WORD" : Word
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
   VAR_INPUT 
      IN : String;
      input AT IN : Struct
         len0 : Byte;
         len1 : Byte;
         Zeichen1 : Char;
         Zeichen2 : Char;
      END_STRUCT;
   END_VAR

   VAR_TEMP 
      Zeichen1 : Char;
      Zeichen2 : Char;
   END_VAR


BEGIN
	#DCHAR_TO_WORD := SHL(IN := BYTE_TO_WORD(CHAR_TO_BYTE(#input.Zeichen1)), N := 8) OR CHAR_TO_BYTE(#input.Zeichen2);
	                                                                                    
END_FUNCTION

und so aufgerufen
Code:
  #RM := "DCHAR_TO_WORD"('AL');

mfG René
 
@vollmi

http://support.automation.siemens.c...erm=slice+zugriffe&ID=57374718&ehbid=57374718

Schau dir mal die Slicefunktion an, die kann deine Aufgabe denk ich deutlich vereinfachen bzw. es lesbarer machen.

Code:
FUNCTION "DCHAR_TO_WORD" : Word
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
   VAR_INPUT 
      IN : String;
      input AT IN : Struct
         len0 : Byte;
         len1 : Byte;
         Zeichen1 : Char;
         Zeichen2 : Char;
      END_STRUCT;
   END_VAR

   VAR_TEMP 
      Zeichen1 : Char;
      Zeichen2 : Char;
      tWord : Word;
   END_VAR


BEGIN
    tWord.b1 := CHAR_TO_BYTE(#input.Zeichen1);
    tWord.b0 := CHAR_TO_BYTE(#input.Zeichen2);
    #DCHAR_TO_WORD := tWord;                                                                                   
END_FUNCTION

MfG Michi
 
Zurück
Oben