Array of Char umwandeln?

thomzur

Level-1
Beiträge
2
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen

Bin neu hier im Forum und habe folgendes Problem:

Ich habe an einer 313C mit einem CP340 einen Laser-Distanzsensor angeschlossen. Die Kommunikation erfolgt mittels ASCII-Protokoll. Nun werden die Messwerte in einen Datenbaustein gesendet.
Das Format der Zeichen ist Char und die werden einzeln in einem Array abgelegt.

Eine Antwort vom Laser sieht etwa folgendermassen aus:

'g' '0' 'q' '+' '0' '0' '0' '0' '2' '5' '8' '2' '&r' '&l'

wobei die Zeichenfolge "g0q+" die Antwort auf ein Kommando und "00002582" den Messwert (in 0.1mm) darstellt. Der Schluss ist die Terminierung.

Nun das Problem ist mit diesen Zeichen im Charformat kann ich nicht weiterarbeiten. Ich sollte mit dem Messwert rechnen und vergleichen können, bräuchte also irgendein Zahlenformat wie INT oder so.

Habe bis jetz mal den Messwert alleine ohne "g0q+" und Terminierung in einen neuen DB geladen (aber immer noch als Char halt...)

Kann mir da jemand weiterhelfen wie ich daraus ein verwertbares Resultat machen kann? Das Ganze ist für eine Positionssteuerung eines Hallenkranes gedacht...

Der Link zum Lasersensor: http://www.dimetix.ch/Products/DE/_FRM_DLS_B_DE.html

Besten Dank und Gruss

Thomas
 
Hallo zusammen

Bin neu hier im Forum und habe folgendes Problem:

Ich habe an einer 313C mit einem CP340 einen Laser-Distanzsensor angeschlossen. Die Kommunikation erfolgt mittels ASCII-Protokoll. Nun werden die Messwerte in einen Datenbaustein gesendet.
Das Format der Zeichen ist Char und die werden einzeln in einem Array abgelegt.

Eine Antwort vom Laser sieht etwa folgendermassen aus:

'g' '0' 'q' '+' '0' '0' '0' '0' '2' '5' '8' '2' '&r' '&l'

wobei die Zeichenfolge "g0q+" die Antwort auf ein Kommando und "00002582" den Messwert (in 0.1mm) darstellt. Der Schluss ist die Terminierung.

Nun das Problem ist mit diesen Zeichen im Charformat kann ich nicht weiterarbeiten. Ich sollte mit dem Messwert rechnen und vergleichen können, bräuchte also irgendein Zahlenformat wie INT oder so.

Habe bis jetz mal den Messwert alleine ohne "g0q+" und Terminierung in einen neuen DB geladen (aber immer noch als Char halt...)

Kann mir da jemand weiterhelfen wie ich daraus ein verwertbares Resultat machen kann? Das Ganze ist für eine Positionssteuerung eines Hallenkranes gedacht...

Der Link zum Lasersensor: http://www.dimetix.ch/Products/DE/_FRM_DLS_B_DE.html

Besten Dank und Gruss

Thomas




einfach - durch geschicktes umkopieren in eine Stringstruktur - ggf. byte für byte oder mit BLKMOVE

0tes Byte und 1tes Byte als Haeder entspr. parametrieren und mit

FC 37 STRNG_DI aus des IEC-LIBs in DINT umwandeln.


Gruß
 
Man braucht nicht unbedingt die Zeichenkette in eine STRING-Variable umkopieren und sie dann mit dem FC37 STRNG_DI in eine DINT-Zahl umzuwandeln. Die Umwandlung der Zeichenkette in eine DINT-Zahl kann man auch mit geringem Aufwand Zeichen für Zeichen von Hand durchführen:

Code:
FUNCTION FC 100 : VOID
TITLE =Laser-Distanz
AUTHOR : KAI
FAMILY : SPSFORUM
NAME : LASER
VERSION : 1.0
 
VAR_INPUT
  LASER : POINTER ; 
END_VAR
VAR_OUTPUT
  DISTANZ : DINT ;  
END_VAR
VAR_TEMP
  DB_REGISTER : WORD ;  
  AR1_REGISTER : DWORD ;    
  DB_NUMMER : WORD ;    
  ZWISCHENWERT : DINT ; 
  MULTIPLIKATOR : DINT ;    
  SCHLEIFE : INT ;  
END_VAR
BEGIN
NETWORK
TITLE =DB-Register und Adressregister AR1 sichern
 
      L     DBNO; // DB-Register
      T     #DB_REGISTER; 
 
      TAR1  #AR1_REGISTER; // AR1-Register
 
NETWORK
TITLE =Laser-Distanz
//CHAR '0' = HEX 30 = DEZ 48
//CHAR '1' = HEX 31 = DEZ 49
//CHAR '2' = HEX 32 = DEZ 50
//CAHR '3' = HEX 33 = DEZ 51
//CAHR '4' = HEX 34 = DEZ 52
//CHAR '5' = HEX 35 = DEZ 53
//CHAR '6' = HEX 36 = DEZ 54
//CHAR '7' = HEX 37 = DEZ 55
//CHAR '8' = HEX 38 = DEZ 56
//CHAR '9' = HEX 39 = DEZ 57
//   
      L     P##LASER; // POINTER
      LAR1  ; 
 
      L     W [AR1,P#0.0]; // POINTER DB-Nummer
      T     #DB_NUMMER; 
 
      AUF   DB [#DB_NUMMER]; 
 
      L     D [AR1,P#2.0]; // POINTER Bereichszeiger
      LAR1  ; 
 
      L     L#0; 
      T     #ZWISCHENWERT; // Zwischenwert
 
      L     L#10000000; 
      T     #MULTIPLIKATOR; // Multiplikator
 
      L     8; 
M01:  T     #SCHLEIFE; // Schleife
 
      L     B [AR1,P#4.0]; // Wert CHAR => DINT
      L     48; 
      -I    ; 
      ITD   ; 
      L     #MULTIPLIKATOR; // Mulitplikator
      *D    ; 
      L     #ZWISCHENWERT; // Zwischenwert
      +D    ; 
      T     #ZWISCHENWERT; // Zwischenwert
 
      L     #MULTIPLIKATOR; // Multiplikator
      L     L#10; 
      /D    ; 
      T     #MULTIPLIKATOR; // Multiplikator
 
      L     P#1.0; 
      +AR1  ; 
 
      L     #SCHLEIFE; // Schleife
      LOOP  M01; 
 
      L     #ZWISCHENWERT; // Zwischenwert
      T     #DISTANZ; // Distanz
 
NETWORK
TITLE =DB-Register und Adressregister AR1 wiederherstellen
 
      AUF   DB [#DB_REGISTER]; // DB-Register
 
      LAR1  #AR1_REGISTER; // AR1-Register
 
END_FUNCTION

Gruß Kai
 

Anhänge

  • OB1.pdf
    3,4 KB · Aufrufe: 43
  • FC100.pdf
    4,6 KB · Aufrufe: 66
  • DB200.pdf
    2,4 KB · Aufrufe: 34
  • Laser.zip
    30,8 KB · Aufrufe: 64
  • VAT.jpg
    VAT.jpg
    266,3 KB · Aufrufe: 45
Zurück
Oben