Dachs MSR1 auslesen: Unterschied zwischen den Versionen
Loddel (Diskussion | Beiträge) (→Abfrage in Perl) |
Loddel (Diskussion | Beiträge) (→Abfrage in Perl) |
||
Zeile 41: | Zeile 41: | ||
Ein kleines Beispielprogramm wie ein externes Programm die Werte e8 abfrägt und aufbereitet. | Ein kleines Beispielprogramm wie ein externes Programm die Werte e8 abfrägt und aufbereitet. | ||
− | <source lang="perl"> | + | <source lang="perl" line=true> |
#!/usr/bin/perl -w | #!/usr/bin/perl -w | ||
# Abfrage der Dachs c0-Werte per esex | # Abfrage der Dachs c0-Werte per esex |
Version vom 27. Juli 2009, 21:53 Uhr
Die Dachs MSR1 ist ein Klein-Blockheizkraftwerk (BHKW) der Firma SenerTec, die sowohl Wärme, als auch Strom erzeugt, und vor allem eine serielle Schnittstelle zur Verfügung stellt *Händereib*. Über diese kann man einiges an Betriebs- und Wartungsdaten auslesen.
│ │ Load a Default Configuration ---> │ │ ... │ │ IO Support ---> | | ... │ │ [*] Senertec Dachs MSR1 Support │ │ (0) MSR1 usart select
Inhaltsverzeichnis
Anschluss
Obwohl sowohl das Ethersex, als auch die MSR1 einen Slave (Weiblich) RS232 Anschluss hat braucht man ein 1:1 Kabel. Außerdem muss das RTS Signal des MSR1 auf eine logische Null gelegt werden, da sich die MSR1 sonst nicht für irgendwelche Befehle interessiert. Dazu verwendet man am besten den zweiten Kanal des verbauten MAX232, legt den Eingang auf GND und greift die +10V am Ausgang ab. Ansonsten ist der RS232 Anschluss ein 9600 8N1.
Alternative Kabelbelegung
Im BHKW-Forum gibt es noch eine alternative Kabelbelegung. Zu beachten ist nur, das man die Leitungen nicht kreuzen darf. (getestet mit dem AVR-Net-IO)
Media:Kabelbelegung_Dachs_MRS1.pdf
Die dort beschriebene Belegung ist also für PC->Dachs gedacht. Diese Variante funktioniert mit einem ethersex nur dann, wenn an der RS232 Buchse auch der RTS Kanal durch den MAX232 geschleift wird. (Und die Ethersexfirmware um RTS Handshaking erweitert wurde *huestel*)
Auslesen
Der MSR1 kann man zwei verschiedene Datensätze entlocken, den "0xe8"-Datensatz und den "0xc0"-Datensatz. Beide enthalten teilweise redundante Daten, wobei jedoch letzterer weitaus mehr Informationen bietet. Den 0xe8 Datensatz bekommt man mit dem ecmd `msr1 get' bzw. `msr1 get 0'. Das erste Byte gibt an, wieviele Anfragen seit dem letzten erfolgreichen Versuch fehlgeschlagen sind. Den 0xc0-Datensatz bekommt man über `msr1 get 1'.
Einbindung in den HTTPD
│ │ Load a Default Configuration ---> │ │ ... │ │ General Setup ---> │ │ ... │ │ [*] VFS (Virtual File System) ---> │ │ [*] VFS File Inling │ │ [*] Inline MSR1
Unter $ethersexip/msr.ht kann nun der aktuelle Status des Dachs ausgelesen werden.
Programm Beispiele
Abfrage in Perl
Ein kleines Beispielprogramm wie ein externes Programm die Werte e8 abfrägt und aufbereitet.
#!/usr/bin/perl -w
# Abfrage der Dachs c0-Werte per esex
#
# kleines Beispielscript, das die e8 Wert abholt ud anschliesend aufbereitet
# in Variabeln schreibt.
# Das Script dient nur als Vorlage für eigene Entwicklungen.
#
# Autor: Lothar Schweikle-Droll
# Lizenz: GPL
use strict;
use Net::Telnet ();
my $debug=1;
my $esex;
my $esexip="192.168.255.90";
my $esexport="2701";
my $e8hex;
my @e8hex;
my $BETRIEBSSTUNDEN;
my $WARTUNG;
my $RL;
my $VL;
my $ABGAS;
my $EINSCH_TEMP_SOL;
my $BETRIEBSZUSTAND;
my $BETRIEBSZUSTAND_SOL;
my $GEN_LEISTUNG_SOL;
my @SERVICE_CODE_MODUL; #Modul 0 = Leitregler
my %BETRIEBSZUSTAND = (
10=>'Störabschaltung',
11=>'Abschaltung MV1',
11=>'Abschaltung MV2',
13=>'Drehzahl<200 n. 25 sek.',
14=>'Drehzahl>200 n. 25 sek.',
15=>'Abschaltung>1 Minute',
16=>'Abschaltung>4 Minuten',
20=>'Startvorbereitung',
21=>'Starteinleitung',
22=>'Start',
23=>'1,5 sek. nach Start',
24=>'Startende',
30=>'450<Drehz<800',
32=>'Zuschaltung Generator',
33=>'Leistungsregelung runter',
34=>'Leistungsregelung hoch',
35=>'Betrieb');
my $non;
&e8_esex;
&wertezuweisung;
### Ab hier kann eigener Code stehen
if ( $debug == 1){
&debug;
}
##### Subrotinen
sub e8_esex {
#Dachs C0 abfrge per Telnet über den ethersex
$esex = Net::Telnet->new || die "kann Ethersex nicht finden";
$esex->open(Host => $esexip, Port => $esexport, Timeout => 1);
$esex->print("msr1 get 0");
($non, $e8hex) = $esex->waitfor(Timeout => 1, Match =>'/[0-9A-Fa-f]+/');
#den String in ein Array wandeln
@e8hex = $e8hex =~ /(..)/g;
}
sub wertezuweisung {
$BETRIEBSSTUNDEN=hex($e8hex[1].$e8hex[2]);
$WARTUNG=hex($e8hex[3]);
#RL auf negative Temp prüfen
if (hex($e8hex[4]) >128 ) {
$RL=hex($e8hex[4])-255;
}else{
$RL=hex($e8hex[4]);
}
#VL auf negative Temp prüfen
if (hex($e8hex[5]) >128 ) {
$VL=hex($e8hex[5])-255;
}else{
$VL=hex($e8hex[5]);
}
$ABGAS=hex($e8hex[6])+15;
$EINSCH_TEMP_SOL=hex($e8hex[7]);
$BETRIEBSZUSTAND=$BETRIEBSZUSTAND{hex($e8hex[8])};
$GEN_LEISTUNG_SOL= sprintf("%.3f" , hex($e8hex[9])/34); #Sollwert Der Generatorleistung gerundet auf 3 Stellen nach dem Komma
my $i=0;
while ($i <=5 ) {
$SERVICE_CODE_MODUL[$i]=hex($e8hex[$i+10]);
$i++
}
$BETRIEBSZUSTAND_SOL=hex($e8hex[16]);
}
sub debug {
print "\n*********** DEBUG Start *************\n\n";
print "e8-Hexwert:","@e8hex","\n\n";
print "Betriebstundenb:\t",$BETRIEBSSTUNDEN,"\n";
print "Wartung:\t\t",$WARTUNG,"\n";
print "VL:\t\t\t",$VL,"\n";
print "RL:\t\t\t",$RL,"\n";
print "Abgas:\t\t\t",$ABGAS,"\n";
print "EINSCH_TEMP_SOL:\t",$EINSCH_TEMP_SOL,"\n";
print "Betriebszustand:\t",$BETRIEBSZUSTAND,"\n";
print "Generator Leitsung Sol:\t",$GEN_LEISTUNG_SOL,"\n";
print "BETRIEBSZUSTAND_SOL:\t",$BETRIEBSZUSTAND_SOL,"\n";
my $i=0;
while ($i <=5 ) {
#$SERVICE_CODE_MODUL[$i]=hex($e8sex[$i+10]);
print "SERVICE_CODE_MODUL[".$i."]\t".$SERVICE_CODE_MODUL[$i],"\n";
$i++
}
print "\n";
print "*********** DEBUG Ende **************\n\n";
}