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_.)
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...
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.
Danke
25.02.2013, 07:26 (Dieser Beitrag wurde zuletzt bearbeitet: 25.02.2013 07:34 von Clyde.)
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
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.
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.
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 ...
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?
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
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[1] ne "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
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);
# ------------------------------------ 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 = 0 } } 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);
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.