Tanküberwachung: Unterschied zwischen den Versionen
(→Auslesen) |
Loddel (Diskussion | Beiträge) (Überarbeitet und perl Programm) |
||
Zeile 13: | Zeile 13: | ||
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. | 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: | + | Der Hexstring hat folgenden Aufbau: 0304d20000093503010bb80582120c |
+ | Byte0=03<br /> | ||
+ | Byte1=04<br /> | ||
+ | Byte2=d2<br /> | ||
+ | Byte3=00<br /> | ||
+ | Byte4=00<br /> | ||
+ | Byte5=09<br /> | ||
+ | Byte6=35<br /> | ||
+ | Byte7=03<br /> | ||
+ | Byte8=01<br /> | ||
+ | Byte9=0b<br /> | ||
+ | Byte10=b8<br /> | ||
+ | Byte11=05<br /> | ||
+ | Byte13=12<br /> | ||
+ | Byte14=0c<br /> | ||
{| border=1 cellspacing=0 padding=4 class=wikitable | {| border=1 cellspacing=0 padding=4 class=wikitable | ||
− | ! | + | ! 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<br />Hi-Bate Relais 1<br />Lo-Byte=Relais2 in % || <br />Relais1=18%<br />Relais2=12% | ||
|} | |} | ||
− | + | Byte 4: | |
+ | {| border=1 cellspacing=0 padding=4 class=wikitable | ||
+ | ! 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 == | ||
+ | <source lang="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"; | ||
+ | |||
+ | } | ||
+ | </source> |
Version vom 17. August 2009, 09:18 Uhr
Inhaltsverzeichnis
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
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 |
---|---|
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";
}