Tanküberwachung

Aus Ethersex_Wiki
Version vom 17. August 2009, 09:18 Uhr von Loddel (Diskussion | Beiträge) (Überarbeitet und perl Programm)
Wechseln zu: Navigation, Suche

Tanküberwachung der Firma Tecson auswerten

Mit der Tanküberwachung ist es sehr einfach möglich immer die aktuell Füllmenge der Tanks zu erhalten.

Anschluss

Dachs msr1 anschluss.png

Das Ethersex, und der TO-1 haben einen Slave (Weiblich) RS232 Anschluss daher braucht man ein gekreuztes Kabel. Außerdem muss das RTS Signal des TO-1 auf eine logische Null gelegt werden, da sich der TO-1 sonst nicht für irgendwelche Befehle interessiert. (Stromversorgung kommt vom Ethersex). 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 2400 8N1.

Alternative kann man sich in Verbindung mit einem MAX644p einen zweiten RS232 Port bauen und den RS232 Stecker als Master (Männlich) wählen. Als Pinbelegung wählt man die PC Variante und spart sich damit das gekreutzte Kabel.

Auslesen

ein beherztes ecmd `to1 get' gibt eine Hexstring aus. Wobei direkt nach dem Reset nichts kommt, weil: Die Sensoren senden in unregelmässigen Abständen (ca. jede Minute einmal) ihre Daten ungefragt auf die Rs232 Leitung, wobei RS232 etwas als Bus vergewaltigt wird. Daher zeigt `to1 get' immer nur die Sensoren an, von denen in den letzten 250 Sekunden ein valides Paket empfangen wurde. Die Anzahl der Sensoren die vom Ethersex unterstützt werden wird im menuconfig eingestellt.

Der Hexstring hat folgenden Aufbau: 0304d20000093503010bb80582120c

Byte0=03
Byte1=04
Byte2=d2
Byte3=00
Byte4=00
Byte5=09
Byte6=35
Byte7=03
Byte8=01
Byte9=0b
Byte10=b8
Byte11=05
Byte13=12
Byte14=0c

Byte Funktion Beispiel
00 Modell -,-,LX-1,TO-1,LC-1,LX-2,- (03=TO-1)
01 und 02 Seriennummer 04d2=1234
03 Temperatur noch nicht integriert vom Hersteller
04 jedes Bit hat ne andere Bedeutung -
05 und 06 Bestand im Tank 935
07 und 08 Im Anzeigegerät eingstellte Parameter Bit 0-7 = Tanktyp, Bit 8-9 = Dezimalpunkt, Bit 10 = 1, Bit 12-15 = Rundung
09 und 10 Tankvolumen 3000
11 und 12 Tankhöhe 1410
13 und 14 Grenzwerte für Ralais
Hi-Bate Relais 1
Lo-Byte=Relais2 in %

Relais1=18%
Relais2=12%

Byte 4:

Bite Funktion
Bitfeld Störungen und Relaiszustände (sofern im Anzeigegerät vorhanden)
Bit 0 Störeingang Alarm : 1 = Alarm ( je nach Programmierung Schließer/Öffner )
Bit 1 Störeingang Kontaktzustand : 1 = Kontakt geschlossen
Bit 2 Zustand Relais 1 : 1 = Relais hat angezogen
Bit 3 Zustand Relais 2 : 1 = Relais hat angezogen
Bit 4 Quittierung Piepser
Bit 5 - 7 Reserve


Beispiel in Perl

#!/usr/bin/perl -w
# Auswertung des Datensatz von einem Tankobserver der Firma Tescon per esex
#
# kleines Beispielscript, das den Messwert abholt und 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 $non;
my $tohex;
my @tohex;

my $SERNR;
my $BESTAND;
my @MODELL= ('','','LX-1','TO-1','LC-1','LX-2','');
my $MODELL;
my $TEMP;
my $TANKVOL;
my $TANKHOEHE;
my $TANKTYPE;
my $RELAIS1;
my $GRENZ_RELAIS1;
my $RELAIS2;
my $GRENZ_RELAIS2;
my $STOERUNG_ALARM;
my $STOERUNG_KONTAKT;
my $QUIT_PIEPSER;
my @BYTE4; # Bit0 1=alarm, Bit1 1=kontakt, Bit2 1=Relais1 angezogen, Bit3 1=Relais2 angezogen, Bit4 1=Quitt Piepser, Bit5-7 reserve
my @BYTE8;# Bit0-7: Tanktyp, Bit8-9 Dezimalpunkt, Bit10=1, Bit12-15 Rundung
my @BYTE7;# Bit0-1 Dezimalpunkt, Bit2=1, Bit3-7 Rundung
my $DEZIMALPUNKT;#1 = links 3=rechts 2=mitte



&to_esex;
&wertezuweisung;

### Ab hier kann eigener Code stehen

if ( $debug == 1){
    &debug;
}

sub to_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("to1 get");
    ($non, $tohex) = $esex->waitfor(Timeout => 1, Match =>'/[0-9A-Fa-f]+/');

    #$tohex="0306d50000093003010bb80582120c";

    @tohex = $tohex =~ /(..)/g; #Den String in eine Array schreiben (nur die HEX-Werte ohne Leerstellen
}

sub wertezuweisung {

    $SERNR=hex($tohex[1].$tohex[2]);
    $TANKHOEHE=hex($tohex[11].$tohex[12]);
    $TANKVOL=hex($tohex[9].$tohex[10]);
    $BESTAND=$tohex[5].$tohex[6];
    $MODELL=$MODELL[$tohex[0]];
    $TEMP=$tohex[3];
    $GRENZ_RELAIS1=hex($tohex[13]);
    $GRENZ_RELAIS2=hex($tohex[14]);
    $TANKTYPE=hex($tohex[8]);

   #Byte 4 in Array BYTE4 speichern
    my $result = sprintf "%08b", hex($tohex[4]);
       @BYTE4=split(//, $result);  #schreit den scalar $result in das array @BYTE4
       $STOERUNG_ALARM=$BYTE4[0];
       $STOERUNG_KONTAKT=$BYTE4[1];
       $RELAIS1=$BYTE4[2];
       $RELAIS2=$BYTE4[3];
       $QUIT_PIEPSER=$BYTE4[4];

    #Byte 8 und 7 in Array BYTE8 BYTE7 speichern
       $result = sprintf "%08b", hex($tohex[7]);
       @BYTE7=split(//, $result);
       $result = sprintf "%08b", hex($tohex[8]);
       @BYTE8=split(//, $result);


        my ($a,$b,$c,$d) = split //,$BESTAND;
        if ($BYTE7[6] == 0 and $BYTE7[7] == 0) {
                $DEZIMALPUNKT=0;
        }elsif($BYTE7[6] == 0 and $BYTE7[7] == 1){
                $DEZIMALPUNKT=1;
                $BESTAND=$a.".".$b.$c.$d
        }elsif($BYTE7[6] == 1 and $BYTE7[7] == 0){
                $DEZIMALPUNKT=2;
                $BESTAND=$a.$b.".".$c.$d
        }elsif($BYTE7[6] == 1 and $BYTE7[7] == 1){
                $DEZIMALPUNKT=3;
                $BESTAND=$a.$b.$c.".".$d
        }
}

sub debug {
    print "\n*********** DEBUG Start *************\n\n";
    print "t01 Hexwert:","@tohex","\n\n";
    print "Ser-Nr: ","$SERNR","\n\n";
    print "Modell:\t\t\t ".$MODELL,"\n";
        print "Bestand:\t\t ".$BESTAND,"\n";
        print "Temperatur:\t\t ".$TEMP,"\n";
        print "Tankhöhe:\t\t ".$TANKHOEHE,"\n";
        print "Tankvolumen:\t\t ".$TANKVOL,"\n";
        print "Tanktype:\t\t ".$TANKTYPE,"\n";
        print "Relais1 Grenze in %\t ".$GRENZ_RELAIS1,"\n";
        print "Relais2 Grenze in %\t ".$GRENZ_RELAIS2,"\n";
        print "STOERUNG_ALARM:\t\t ".$STOERUNG_ALARM,"\n";
        print "STOERUNG_KONTAKT:\t ".$STOERUNG_KONTAKT,"\n";
        print "RELAIS1:\t\t ".$RELAIS1,"\n";
        print "RELAIS2:\t\t ".$RELAIS2,"\n";
        print "QUIT_PIEPSER:\t\t ".$QUIT_PIEPSER,"\n";
        print "DEZIMALPUNKT:\t\t ".$DEZIMALPUNKT,"\n";

}