Dezimal in Binärzahl und fehler ausgeben

Begonnen von jostmario, 22 Dezember 2018, 19:11:25

Vorheriges Thema - Nächstes Thema

jostmario

Hallo,

bekomme über die serielle schnittstelle Zahlen eine Dezimalzahl von 0 bis 255.
Möchte damit den Fehlercode eines Bosch Lambda modules auslesen und die Fehler in Fhem darstellen.
die 0 - 255 sollten daher in eine Binärzahl umgerechnet werden 255 bedeutet quasi   11111111 also kein fehler.
jetzt gibt es eine Tabelle mit fehlercodes.

Auf seite 6 hier im Dokument sieht man wie man es auswerten muss.
http://www.bosch-semiconductors.com/media/automotive_systems_ics/pdf_1/ic_engine_management/bosch_ic_cj125.pdf
Es gibt quasi 4 Blöcke mit jeweil 2 bits  Bit 1+2 ,  Bit3+4 ,  Bit5+6  ,  Bit 7+8

Wie kann ich das jetzt in Fhem am besten realisieren das ich die Fehlermeldungen dann im Klartext als readings bekomme ?

Danke
Gruß Josty

Raspberry Pi  ---  HM-LAN ---  8X HM_HM_CC_RT_DN --- OWL+USB Strommesser    UVR1611

KernSani

Mal vorausgestzt du hast gewisse Perl-Kentnisse, würde ich eine sub ein myUtils bauen, die die Umwandlung macht und dann ein userreading anlegen, das die sub nutzt.


Kurz, weil mobil
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

jostmario

Hallo,

ja Perl kentnisse keine bis ganz wenige.

Gruß Josty
Raspberry Pi  ---  HM-LAN ---  8X HM_HM_CC_RT_DN --- OWL+USB Strommesser    UVR1611

crusader

Na hör mal, Josty,

Dein Informatik-Lehrer hat sich doch wirklich viel Mühe gegeben, diese praxisnahe Aufgabe zu formulieren.

Da kann er doch erwarten, dass Du sie auch selber löst und nicht einfach eine Antwort im Internet zusammenschnorrst.

Tssst

KernSani

#4
Ich gebe mal Hilfe zur Selbsthilfe

Dezimal lesen und in binär umwandeln:


my $dec = ReadingsVal("MeinDevice","meinReading",1);
my $bin = {sprintf "%8b", $dec};


und dann in die Blöcke aufdröseln:

my blocks =~ (..)(..)(..)(..);
my $firstBlock = §1;
usw...


Edit: einfach runtergetippt und ungetestet... Und: Ohne dich in Perl einzulesen wirst du das nicht hinbekommen...
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

jostmario

Hallo,

@crusader   sehr Witzig nee aus dem Alter bin ich raus ....
bin ja schon lange am Fhem basteln tue mir aber mit dem Perl Code immer noch sehr schwer komme noch aus den Pascal zeiten...


@KernSani  Danke, denke damit komme ich etwas weiter.
Werd mal rumspielen.

Soll eine Heizungssteuerung für einen Holzvergaser werden.
https://www.heiztechnikforum.eu/viewtopic.php?f=36&t=1141&sid=afc8bb77a8f8157d8e6b48a79ea00c8f

Gruß Josty
Raspberry Pi  ---  HM-LAN ---  8X HM_HM_CC_RT_DN --- OWL+USB Strommesser    UVR1611

crusader

Wow,

ist ja 'n irres Projekt !

Also, wenn es nur darum geht, die einzelnen bits des Diagnoseworts zu filtern, musst Du nicht unbedingt eine Binärwandlung durchführen.
Du kannst einfach eine logische und-Verknüpfung mit der Zweierpotenz der gesuchten Stelle ausführen und abfragen, ob das Ergebnis grösser als Null ist.

Beispiel:
Dein Diagnosewort sei in der Variablen $diag gespeichert. Das DIAHD-bit ist Binärstelle 6 und kann mit der Maske 2^6=64 abgefragt werden:

my $DIAHD = ($diag & 64) > 0 ? "on":"off"

Die anderen Diagnosebits dann entsprechend.


herrmannj

#7
schönes Projekt. Ergänzend zu crusader, wenn Du die Fehlermeldungen möchtest:

Vorausgesetzt dass das byte msb->lsb ist:
$diag >> 6 # schiebt das ganze byte 6 bits nach rechts. Es bleiben nur die Werte 0..3 entsprechend dem Fehler.
my @fText = ('Short circuit to ground', 'Open load', 'Short circuit to Vbat', 'No failure'); # ein array wird mit den Fehlertexten belegt
my $status = $fText[$diag]; # der Text mit der entsprechenden Nummer wird in die var $status geladen