Difference between revisions of "Dachs MSR1"

From Ethersex_Wiki
Jump to: navigation, search
(Einbindung in den HTTPD)
(Replaced content with "'''nur in deutsch'''")
Line 1: Line 1:
Die Dachs MSR1 ist ein Klein-Blockheizkraftwerk (BHKW) der Firma [http://www.senertec.de 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. Eine genauere Beschreibung des Protokolls gibts [[Dachs_MSR1_Service_Protokoll|hier]].
+
'''nur in deutsch'''
 
 
  │ │                Load a Default Configuration  --->
 
  │ │                ...
 
  │ │                IO Support  --->
 
  | |                    ...
 
  │ │                    [*] Senertec Dachs MSR1 Support
 
  │ │                    (0)  MSR1 usart select
 
 
 
 
 
== Anschluss ==
 
[[File:Dachs_msr1_anschluss.png|thumb]]
 
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 [http://www.bhkw-forum.de 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]] ==
 
[[File:800px-Msr1_screenshot.png|600px]]
 
  │ │                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 ==
 
 
 
=== e8 ===
 
 
 
'''Ein  Beispiel wie die Werte e8 abgefragt und aufbereitet werden.'''
 
 
 
<source lang="perl">
 
#!/usr/bin/perl -w
 
# Abfrage der Dachs e8-Werte per esex
 
#
 
# kleines Beispielscript, das die e8 Wert abholt ud anschliesend aufbereitet
 
# in Variabeln schreibt.
 
# Das Script kann als Vorlage für eigene Entwicklungen benutzt werden.
 
#
 
# 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 e8 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";
 
}
 
</source>
 
 
 
 
 
=== c0 ===
 
'''Ein Beispiel für die c0 Werte'''
 
 
 
 
 
<source lang="perl">
 
#!/usr/bin/perl -w
 
# Abfrage der Dachs c0-Werte per esex
 
#
 
# kleines Beispielscript, das die c0 Wert abholt ud anschliesend aufbereitet
 
# in Variabeln schreibt.
 
# Das Script kann als Vorlage für eigene Entwicklungen benutzt werden.
 
#
 
# 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 $c0hex1;
 
my $c0hex2;
 
my $c0hex3;
 
my $c0hex4;
 
my $c0hex;
 
my @c0hex;
 
 
 
my $WARTUNG;
 
my $RL;
 
my $VL;
 
my $SRL;
 
my $SVL;
 
my $BETRIEBSSTUNDEN;
 
my $ABGAS;
 
my $AUSENTEMP;
 
my $F1TEMP;
 
my $F2TEMP;
 
my $GENERTEMP;
 
my $MOTORTEMP;
 
my $SERVICECODE;
 
my $BETRIEBSART;
 
my $BHKW_FREIGABE;
 
my $BRENNER_FREIGABE;
 
my $DREHZAHL;
 
my $ERZEUGTE_E_ENERGIE;
 
my $ERZEUGT_WAERME;
 
my $GEN_LEISTUNG;
 
my $STARTS;
 
 
 
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);
 
#      $c0hex1=$esex->cmd('msr1 get 1');
 
 
 
    $esex->print("msr1 get 1");
 
    ($non, $c0hex1) = $esex->waitfor(Timeout => 1, Match =>'/[0-9A-Fa-f]+/');
 
    ($non, $c0hex2) = $esex->waitfor(Timeout => 1, Match =>'/[0-9A-Fa-f]+/');
 
    ($non, $c0hex3) = $esex->waitfor(Timeout => 1, Match =>'/[0-9A-Fa-f]+/');
 
    ($non, $c0hex4) = $esex->waitfor(Timeout => 1, Match =>'/[0-9A-Fa-f]+/');
 
 
 
    $c0hex = ($c0hex1).($c0hex2).($c0hex3).($c0hex4); #die vier Einzelwerte zu einem gesamt String zusammensetzen
 
    @c0hex = $c0hex =~ /(..)/g; #Den String in eine Array schreiben (nur die HEX-Werte ohne Leerstellen
 
}
 
 
 
sub wertezuweisung {
 
 
 
        $BETRIEBSSTUNDEN=hex($c0hex[19].$c0hex[20]);
 
        $WARTUNG=$c0hex[3];
 
        #RL auf negative Temp prüfen
 
                if (hex($c0hex[22]) >128 ) {
 
                        $RL=hex($c0hex[22])-255;
 
                }else{
 
                        $RL=hex($c0hex[22]);
 
                }
 
        $SRL=hex($c0hex[21]);
 
        #VL auf negative Temp prüfen
 
                if (hex($c0hex[24]) >128 ) {
 
                        $VL=hex($c0hex[24])-255;
 
                }else{
 
                        $VL=hex($c0hex[24]);
 
                }
 
        $SVL=hex($c0hex[23]);
 
        #Ausentemp auf negative Temp prüfen
 
                if (hex($c0hex[25]) >128 ) {
 
                        $AUSENTEMP=hex($c0hex[25])-255;
 
                }else{
 
                        $AUSENTEMP=hex($c0hex[25]);
 
                }
 
      #F1 und F2 auf negative Temp prüfen
 
                if (hex($c0hex[26]) >128 ) {
 
                        $F1TEMP=hex($c0hex[26])-255;
 
 
 
                }else{
 
                        $F1TEMP=hex($c0hex[26]);
 
                }
 
                if (hex($c0hex[27]) >128 ) {
 
                        $F2TEMP=hex($c0hex[27])-255;
 
                }else{
 
                        $F2TEMP=hex($c0hex[27]);
 
                }
 
        $GENERTEMP=hex($c0hex[28]);
 
        $SERVICECODE=hex($c0hex[30]);
 
        $BETRIEBSART=$c0hex[31];
 
        $BHKW_FREIGABE=hex($c0hex[32]);
 
        $BRENNER_FREIGABE=hex($c0hex[33]);
 
        $MOTORTEMP=hex($c0hex[34]);
 
        $ABGAS=hex($c0hex[35])+15;
 
        $DREHZAHL=hex($c0hex[36].$c0hex[37]);
 
        $ERZEUGTE_E_ENERGIE=hex($c0hex[38].$c0hex[39].$c0hex[40].$c0hex[41]);
 
        $ERZEUGT_WAERME=hex($c0hex[42].$c0hex[43].$c0hex[44].$c0hex[45]);
 
        $GEN_LEISTUNG=sprintf("%.3f" , hex($c0hex[46])/34); #Sollwert Der Generatorleistung gerundet auf 3 Stellen nach dem Komma
 
        $STARTS=hex($c0hex[47].$c0hex[48]);
 
 
 
}
 
 
 
sub debug {
 
    print "\n*********** DEBUG Start *************\n\n";
 
    print "c0-Hexwert:","@c0hex","\n\n";
 
    print "Betriebstunden:\t\t",$BETRIEBSSTUNDEN,"\n";
 
    print "Wartung:\t\t",$WARTUNG,"\n";
 
    print "VL:\t\t\t",$VL,"\n";
 
    print "RL:\t\t\t",$RL,"\n";
 
    print "F1:\t\t\t",$F1TEMP,"\n";
 
    print "F2:\t\t\t",$F2TEMP,"\n";
 
    print "VL Soll:\t\t",$SVL,"\n";
 
    print "RL Soll:\t\t",$SRL,"\n";
 
    print "Ausen:\t\t\t",$AUSENTEMP,"\n";
 
    print "Generator Temp:\t\t",$GENERTEMP,"\n";
 
    print "Servicecode:\t\t",$SERVICECODE,"\n";
 
    print "Betreibsart:\t\t",$BETRIEBSART,"\n";
 
    print "BHKW Freigabe:\t\t",$BHKW_FREIGABE,"\n";
 
    print "Brenner Freigabe:\t",$BRENNER_FREIGABE,"\n";
 
    print "Motor Temp:\t\t",$MOTORTEMP,"\n";
 
    print "Abgas:\t\t\t",$ABGAS,"\n";
 
    print "Drehzahl:\t\t",$DREHZAHL,"\n";
 
    print "erzeugte E-Energie:\t",$ERZEUGTE_E_ENERGIE,"\n";
 
    print "erzeugte Wärme:\t\t",$ERZEUGT_WAERME,"\n";
 
    print "Generator ist:\t\t",$GEN_LEISTUNG,"\n";
 
    print "Startvorgang:\t\t",$STARTS,"\n";
 
    print "\n";
 
    print "*********** DEBUG Ende **************\n\n";
 
}
 
 
 
</source>
 
 
 
=== 48 ===
 
'''Ein Beispiel für die 48 Werte'''
 
 
 
 
 
<source lang="perl">
 
#!/usr/bin/perl -w
 
# Abfrage der Dachs 48-Werte per esex
 
#
 
# kleines Beispielscript, das die 48 Wert abholt ud anschliesend aufbereitet
 
# in Variabeln schreibt.
 
# Das Script kann als Vorlage für eigene Entwicklungen benutzt werden.
 
#
 
# 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 $x48hex1;
 
my $x48hex2;
 
my $x48hex3;
 
my $x48hex4;
 
my $x48hex;
 
my @x48hex;
 
 
 
my $WARTUNG;
 
my $BETRIEBSSTUNDEN;
 
my $MAXABGAS;
 
my $VL;
 
my $STOERUNGEN;
 
my $F1TEMP;
 
my $F2TEMP;
 
my $MAXGENERTEMP;
 
my $MAXMOTORTEMP;
 
my $STARTS;
 
my $MITTELGENLEISTUNG;
 
my $FLUESSIGKEITSCHALTER;
 
my $LETZTEWARTUNG;
 
my $NAECHSTEWARTUNGOEL;
 
my $NAECHSTEWARTUNGGAS;
 
 
 
my @FEHLERCODE;    #000-127
 
my @FEHLERAUTO;    #1=Autoentstörung
 
my @FEHLERCODELANG;
 
my @FEHLERMIN;
 
my @FEHLERSTUNDEN;
 
my @FEHLERTAG;
 
my @FEHLERMON;
 
my @FEHLERJAHR;
 
my @FEHLERDATUM;
 
 
 
my $non;
 
 
 
my %Servicecode = (
 
    0=>'Allgemeine Hilfe',
 
    1=>'Abgasfühler U/K',
 
    2=>'Kuehlw.Motor U/K',
 
    3=>'Kuehlw.Gener. U/K',
 
    4=>'04',
 
    5=>'Vorlauftemp. U/K',
 
    6=>'Ruecklauftemp U/K',
 
    7=>'Fuehler 1 U/K',
 
    8=>'Fuehler 2 U/K',
 
    9=>'Aussentemp. U/K',
 
  10=>'Fluessigkeit. U/K',
 
  11=>'11',
 
  11=>'12',
 
  13=>'13',
 
  14=>'14',
 
  15=>'15',
 
  16=>'16',
 
  17=>'17',
 
  18=>'18',
 
  19=>'19',
 
  20=>'Abgas Motor zu hoch',
 
  21=>'21',
 
  22=>'Kuehlw. Motor > 95 C',
 
  23=>'Abgastemp. zu hoch',
 
  24=>'Kuehlw. Generator > 77 C',
 
  25=>'25',
 
  26=>'2h Vorlauft < Soll',
 
  27=>'27',
 
  28=>'28',
 
  29=>'UP:Rueckleistung',
 
  30=>'30',
 
  31=>'HKA-Anl. < 100 U/min',
 
  32=>'32',
 
  33=>'HKA-Lauf < 2300 U/m',
 
  34=>'34',
 
  35=>'35',
 
  36=>'36',
 
  37=>'37',
 
  38=>'38',
 
  39=>'Generatorzuschalt',
 
  40=>'Generatorabschalt',
 
  41=>'Generator fehlt',
 
  42=>'kein Text',
 
  43=>'kein Text',
 
  44=>'1h Si-Kette offen',
 
  45=>'kein Text',
 
  46=>'kein Text',
 
  47=>'kein Text',
 
  48=>'UP/LP:Int. b. Start',
 
  49=>'UP: Intern',
 
  50=>'UP/LP: Intern',
 
  51=>'UP:Startfreigabe',
 
  52=>'UP:Datentransfer',
 
  53=>'UP:keine Daten',
 
  54=>'kein Text',
 
  55=>'kein Text',
 
  56=>'UP:Messk Drehzahl',
 
  56=>'kein Text',
 
  57=>'kein Text',
 
  58=>'kein Text',
 
  59=>'UP:Spannung b.St.',
 
  60=>'UP: Spannung',
 
  61=>'kein Text',
 
  62=>'Leistung zu hoch',
 
  63=>'Leistung zu klein',
 
  64=>'Leistung im Stand',
 
  65=>'kein Text',
 
  66=>'ENS-3 Abschaltung',
 
  67=>'UP:Frequenz b.St',
 
  68=>'UP:Frequenz',
 
  69=>'UP:Phasen',
 
  70=>'kein Text',
 
  71=>'Oeldruckschalter',
 
  72=>'Oeldruckmangel',
 
  73=>'MV/Hubmag.undicht',
 
  74=>'MV/Hubmag.undicht',
 
  75=>'kein Text',
 
  76=>'Programmdurchlauf',
 
  77=>'kein Text',
 
  78=>'kein Text',
 
  79=>'4 Starts < 2300 U/m',
 
  80=>'kein Text',
 
  81=>'kein Text',
 
  82=>'kein Text',
 
  83=>'kein Text',
 
  84=>'UP:Drehfeld',
 
  85=>'Fluessigkeitssch',
 
  86=>'UP: Zuendaussetzer',
 
  87=>'Drehz. > 3300 U/min',
 
  88=>'4 Starts 400-800U/m',
 
  89=>'4Starts < 400 U/min',
 
  90=>'kein Text',
 
  91=>'UP:Drehz > 3500 U/m',
 
  92=>'UP:verriegelt',
 
  93=>'UP/RP-Prog.falsch',
 
  94=>'kein Text',
 
  95=>'No ClkRAM Kommuni',
 
  96=>'No Ack-w  I2C-Bus',
 
  97=>'No Ack-r I2C-Bus',
 
  98=>'Clk_RAM write nOK',
 
  99=>'UP:Flags');
 
 
 
 
 
&x48_esex;
 
&wertezuweisung;
 
 
 
### Ab hier kann eigener Code stehen
 
 
 
 
 
if ( $debug == 1){
 
    &debug;
 
}
 
 
 
##### Subrotinen
 
 
 
sub x48_esex {
 
    #Dachs 48 abfrge per Telnet über den ethersex
 
    $esex = Net::Telnet->new || die "kann Ethersex nicht finden";
 
    $esex->open(Host    => $esexip, Port    => $esexport, Timeout => 1);
 
#      $x48hex1=$esex->cmd('msr1 get 1');
 
 
 
    $esex->print("msr1 get 2");
 
    ($non, $x48hex1) = $esex->waitfor(Timeout => 1, Match =>'/[0-9A-Fa-f]+/');
 
    ($non, $x48hex2) = $esex->waitfor(Timeout => 1, Match =>'/[0-9A-Fa-f]+/');
 
    ($non, $x48hex3) = $esex->waitfor(Timeout => 1, Match =>'/[0-9A-Fa-f]+/');
 
    ($non, $x48hex4) = $esex->waitfor(Timeout => 1, Match =>'/[0-9A-Fa-f]+/');
 
 
 
    $x48hex = ($x48hex1).($x48hex2).($x48hex3).($x48hex4); #die vier Einzelwerte zu einem gesamt String zusammensetzen
 
    @x48hex = $x48hex =~ /(..)/g; #Den String in eine Array schreiben (nur die HEX-Werte ohne Leerstellen
 
}
 
 
 
sub wertezuweisung {
 
 
 
        $BETRIEBSSTUNDEN=hex($x48hex[1].$x48hex[2]);
 
        $STARTS=hex($x48hex[3].$x48hex[4]);
 
        $MAXABGAS=hex($x48hex[5])+15;
 
        $MAXGENERTEMP=hex($x48hex[7]);
 
        $MAXMOTORTEMP=hex($x48hex[6]);
 
        #MAXVL auf negative Temp prüfen
 
                if (hex($x48hex[8]) >128 ) {
 
                        $VL=hex($x48hex[8])-255;
 
                }else{
 
                        $VL=hex($x48hex[8]);
 
                }
 
      #Max F1 und F2 auf negative Temp prüfen
 
                if (hex($x48hex[9]) >128 ) {
 
                        $F1TEMP=hex($x48hex[9])-255;
 
                }else{
 
                        $F1TEMP=hex($x48hex[9]);
 
              }
 
              if (hex($x48hex[10]) >128 ) {
 
                      $F2TEMP=hex($x48hex[10])-255;
 
              }else{
 
                      $F2TEMP=hex($x48hex[10]);
 
              }
 
        $MITTELGENLEISTUNG=(7.5 / 255 * hex($x48hex[11]));
 
        $STOERUNGEN=hex($x48hex[12]);
 
        $FLUESSIGKEITSCHALTER=hex($x48hex[55]);
 
        $LETZTEWARTUNG=hex($x48hex[59].$x48hex[60]);
 
        $NAECHSTEWARTUNGOEL=hex($x48hex[59].$x48hex[60])+2700;
 
        $NAECHSTEWARTUNGGAS=hex($x48hex[59].$x48hex[60])+3500;
 
 
 
        #Fehler Code zuweisen
 
        for ($non=1;$non<=7;$non++) {
 
            $FEHLERCODE[$non]=hex($x48hex[7+(6*$non)]);
 
            $FEHLERAUTO[$non]="0";
 
                if ( $FEHLERCODE[$non] > 127 ) {
 
                    $FEHLERCODE[$non]=$FEHLERCODE[$non]-128;
 
                    $FEHLERAUTO[$non]="1";
 
                }
 
            $FEHLERCODELANG[$non]=$Servicecode{$FEHLERCODE[$non]};
 
            $FEHLERSTUNDEN[$non]=hex($x48hex[9+(6*$non)]);
 
                if ( $FEHLERSTUNDEN[$non]=~ /^[0-9]$/ ) {
 
                    $FEHLERSTUNDEN[$non]='0'.$FEHLERSTUNDEN[$non];
 
                }
 
            $FEHLERMIN[$non]=hex($x48hex[8+(6*$non)]);
 
              if ( $FEHLERMIN[$non]=~ /^[0-9]$/ ) {
 
                    $FEHLERMIN[$non]='0'.$FEHLERMIN[$non];
 
                }
 
            $FEHLERTAG[$non]=hex($x48hex[10+(6*$non)]);
 
                if ( $FEHLERTAG[$non]=~ /^[0-9]$/ ) {
 
                    $FEHLERTAG[$non]='0'.$FEHLERTAG[$non];
 
                }
 
            $FEHLERMON[$non]=hex($x48hex[11+(6*$non)]);
 
                if ( $FEHLERMON[$non]=~ /^[0-9]$/ ) {
 
                    $FEHLERMON[$non]='0'.$FEHLERMON[$non];
 
                }
 
            $FEHLERJAHR[$non]=hex($x48hex[12+(6*$non)]);
 
                if ( $FEHLERJAHR[$non]=~ /^[0-9]$/ ) {
 
                    $FEHLERJAHR[$non]='0'.$FEHLERJAHR[$non];
 
                }
 
            $FEHLERDATUM[$non]=$FEHLERSTUNDEN[$non].":".$FEHLERMIN[$non]." ".$FEHLERTAG[$non].".".$FEHLERMON[$non].".".$FEHLERJAHR[$non];  #Deutsch ohne Sekunden
 
            $FEHLERDATUM[$non]=$FEHLERJAHR[$non]."-".$FEHLERMON[$non]."-".$FEHLERTAG[$non]." ".$FEHLERSTUNDEN[$non].":".$FEHLERMIN[$non].":30"; #International mit gemittelte Sekunden
 
            #print "HEXzahl: ".(7 + (6 * $non))."\n";
 
        }
 
 
 
}
 
 
 
sub debug {
 
    print "\n*********** DEBUG Start *************\n\n";
 
    print "48-Hexwert:","@x48hex","\n\n";
 
    print "Betriebstunden:\t\t",$BETRIEBSSTUNDEN,"\n";
 
    print "Letzte Wartung:\t\t",$LETZTEWARTUNG,"\n";
 
    print "Wartung bei Öl (alle 2700h):\t",$NAECHSTEWARTUNGOEL,"\n";
 
    print "Wartung bei Gas (alle 3500h):\t",$NAECHSTEWARTUNGGAS,"\n";
 
    print "Starts:\t\t\t",$STARTS,"\n";
 
    print "MAX Abgas:\t\t",$MAXABGAS,"\n";
 
    print "MAX Gen Temp:\t\t",$MAXGENERTEMP,"\n";
 
    print "MAX Mot Temp:\t\t",$MAXMOTORTEMP,"\n";
 
    print "Max VL:\t\t\t",$VL,"\n";
 
    print "Max F1:\t\t\t",$F1TEMP,"\n";
 
    print "Max F2:\t\t\t",$F2TEMP,"\n";
 
    print "Mittlere Gen Leistung:\t",$MITTELGENLEISTUNG,"\n";
 
    print "Anzahl Störungen:\t",$STOERUNGEN,"\n";
 
    print "Fluessigkeitsschalter:\t",$FLUESSIGKEITSCHALTER,"\n\n";
 
 
 
    print "Fehlerpeicher\n";
 
    print "=============\n";
 
    for ($non=1;$non<=7;$non++) {
 
            print "Fehler: ".$non."\n";
 
            print "Fehlercode: ".$FEHLERCODE[$non]."\n";
 
            print "Autoentstörung: ".$FEHLERAUTO[$non]."\n";
 
            print "Zeit:  ".$FEHLERSTUNDEN[$non].":".$FEHLERMIN[$non]." ".$FEHLERTAG[$non].".".$FEHLERMON[$non].".".$FEHLERJAHR[$non]."\n";
 
            print "Datum: ".$FEHLERDATUM[$non]."\n";
 
            print "Langtext: ".$FEHLERCODELANG[$non]."\n\n";
 
        }
 
 
 
    print "\n";
 
    print "*********** DEBUG Ende **************\n\n";
 
}
 
</source>
 
 
 
=== 50 ===
 
'''Ein Beispiel für die 50 Werte'''
 
 
 
 
 
<source lang="perl">
 
#!/usr/bin/perl -w
 
# Abfrage der Dachs 50-Werte per esex
 
#
 
# kleines Beispielscript, das die 50 Wert abholt ud anschliesend aufbereitet
 
# in Variabeln schreibt.
 
# Das Script kann als Vorlage für eigene Entwicklungen benutzt werden.
 
#
 
# Autor: Lothar Schweikle-Droll
 
# Lizenz: GPL
 
 
 
use strict;
 
use constant PI => 4 * atan2(1, 1);  #Wegen cosph Berechnung
 
use Net::Telnet ();
 
 
 
my $debug=1;
 
 
 
my $esex;
 
my $esexip="192.168.255.90";
 
my $esexport="2701";
 
 
 
my $x50hex1;
 
my $x50hex2;
 
my $x50hex3;
 
my $x50hex4;
 
my $x50hex;
 
my @x50hex;
 
 
 
my $RL;
 
my $VL;
 
my $MOTORTEMP;
 
my $ABGAS;
 
my $AUSENTEMP;
 
my $F1TEMP;
 
my $F2TEMP;
 
my $GENERTEMP;
 
my $DREHZAHL;
 
my $BIVAL_UMSCHALT_TMP;
 
my $BIVAL_UMSCHALT_ZEIT;
 
my $SERVICE;
 
my $UMWALZPUMPESTATUS1;
 
my $UMWALZPUMPESTATUS2;
 
my $U1;
 
my $U2;
 
my $U3;
 
my $I1;
 
my $I2;
 
my $I3;
 
my $COSPHI;
 
my $UE_PLATINE;
 
 
 
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);
 
#      $x50hex1=$esex->cmd('msr1 get 1');
 
 
 
    $esex->print("msr1 get 3");
 
    ($non, $x50hex1) = $esex->waitfor(Timeout => 1, Match =>'/[0-9A-Fa-f]+/');
 
    ($non, $x50hex2) = $esex->waitfor(Timeout => 1, Match =>'/[0-9A-Fa-f]+/');
 
    ($non, $x50hex3) = $esex->waitfor(Timeout => 1, Match =>'/[0-9A-Fa-f]+/');
 
    ($non, $x50hex4) = $esex->waitfor(Timeout => 1, Match =>'/[0-9A-Fa-f]+/');
 
 
 
    $x50hex = ($x50hex1).($x50hex2).($x50hex3).($x50hex4); #die vier Einzelwerte zu einem gesamt String zusammensetzen
 
    @x50hex = $x50hex =~ /(..)/g; #Den String in eine Array schreiben (nur die HEX-Werte ohne Leerstellen
 
}
 
 
 
sub wertezuweisung {
 
 
 
        #VL auf negative Temp prüfen
 
                if (hex($x50hex[1]) >128 ) {
 
                        $VL=hex($x50hex[1])-255;
 
                }else{
 
                        $VL=hex($x50hex[1]);
 
                }
 
        #RL auf negative Temp prüfen
 
                if (hex($x50hex[2]) >128 ) {
 
                        $RL=hex($x50hex[2])-255;
 
                }else{
 
                        $RL=hex($x50hex[2]);
 
                }
 
        $MOTORTEMP=hex($x50hex[3]);
 
        $ABGAS=hex($x50hex[4])+15;
 
        #Ausentemp auf negative Temp prüfen
 
                if (hex($x50hex[5]) >128 ) {
 
                        $AUSENTEMP=hex($x50hex[5])-255;
 
                }else{
 
                        $AUSENTEMP=hex($x50hex[5]);
 
                }
 
      #F1 und F2 auf negative Temp prüfen
 
                if (hex($x50hex[6]) >128 ) {
 
                        $F1TEMP=hex($x50hex[6])-255;
 
 
 
                }else{
 
                        $F1TEMP=hex($x50hex[6]);
 
                }
 
                if (hex($x50hex[7]) >128 ) {
 
                        $F2TEMP=hex($x50hex[7])-255;
 
                }else{
 
                        $F2TEMP=hex($x50hex[7]);
 
                }
 
        $GENERTEMP=hex($x50hex[8]);
 
        $ABGAS=hex($x50hex[4])+15;
 
        $DREHZAHL=hex($x50hex[10].$x50hex[11]);
 
        $BIVAL_UMSCHALT_TMP=hex($x50hex[13]);
 
        $BIVAL_UMSCHALT_ZEIT=hex($x50hex[14].$x50hex[15]); #Wert in Minuten
 
        $SERVICE=hex($x50hex[16]);
 
        $UMWALZPUMPESTATUS1=hex($x50hex[21]);
 
        $UMWALZPUMPESTATUS2=hex($x50hex[21]);
 
 
 
        $U1=105.6 + (100.0 / 461) * (hex($x50hex[31].$x50hex[32])); #105.6V + (100.0 /0x1cd) * Wert
 
        $U2=314.4 - (100.0 / 461) * (hex($x50hex[33].$x50hex[34])); #314.4V - (100.0 /0x1cd) * Wert
 
        $U3=105.6 + (100.0 / 461) * (hex($x50hex[35].$x50hex[36])); #105.6V + (100.0 /0x1cd) * Wert
 
 
 
        $I1=hex($x50hex[37].$x50hex[38]) * (10.0 / 461) - (10.0 * 205) / 461 ; #Wert * (10.0A /0x1cd) - (10.0*0xcd)/0x1cd
 
        $I2=hex($x50hex[39].$x50hex[40]) * (10.0 / 461) - (10.0 * 205) / 461; #Wert * (10.0A /0x1cd) - (10.0*0xcd)/0x1cd
 
        $I3=10.0 / 461 * (757 - (hex($x50hex[41].$x50hex[42]))); #10.0A/0x1cd * (0x02f5 - Wert)
 
 
 
        #$x50hex[43]='C9'; 
 
        $COSPHI=abs( cos(((hex($x50hex[43]))-128)*PI/180) );
 
        if (hex($x50hex[45]) >= 253 ) {
 
            $UE_PLATINE='ok';
 
        }else{
 
            $UE_PLATINE='error';
 
        }
 
 
 
}
 
 
 
sub debug {
 
    print "\n*********** DEBUG Start *************\n\n";
 
    print "50-Hexwert:","@x50hex","\n\n";
 
    print "VL:\t\t\t",$VL,"\n";
 
    print "RL:\t\t\t",$RL,"\n";
 
    print "Motor Temp:\t\t",$MOTORTEMP,"\n";
 
    print "Abgas:\t\t\t",$ABGAS,"\n";
 
    print "F1:\t\t\t",$F1TEMP,"\n";
 
    print "F2:\t\t\t",$F2TEMP,"\n";
 
    print "Generator Temp:\t\t",$GENERTEMP,"\n";
 
    print "Drehzahl:\t\t",$DREHZAHL,"\n";
 
    print "BIVAL_UMSCHALT_TMP:\t",$BIVAL_UMSCHALT_TMP,"\n";
 
    print "BIVAL_UMSCHALT_ZEIT:\t",$BIVAL_UMSCHALT_ZEIT,"\n";
 
    print "U1:\t\t\t",$U1," ",hex($x50hex[31].$x50hex[32]),"\n";
 
    print "U2:\t\t\t",$U2," ",hex($x50hex[33].$x50hex[34]),"\n";
 
    print "U3:\t\t\t",$U3," ",hex($x50hex[35].$x50hex[36]),"\n";
 
    print "I1:\t\t\t",$I1," ",hex($x50hex[37].$x50hex[38]),"\n";
 
    print "I2:\t\t\t",$I2," ",hex($x50hex[39].$x50hex[40]),"\n";
 
    print "I3:\t\t\t",$I3," ",hex($x50hex[41].$x50hex[42]),"\n";
 
    print "COSPHI:\t\t\t",$COSPHI," ",hex($x50hex[43]),"\n";
 
    print "UE_PLATINE:\t\t",$UE_PLATINE," ",hex($x50hex[45]),"\n";
 
    print "UMWALZPUMPESTATUS1:\t",$UMWALZPUMPESTATUS1,"\n";
 
    print "UMWALZPUMPESTATUS2:\t",$UMWALZPUMPESTATUS2,"\n";
 
 
 
    print "\n";
 
    print "*********** DEBUG Ende **************\n\n";
 
}
 
 
 
</source>
 
 
 
[[Kategorie:Ethersex]]
 
[[Kategorie:Home-Visualisierung]]
 
[[Category:MSR1]]
 

Revision as of 11:32, 8 November 2011

nur in deutsch