Dachs MSR1 auslesen: Unterschied zwischen den Versionen

Aus Ethersex_Wiki
Wechseln zu: Navigation, Suche
(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.
  
<code>
+
<source lang="perl">
 
   #!/usr/bin/perl -w
 
   #!/usr/bin/perl -w
 
   # Abfrage der Dachs c0-Werte per esex
 
   # Abfrage der Dachs c0-Werte per esex
Zeile 168: Zeile 168:
 
       print "*********** DEBUG Ende **************\n\n";
 
       print "*********** DEBUG Ende **************\n\n";
 
   }
 
   }
</code>
+
</source>
  
 
[[Kategorie:Ethersex]]
 
[[Kategorie:Ethersex]]

Version vom 27. Juli 2009, 21:37 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


Anschluss

Dachs msr1 anschluss.png

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

Msr1 screenshot.png

 │ │                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";
  }