LabVIEWForum.de
Mit RS232 Daten lesen und schreiben - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: Instrument IO & VISA (/Forum-Instrument-IO-VISA)
+---- Thema: Mit RS232 Daten lesen und schreiben (/Thread-Mit-RS232-Daten-lesen-und-schreiben)

Seiten: 1 2 3


RE: Mit RS232 Daten lesen und schreiben - toaran_ - 19.02.2013 17:59

Hallo

erm ja also wenn du den Befehl in Labview sendest solltest du das auch als HEX eingeben nicht eine Zeichenkette mit "52 61 03 00 FF F9 02 AE" als String.. dann sind es statt 23 nur 8 byte...

und dann verstehts vielleicht auch deine Heizung...

T


RE: Mit RS232 Daten lesen und schreiben - Moxel - 24.02.2013 20:56

Hallo zusammen ich bin leider immer noch nicht weiter gekommen in Labview
ich versuche vergeblich diesen Befehl " 52 61 03 00 FF F9 02 AE " Lenght 8Byte
zu senden leider kommt beim senden immer eine anderes Format heraus das auch wesentlich länger ist auch mit dem Easy_RS232_ Terminal von Labview entsteht alles ausser das was sein soll.
Diesen oben stehenden Befehl habe ich bei einem Programm mitgeschnitten und er Funktioniert auch wenn ich Ihn beim Hterm (kein Labview ) mit der einstellung HEX eingebe.
Ich habe es schon probiert den Befehl als Nummer zu senden geht auch nicht !!!
Vieleicht kann mir doch irgendjemand da mal weiter helfen was ich falsch mache.
DankeBahn


RE: Mit RS232 Daten lesen und schreiben - Clyde - 25.02.2013 07:26

Hast du das Eingabefeld(String Control) für die Hex-Zeichenfolge in LabVIEW auch auf die Hex-Ansicht eingestellt? (Rechtsklick -> Hex Display)

Wenn du das nicht tust, weiß LabVIEW nämlich nicht, dass du gerne Hex-Werte hättest und schickt einfach den eingegebenen String.
Das ist übrigens das, was in Beitrag #11 bereits von toaran_ geschrieben wurde


RE: Mit RS232 Daten lesen und schreiben - Moxel - 25.02.2013 08:38

Guten Morgen
ja ich habe das Eingabefeld auf hex umgestellt.


RE: Mit RS232 Daten lesen und schreiben - GerdW - 25.02.2013 08:44

Hallo Moxel,

häng mal dein aktuelles VI (in LV2011) an...


RE: Mit RS232 Daten lesen und schreiben - Moxel - 01.03.2013 16:09

So jetzt bin ich erst mal weiter gekommen....
Den ersten Befehl kann ich senden und bekomme auch eine Antwort nur leider ist diese nicht so lang wie ich erwartet habe und das Programm
läuft immer in Timout hinein.
Auf den 2 Befehl habe ich leider noch keine Antwort bekommen aber so
weis ich zumindest das die Konfiguration richtig sein sollte und die Typwandlung.
Ich hänge nochmals das Logfile der orginal Software an vieleicht hilft es dem Verständnis. ( ist die gekürzte Version )

Diese Beschreibung habe ich im Internet auf "http://rigert.com/wiki-wiki/index.php?title=Fr%C3%B6ling" gefunden
{
Bytes sind mit Komma getrennt.

Frame: R,I,0x04 (Länge),ParaID (2 byte), Neuer Wert (2 byte), CHKSUM

Die Regelung antwortet mit:
M,I, Länge (1 Byte), Para ID (2 Byte), Wert (2 byte), CHKSUM
Dieses Frame wird auch gesendet wenn auf der Regelung ein Parameter verstellt wird.

Der neue Wert muss richtig umgerechnet werden, z.b.: Uhrzeit 12:00 ->
Wert 720, Zeiten werden auf Tages minuten umgerechnet

Temperatur 70 °C -> Wert 140 (mal 2)

Wird keine Antwort gesendet so wurde der Wert nicht übernommen.

Die Parameter ID kann man sich aus der gesendeten Liste mit der Kennung M,E holen.

Frame:
M,E,Länge (1 Byte),ParaID (2 byte), Einheit (1 byte), Komma ( 1 byte),
Faktor (2 byte), 2 byte ?? (min wert), 2 byte (max wert) ??, 2 byte
(std wert) ??, 3 byte ????, Parameterwert (2 byte) chksum

In diesem Frame ist der Faktor für die Umrechnung enthalten !
}


RE: Mit RS232 Daten lesen und schreiben - Moxel - 01.03.2013 16:30

Hier habe ich noch a paar Bilder was ich sonst noch so beim Orginal mit loggen konnte !!!

In dem pdf Dokument sind auch Schnittstellenbeschreibungen einer Fröling Heizung nur leider passen diese überhaupt nicht zu meiner...
Aber vieleicht hilft es jemanden weiter ich denke diese Beschreibung ist FHG Turbo 3000 aufwärts ...


RE: Mit RS232 Daten lesen und schreiben - GerdW - 01.03.2013 19:01

Hallo Moxel,

Zitat:Den ersten Befehl kann ich senden und bekomme auch eine Antwort nur leider ist diese nicht so lang wie ich erwartet habe und das Programm läuft immer in Timout hinein.
Auf den 2 Befehl habe ich leider noch keine Antwort bekommen aber so weis ich zumindest das die Konfiguration richtig sein sollte und die Typwandlung.
Ich habe Probleme, deine Programmlogik zu verstehen:
- Wozu zwei geschachtelte While-Loops, wenn beide mit der selben Abbruchbedingung beendet werden? Wozu überhaupt die äußere Loop?
- Du sendest nur einen Befehl, willst dann aber dauernd Antworten vom Gerät abfragen. Sendet dieses denn überhaupt selbständig oder wartet es einfach auf einen neuen Befehl?
- Hast du die ChkSum-Berechnung im PDF gelesen? Und auch so nachprogramiert (falls für dein Gerät zutreffend)?
- Bei dem (ungenutzten) FormatIntoString hast du die Parameter HexCode8 und 9 vertauscht. Bist du sicher, dass du dort Leerzeichen zwischen den Bytes haben willst?


RE: Mit RS232 Daten lesen und schreiben - tomfa - 18.11.2013 11:12

Hallo Zusammen,

anbei mein Perl Skript das seit etwa 4 Jahren mit meinem FHG 3000 und einem GuruPlug (damals gab es noch keine RaspPi) läuft und soweit mir bekannt alle Daten aussliest.
Das FHG 3200 Protkoll funktioniert anderst !
Das Skript hatte ich mit Hilfe von froeling.fore-city.de aufgebaut, aber leider gibt es das Forum/die Seite nicht mehr.
Von dem wichtigsten Thread, hab ich noch einen halblebigen Ausschnitt gerettet.
Ich muss ihn nur noch finden Smile

Aufruf mit

~>{Skriptname} {Nummer der seriellen USB-Adapter Verbindung}

Ansonsten lese # RS232 Setup !

PHP-Code:
#!/usr/bin/perl 

use Time::HiRes;

#Time::HiRes::usleep(500000);

$sleep=1000000;
$sleep=300000;

$log=$ENV{'log_fhg'};

# RS232 Setup
$COM_FHG=$ENV{'COM_FHG'}; # Quelle 1: vom Bash sourcing
$COM_FHG="/dev/ttyUSB1";     # Quelle 2: von ttyUSB1 
$COM_FHG="/dev/ttyUSB${ARGV[0]}"# Quelle 3: als Skript parameter

print "$COM_FHG\n";
$SEP=$ENV{'SEP'};
$SEP="=";
 
 use 
Device::SerialPort;
# Serielle Schnittstelle einstellen
 
$rc=&init_ser($COM_FHG);

## Main

# check envrionment

# work
if ( $ENV{'work'eq "" ) {
 print 
STDERR "Error: Environment variable 'work' not set - exiting\n";  exit; } # log if ( $ENV{'log_fhg'} eq "" ) {  print STDERR "Error: Environment variable 'log_fhg' not set - exiting\n";  exit; } 


if ( $ARGV[1ne "M1" ) {
 &
start;
}


# m1 m2 Werte auslesen
while (1) {
# Lese Geschwindigkeit wieder rauf setzen
$sleep=1000000;
print 
"SEP>>>>$SEP<<<\n";
   
# wenn er ein M3 will, dann gib ihm eins
   
if ( $data =~ /^4d 33/ ) { 
     &
o("4D 33 01 01");
     &
i;
    }
  
# Sende M2
  
&o("4D 32 01 01");
  
$data=&i;
  print 
STDERR "length=".length($data).">$data<\n";
  
my $ts = `date +%s`;
  
chop($ts);
  
$data=substr($data,0,164);
  
$timestamp=$data                                   if ( $data =~ /^4d 32/ && length($data) == 36 );
  
system("echo $ts$SEP$data$SEP$timestamp > $log")   if ( $data =~ /^4d 31/ && length($data) == 165 )
     
# Sende M1
     
&o("4D 31 01 01");
     
$data=&i;
     print 
STDERR "length=".length($data).">$data<\n";
     
my $ts = `date +%s`;
     
chop($ts);
     
$timestamp=$data                            if ( $data =~ /^4d 32/ && length($data) == 36 );
     
system("echo $ts$SEP$data$SEP$timestamp > $log")  if ( $data =~ /^4d 31/ && length($data) == 165 )
# ende While

 
exit; 

###########################################
sub start {

##
# Hier wird die Messerei initialisiert und gestartet
# und alle Werte von MA - MZ durchgearbeitetet
# erst wenn diese initialisierungsphase (~ 3 min) durch ist
# sendet er die laufendenen Betriebsdaten
#


$user "52 61 03 00 00 7B"#    Plumber
$user "52 61 03 00 00 01"#  1 normal User
$user "52 61 03 00 00 F3"#  1 normal User
$user "52 61 03 00 FF F9"# -7 Service

open (ME">$ENV{'work'}/me.txt");
open (MD">$ENV{'work'}/md.txt");

my $data;
#Sende Initialisierung an S3100
while ( $data !~ /^52 61 01 01/ ) {
  &
o("$user");
  
# lese was Steuerung zurueck bringt
  
$data = &i();
  print 
"<$data\n";
  
sleep(10) if ( $data !~ /^52 61 01 01/);
}

 
my $datas "4d 41";
 
my $data;

while ( 
$data !~ /^4d 3. / ) {
  &
o("$datas 01 01");
  
# lies nochmal was er jetzt will  
  
$data =&i();
  if ( 
$data == "") {next;};
  print 
"<$data\n";
 
# dump all ME Values into a text file
  
print ME "$data\n" if ( $data =~ /^4d 45/ );
 
# dump all MD Values into a text file
  
print MD "$data\n" if ( $data =~ /^4d 44/ );
  print 
STDERR &lesbar($data)."\n";
  
# nächsten Befehl zusammen bauen
  
$datas $data;
  
$datas =~ s/^(.. ..).*$/$1/g;
# ende While

  
$datas $data;
  
$datas =~ s/^(.. ..).*$/$1/g;

$x =  0;
#  32 mal M2 Werte auslesen
while ($x 33) {
  &
o("4D 32 01 01");
  
$data =&i;
  print 
"<$data\n";
  
$datas=$data;
  
$datas =~ s/^(.. ..).*$/$1/g;
  
$x++;
# ende x While

  # Sende Rb bis init gesendet wird 
  
&o("52 62 03 00 00 01");
  
# Lese bestätigung; normal: 52 62 01 01 00 b6
  
$data = &i();  
  print 
"<$data\n";
  &
o("4D 32 01 01");
  &
i(1);  

close(MD);
close(ME);

# Ende Sub start 

# --------------------------------------

sub get_timestamp {

 
my $i $_[0];
 
my $uhr_HH=substr($i,15,2);
 
my $uhr_MM=substr($i,12,2);
 
my $datum_YY=substr($i,27,2);
 
my $datum_MM=substr($i,21,2);
 
my $datum_DD=substr($i,24,2);

 
$i =  "$datum_DD.$datum_MM.$datum_YY $uhr_HH:$uhr_MM";
 
 return 
$i;
# Ende sub get_timestamp

# --------------------------------------
sub o {

my $a $_[0];
my $debug $_[1];

 
# Checksumme hinzufuegen
 
$a="$a ".&chksum($a);

# alle spaces entfernen
 
$a =~ s//g;

# binaer string erzeugen
 
my $i pack"H*",$a);

 print 
STDERR "SEND:$a<\n";

 
# Send request
 
$serial->write($i."\r");
 
my $rc=$?;
 
 (
$i unpack("c*"$a)) =~ s/(..)/$/g;

# sleep(1);
Time::HiRes::usleep($sleep);
 return 
$rc;

# End sub
# ----------------------------------

sub i {

 
my($count$data) = $serial->read(1000);
 
my $data1=$data;
 (
$data unpack("H*"$data) ) =~ s/(..)/$/g;
 print 
STDERR "RECV:$data1\n";

#Time::HiRes::usleep($sleep);
 
return $data;

# End sub
#-------------------------------------------------------

sub init_ser {
my $dev $_[0];
 
$serial Device::SerialPort->new($dev);
 
$serial->debug(1);
 
# Buffer leeren
 
$serial ->lookclear();

 $| = 
1;

#$serial->user_msg(ON);  
#$serial->baudrate(57600);
#$serial->baudrate(19200);
 
$serial->baudrate(9600);
 
$serial->databits(8);
 
$serial->parity("none");
 
$serial->stopbits(1);
 
$serial->handshake("xon");

}

# ---------------------

sub chksum {
 
my $data $_[0];
 
my $summ ;
 
my @values split(/ /, $data);

 foreach (@
values) {
  
# dezimal zahl draus machen
  
my $tmp hex($_);
  
$summ $summ $tmp;
 } 
# End foreach
 
 
$data = &dec2hex($summ);
 
$data=~ s/^(...)$/0$1/g;
 
$data=~ s/^(..)$/00$1/g;
 
 return 
$data;
 
# End sub

# ------------------------------------
    
sub dec2hex {
    
# parameter passed to
    # the subfunction
    
my $decnum $_[0];
    
# the final hex number
    
my $hexnum;
    
my $tempval;
    while (
$decnum != 0) {
    
# get the remainder (modulus function)
    # by dividing by 16
    
$tempval $decnum 16;
    
# convert to the appropriate letter
    # if the value is greater than 9
    
if ($tempval 9) {
    
$tempval chr($tempval 55);
    }
    
# 'concatenate' the number to 
    # what we have so far in what will
    # be the final variable
    
$hexnum $tempval $hexnum ;
    
# new actually divide by 16, and 
    # keep the integer value of the 
    # answer
    
$decnum int($decnum 16); 
    
# if we cant divide by 16, this is the
    # last step
    
if ($decnum 16) {
    
# convert to letters again..
    
if ($decnum 9) {
    
$decnum chr($decnum 55);
    }
    
    
# add this onto the final answer.. 
    # reset decnum variable to zero so loop
    # will exit
    
$hexnum $decnum $hexnum
    
$decnum 
    
}
    }
    return 
$hexnum;
    } 
# end sub

# Lese Antwort vom S3100
# # Read response
# $data = &i;
# # Lese von der S3100 geforderte Befehl
# $data =~ s/^..................(.....).*$/${1} 01 01/g;
# $datad=$data." ".&chksum($data);

sub lesbar {
   
my $string $_[0];
   
$string =~ s/^.......................(.*)......$/$1/g;
   
$string =~ s/E1/ß/g;
   
$string =~ s/81/ü/g;
   
$string =~ s/84/ä/g;
   
$string =~ s/94/ö/g;
   
$string =~ s/([a-fA-F0-9]{2})/chr(hex $1)/eg;

   return 
$string;
# Ende lesbar 



RE: Mit RS232 Daten lesen und schreiben - tomfa - 18.11.2013 20:54

Hab meinen alten froeling.foren-city.de Thread gefunden.
Darin beschreibe ich in einem Monolog (wegen fehlender Partner) wie ich mich an das Protokoll ran gearbeitet habe....falls das noch irgendjemand interessiert.

Siehe angehängtes Attachment.

[attachment=47298]