TIA WString über TCP senden...

Jochen Kühner

Level-3
Beiträge
4.488
Reaktionspunkte
728
Zuviel Werbung?
-> Hier kostenlos registrieren
Wir senden bei uns als Visu Schnittstelle die Programmalarme über TCP.

Im Moment machen wir dies noch als Codepage 1052, jedoch bräuchten wir nun den UTF16 Text.

Wir hatten immer Strg_TO_Chars verwendet um den Text in unser Sende Byte-Array einzutragen.

Wie machen wir das nun am besten mit dem WString?
 
Moin Jochen, ich weiss nicht, ob Dir das weiterhilft.
Wenn das Problem in der doppelt so lange StringLänge (weil 2 Byte pro Zeichen) liegt, könntest Du den WString vorab "halbieren".
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bis zu voraussichtlich welcher TIA Version müsste er da warten? ;)

Harald


uuuups.... :rolleyes: sorrrryyyy.... man sollte gucken, in welchem Forum der Thread steht :cool:

2. Versuch:
Mit einer Schleife durch den WString gehen und alle Zeichen einzeln über ein WChar mit WCHAR_TO_WORD konvertieren. Das Word kann dann in zwei Byte zerlegt werden und in einem Array of Byte gespeichert werden.
 
Ungetestet, da ich gerade kein TIA zur Hand habe:


Code:
VAR
      wsString : WSTRING[20];
      temp_wcChar : WCHAR;
      temp_bLByte  : BYTE;
      temp_bHByte : BYTE;

      abByte : ARRAY[1..40] OF BYTE;

      x : INT;
      y : INT;
END_VAR;


#y := 1;
FOR #x := 1 TO 20 DO
      #temp_wcChar := #wsString[#x];
      #temp_bLByte  := WORD_TO_BYTE(W#16#00FF AND WCHAR_TO_WORD(#temp_wcChar));
      #temp_bHByte  := WORD_TO_BYTE(SHR(IN:=(W#16#FF00 AND WCHAR_TO_WORD(#temp_wcChar)), N:=8));

      #abByte[#y] := #temp_bLByte;
      #y := #y+1;
      #abByte[#y] := #temp_bHByte;
      #y := #y+1;
END_FOR;
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ungetestet, da ich gerade kein TIA zur Hand habe:


Code:
VAR
      wsString : WSTRING[20];
      temp_wcChar : WCHAR;
      temp_bLByte  : BYTE;
      temp_bHByte : BYTE;

      abByte : ARRAY[1..40] OF BYTE;

      x : INT;
      y : INT;
END_VAR;


#y := 1;
FOR #x := 1 TO 20 DO
      #temp_wcChar := #wsString[#x];
      #temp_bLByte  := WORD_TO_BYTE(W#16#00FF AND WCHAR_TO_WORD(#temp_wcChar));
      #temp_bHByte  := WORD_TO_BYTE(SHR(IN:=(W#16#FF00 AND WCHAR_TO_WORD(#temp_wcChar)), N:=8));

      #abByte[#y] := #temp_bLByte;
      #y := #y+1;
      #abByte[#y] := #temp_bHByte;
      #y := #y+1;
END_FOR;


das geht, übersetzt zumindest...
gibts den keine anweisung umd das einfach byte für byte zu kopieren?
BLK_MOVE geht halt nicht da der baustein auf optimiert steht, aber optimiert ändert ja keine byteanordnung innerhalb eines strings oder arrays, oder?
 
Muss mal prüfen ob das geht:

Code:
#ret := Serialize(SRC_VARIABLE := #wsString, DEST_ARRAY => #bytes, POS := #pos);

und ob es schneller als die schleife ist...
 
Zuletzt bearbeitet:
Was mich an Serialize/Deserialize stört, das Siemens nirgends dokumentiert hat wie dieser z.B. strukturen zerlegt und wieder zusammenbaut, d.h. welches element an welcher bytestelle steht. Ich wollte das auch auch schon für Kopplungen nutzen, doch war es uns dann zu unklar.
Mit einem WString werden wir es nun mal testen.
Aber wenn ich schon wieder sehe wie umständlich so was einfaches bei siemens ist, wenn man nicht auf die symbolischen Programmierung verzichten möchte...

Ref To geht natürlich auch nur mit dem gleichen Datentyp
 
Und Serialize/Deserialize sind meine ich ganz schöne Rechenzeitfresser. Es muss ja während der Runtime die Typinformation ausgelesen werden um zu sehen was damit getan werden muss.

Ist halt die Frage was schneller ist? 3 Schleifen über jeweils um die 300 Zeichen mit dem Code oben, oder 3 mal Serialize...

Wie macht Ihr das sonst alle mit Unicode?
Nutzt jemand das Meldesystem von Siemens oder sind alle noch bei Bitmeldungen?
Problem ist Siemens Meldesystem, aber nicht Siemens Visu...
 
Zurück
Oben