String aus Strings und Bytes

HarryHirn

Level-1
Beiträge
15
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

ich habe es mit der Suchfunktion und Google versucht zu lösen, aber ich komme nicht auf einen grünen Zweig...

Ich möchte einen String zusammenbasteln, welche ich über RS422 verschicke.

Das Ganze ergibt eine Anweisung an ein Gerät und soll so aussehen:

'#1y3$R'

# ist Startzeichen, 1 ist die ID des Motors, y der Befehl, 3 ist ein Verfahrsatz der geladen wird und $R ist Endzeichen.

Ich möchte nun die ID und den Verfahrsatz übergeben.

Dazu habe ich eine Variable ID und eine Variable Satz jeweils vom Typen Byte, weil beides nicht größer als 32 wird...

Ich habe versucht den String mit CONCAT zusammen zu bauen, aber BYTE_TO_CHAR(ID) gibt mir immer eine führende 0 mit so dass heraus kommt:
'#01y03$R'

Wie kriege ich das zusammengebastelt ohne die führenden 0 en?

Danke!
 
Hi!

Das wollte ich dich im anderen Thread schon fragen.
Warum nimmst du eigentlich als Datentyp "Char". Kannst du nicht ein Array of BYTE verwenden?

Die Zeichen stehen da dann zwar als Hex angezeigt, aber damit tust du dich doch mit Zusammensetzen von Nachrichten leichter.
Zudem sind die Operationen bestimmt performanter wenn du als Datentyp "Byte" verwendest.


Gruß,

Ottmar
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,
ich hab mal etwas ausprobiert. Ist etwas umständlich, funktioniert aber.


Code:
FUNCTION_BLOCK FB 1
TITLE =
VERSION : 0.1

VAR
  VerfahrString : STRING  [7 ];    
  MotorID : INT ;    
  Verfahrsatz : INT ;    
  WertAlsString : STRING  [254 ];    
  StartCode : STRING  [1 ] := '#';    
  BefehlsCode : STRING  [1 ] := 'y';    
  EndCode : STRING  [1 ] := '$R';    
END_VAR

BEGIN

NETWORK
TITLE =

      L     7; 
      T     DB1.DBB    0; 

      L     0; 
      T     DB1.DBB    1; 

      CALL "CONCAT" (
           IN1                      := #VerfahrString,
           IN2                      := #StartCode,
           RET_VAL                  := #VerfahrString);

      CALL "I_STRNG" (
           I                        := #MotorID,
           RET_VAL                  := #WertAlsString);

      CALL "DELETE" (
           IN                       := #WertAlsString,
           L                        := 1,
           P                        := 1,
           RET_VAL                  := #WertAlsString);

      CALL "CONCAT" (
           IN1                      := #VerfahrString,
           IN2                      := #WertAlsString,
           RET_VAL                  := #VerfahrString);

      CALL "CONCAT" (
           IN1                      := #VerfahrString,
           IN2                      := #BefehlsCode,
           RET_VAL                  := #VerfahrString);

      CALL "I_STRNG" (
           I                        := #Verfahrsatz,
           RET_VAL                  := #WertAlsString);

      CALL "DELETE" (
           IN                       := #WertAlsString,
           L                        := 1,
           P                        := 1,
           RET_VAL                  := #WertAlsString);

      CALL "CONCAT" (
           IN1                      := #VerfahrString,
           IN2                      := #WertAlsString,
           RET_VAL                  := #VerfahrString);

      CALL "CONCAT" (
           IN1                      := #VerfahrString,
           IN2                      := #EndCode,
           RET_VAL                  := #VerfahrString);


END_FUNCTION_BLOCK

Mit Delete wird das führende Vorzeichen gelöscht.
CONCAT setzt die Strings zusammen.

Ein paar Bytes hin und her kopieren geht natürlich auch anders mit viel weniger Rechenaufwand.

Gruß
Holger
 
hmm, ich werde das morgen auf der arbeit mal ausprobieren, aber wechseln auf ein Byte Array zum Senden und Empfangen ist sicher die klügere wahl.

Das mit dem Char Array ist ein Relikt aus den ersten Gehversuchen, als ich noch mit den Zeichen hantiert habe, da die Nanotec Steuerung ja Zeichenketten sendet.
Aber im Prinzip ist es ja egal, ob ich auf Chars oder auf Hexwerte prüfe :)

Aber irgendwie stellt mich diese Automatisierungssache immer wieder vor neuen Problemen.
Dachte nicht das wird so schwierig... in C fällt mir da immer sofort was ein :)
 
Wenn du auf ein Char-Array wechselst, kannst du auch die Wandlung von Int zu String sparen. Du hast ja nur eine Stelle, also Ziffern von 0-9. Dann nimmst du einfach die Int, addierst 48 dazu und hast den Char-Wert dieser Int. Diesen Char-Wert trägst du dann in die entsprechende Zelle ein.

asciitab.gif
 
Zurück
Oben