INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

Mit RS232 Daten lesen und schreiben



Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!

19.02.2013, 17:59 (Dieser Beitrag wurde zuletzt bearbeitet: 19.02.2013 17:59 von toaran_.)
Beitrag #11

toaran_ Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 237
Registriert seit: Feb 2007

2012
2006
EN

90763
Deutschland
RE: Mit RS232 Daten lesen und schreiben
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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
24.02.2013, 20:56
Beitrag #12

Moxel Offline
LVF-Grünschnabel
*


Beiträge: 22
Registriert seit: Feb 2013

LV 2011/2012
2012
DE_EN



RE: Mit RS232 Daten lesen und schreiben
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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
25.02.2013, 07:26 (Dieser Beitrag wurde zuletzt bearbeitet: 25.02.2013 07:34 von Clyde.)
Beitrag #13

Clyde Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 71
Registriert seit: May 2012

2012
2009
EN


Sonstige
RE: Mit RS232 Daten lesen und schreiben
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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
25.02.2013, 08:38
Beitrag #14

Moxel Offline
LVF-Grünschnabel
*


Beiträge: 22
Registriert seit: Feb 2013

LV 2011/2012
2012
DE_EN



RE: Mit RS232 Daten lesen und schreiben
Guten Morgen
ja ich habe das Eingabefeld auf hex umgestellt.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
25.02.2013, 08:44
Beitrag #15

GerdW Offline
______________
LVF-Team

Beiträge: 17.412
Registriert seit: May 2009

LV2021
1995
DE_EN

10×××
Deutschland
RE: Mit RS232 Daten lesen und schreiben
Hallo Moxel,

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

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
01.03.2013, 16:09
Beitrag #16

Moxel Offline
LVF-Grünschnabel
*


Beiträge: 22
Registriert seit: Feb 2013

LV 2011/2012
2012
DE_EN



RE: Mit RS232 Daten lesen und schreiben
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 !
}


Angehängte Datei(en)
11.0 .vi  Michael Heizung Versuche.vi (Größe: 19,71 KB / Downloads: 257)

0.0 .txt  Log Hex gekuerzt.txt (Größe: 178,4 KB / Downloads: 315)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
01.03.2013, 16:30 (Dieser Beitrag wurde zuletzt bearbeitet: 01.03.2013 17:16 von jg.)
Beitrag #17

Moxel Offline
LVF-Grünschnabel
*


Beiträge: 22
Registriert seit: Feb 2013

LV 2011/2012
2012
DE_EN



RE: Mit RS232 Daten lesen und schreiben
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 ...


Angehängte Datei(en) Thumbnail(s)
           

0.0 .pdf  Kommunikation mit Fröling Kesselsteuerung 3200 über die Service Schnittstelle 02.008.0811.pdf (Größe: 1,11 MB / Downloads: 9758)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
01.03.2013, 19:01
Beitrag #18

GerdW Offline
______________
LVF-Team

Beiträge: 17.412
Registriert seit: May 2009

LV2021
1995
DE_EN

10×××
Deutschland
RE: Mit RS232 Daten lesen und schreiben
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?

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
18.11.2013, 11:12 (Dieser Beitrag wurde zuletzt bearbeitet: 18.11.2013 11:15 von tomfa.)
Beitrag #19

tomfa Offline
LVF-Neueinsteiger


Beiträge: 3
Registriert seit: Nov 2013

1
2013
DE



RE: Mit RS232 Daten lesen und schreiben
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 
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
18.11.2013, 20:54
Beitrag #20

tomfa Offline
LVF-Neueinsteiger


Beiträge: 3
Registriert seit: Nov 2013

1
2013
DE



RE: Mit RS232 Daten lesen und schreiben
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.


0.0 .rar  fröling.rar (Größe: 60,54 KB / Downloads: 359)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Modbus aktiv behalten ohne etwas zu schreiben oder zu lesen p4tti 12 8.395 30.09.2016 12:45
Letzter Beitrag: Freddy
  Daten werden nicht eingelesen | Assistent zu Instrumenten I/O - lesen und analyiseren Troet 3 4.573 12.12.2014 15:58
Letzter Beitrag: jg
  Dauerhaft Daten aus Agilent 34970A lesen Pero 6 7.007 19.02.2014 06:21
Letzter Beitrag: sthamann
  RS232 lesen und schreiben eventgesteuert theandreas 11 11.024 22.10.2013 19:05
Letzter Beitrag: theandreas
  Daten lesen über USB dbuckl 8 9.950 23.09.2013 11:56
Letzter Beitrag: GerdW
  Zeitproblem bei Schreiben/Lesen atbab3 3 3.542 07.11.2012 14:01
Letzter Beitrag: Lucki

Gehe zu: