Jump to content
Tom Next - Daytrading Community

SystemStatus - Wie nennt man folgende Methode?


GoSPvC

Recommended Posts

Ich möchte für eines meiner TS5-Systeme, das ziemlich kompliziert geworden ist einen SystemStatus entwerfen. Dieser Statuswert soll je nach unterschiedlichen Vorkommnissen verschiedene Werte annehmen. Es gibt eine Methode, wie man verschiedene Statuse in einem Wert darstellen kann, z.B.

 

SystemRunning = 0

SystemStop alles größer 0

Grund1 = 1

Grund2 = 2

Grund3 = 4

Grund4 = 8

Grund5 = 16

Grund6 = 32

 

... damit man mehrere verschiedene Gründe in diesem einen Wert unterbringt. Ich hoffe ich hab es verständlich erklärt :-)

 

Aber, wie nennt sich diese Methode? Ich würde gerne nach einer Beschreibung oder Erklärung dieser Methode googeln, weiß aber nicht nach was ich suchen soll...

Link to comment
Share on other sites

Möchtest Du die Stati bitweise speichern?

Hat man früher gemacht um Speicherplatz zu sparen.

Heute hat ja eine Bool Variable um 1 Bit zu speichern gleich 32 oder noch mehr Bit :hrhrhr:.

Macht also nur Sinn, wenn Dir der Speicherplatz ausgeht.

Der Übersichtlichkeit wegen könntest die Werte in Arrays oder Records/Structs (je nach Sprache) ablegen.

Link to comment
Share on other sites

Sieht nach einem einfachen

Dualsystem->Dezimalsystem

Dezimalsystem->Dualsystem

aus.

 

Danke, ich bemühe Google mal und schau, ob's das ist, was ich meine.

 

 

Möchtest Du die Stati bitweise speichern?

Hat man früher gemacht um Speicherplatz zu sparen.

Heute hat ja eine Bool Variable um 1 Bit zu speichern gleich 32 oder noch mehr Bit :hrhrhr:.

Macht also nur Sinn, wenn Dir der Speicherplatz ausgeht.

Der Übersichtlichkeit wegen könntest die Werte in Arrays oder Records/Structs (je nach Sprache) ablegen.

 

Nein, um Speicherplatz geht's mir weniger. Mir kommt diese Methode logisch und einfach vor: Ein Wert enthält alle Gründe, warum das System auf "Stop" geschalten hat.

Hab mir früher noch nie Gedanken über sowas gemacht. Hast du evtl. nen Link, wo man Infos über dieses Thema bekommt?

Am besten in Anfänger-Form :-)

Link to comment
Share on other sites

Michi,

 

was ist das denn für eine Sprache?

Grundsätzlich werden die Bits mit einer ODER Verknüpfung gesetzt und mit einen UND Verknüpfung gelöscht bzw. auf Null gesetzt.

Abgefragt werden die Bits mit einer UND Verknüpfung, das ist alles.

Du mußt aber wissen ob und wie das in Deiner Sprache geht.

Der Übersichtlichkeit wegen würde ich jedem Zustand (Bit) noch einen Namen geben (Konstante).

Ich schau mal, ob ich ein Beispiele finde.

Link to comment
Share on other sites

was ist das denn für eine Sprache?

Grundsätzlich werden die Bits mit einer ODER Verknüpfung gesetzt und mit einen UND Verknüpfung gelöscht bzw. auf Null gesetzt.

Abgefragt werden die Bits mit einer UND Verknüpfung, das ist alles.

Du mußt aber wissen ob und wie das in Deiner Sprache geht.

Der Übersichtlichkeit wegen würde ich jedem Zustand (Bit) noch einen Namen geben (Konstante).

Ich schau mal, ob ich ein Beispiele finde.

 

Ich glaub, du bist viel zu tief; es geht um Equilla/EasyLanguage von TradeSignal5 bzw. TradeStation. Das ist eher eine KindergartenSprache :-)

 

Ich geb dir nochmal ein Beispiel, was ich meine:

 

Der Status ist 0 - Das bedeutet, das System ist auf "Go"

 

-> Jetzt passieren ein oder mehrere Fehler:

 

Der Status soll jetzt z.B. 21 sein

 

-> Das bedeutet 16 + 4 + 1

also ist Grund1 und Grund4 und Grund16 aufgetreten.

Link to comment
Share on other sites

Hmm du hast dann doch sicherlich vor die Werte deiner Gründe zu addieren oder?

Dann kriegst du was weiss ich 57 raus und kannst das halt eindeutig im Dualsystem zerlegen.

Also 32,16,8,1 oder im Dualsystem 111001.

Du benötigst da halt das jede Stelle im Dualsystem nur 2 Werte hat.

 

Genau, das meine ich. Gibt's für diese Methode der Fehlercodeangabe einen speziellen Namen, nach dem ich googeln könnte ??

Link to comment
Share on other sites

Genau, das meine ich. Gibt's für diese Methode der Fehlercodeangabe einen speziellen Namen, nach dem ich googeln könnte ??

also mir ist da kein name bekannt, du brauchst übrigens nicht das dualsystem.

du könntest auch folgendermaßen vorgehen

Alles Klar=0

Grund1 =1

Grund2=10

Grund3=100

...

 

Du musst halt nur sicherstellen dass du eine eindeutigkeit für deine Zuweisungen hast. Am effizientesten ist da natürlich das dualsyste, (hier sieht. man z.B warum ein pc das Dualsystem verwendet, genau so kann man fehler schön ababrbeiten).

Ich bin mir grade nicht sicher ob man die zahlen die Rauskommen nicht durch den euklidischen Algorithmus also durch die ggT Bestimmung von 57 und 2 erhält, wobei man als vielfache nru zahlen aus dem dualsystem zulässt :)

Also 57 = 16*2+25 = 32+25

25=2*8+9= 16+9

9=2*4+1=8+1

1=0*2+1

da wir nicht auflösen müssen wir also das bit an der letzten stelle auf 1 setzen.

 

Aber ich glaube das wird viel zu kompliziert ^-^

Link to comment
Share on other sites

Schau mal unter "Bitmanipulation".

Kommt aber alles auf das Gleiche raus, denn Dein Ansatz ist schon richtig (Binäre Werte für jeden Fehler 1, 2, 4, 8 usw).

Wenn ich nämlich z.B. 1 und 2 addiere ist es dasselbe, wenn ich Bit0 und Bit1 setze.

Möchtest Du aber umgekehrt wissen welche Fehler genau aufgetreten sind, geht das m.E. nur mittels Auslesen der einzelnnen Bits.

Link to comment
Share on other sites

Ich hab nie gesagt dass man es nicht auch mit bitauslesen machen kann.

Vermutlich ist das sogar der einzig praktikable weg, da bei 15 gründen double zahlen schon nicht mehr ausreichen.

 

Zur Frage: du kennst doch deine abbildung! Du musst halt nur eine Struktur für die Bijektion angeben :)

Du teislt 111/100>1 also ist das bit gesetzt, dann ziehste 100 ab teilst den rest durch 10 ist wieder größer eins, also ist das bit gesetzt und so weiter :)

Was man halt nie vergessen sollte: Teilen und Teilen mit Rest kann sehr vieles sehr einfach machen :)

Link to comment
Share on other sites

Dieses Prinzip wird bei Einstellungen in Autosteuergeräten verwendet.

Man kann so jeder Einstellung eine zahl zuweisen und dann ganze Einstellungsgruppen ablesen anhand einer Zahl. Das geht mit alles Zahlen mit 2, 4, 8, 12, 32, ...

 

Mittlerweile wird das "Lange System" benutzt.

Schau mal hier: http://de.openobd.org/faq.htm, scrolle dort herunter bis zur Erklärung.

 

{Lange Codierung} In neueren Fahrzeugen insbesondere im Zusammenhang mit CAN-BUS basierter Diagnose wird die sogenannte lange Codierung verwendet.

Dabei wird eine hexadezimale Bytegruppe ausgegeben die i.d.R. zur Neucodierung in ihre einzelnen Bytes/Bits gesplittet werden muss, wie das folgende Beispiel erklärt.

 

Im folgenden Beispiel wird die Aktivierung des Tagfahrlichtes in Golf 5 basierten Fahrzeugen erläutert.

 

Die Codierung des Beispiel Bordnetz Steuergerätes ist 008F8F020004200000120C. Wir splitten nun die gesamte Codierung in die einzelnen Bytes und rechnen diese (z.B. mit dem Windows-Taschenrechner - Ansicht/Wissenschaftlich) in Binärwerte um.

 

Byte - Hexadezimal Byte - Binär

00 00000000

8F 10001111

8F 10001111

02 00000010

00 00000000

04 00000100

20 00100000

00 00000000

00 00000000

12 00010010

0C 00001100

Das jeweilige Byte wird nun in Bit's aufgeteilt und die Bedeutung des einzelnen Bit's wird den Tabellen von OpenOBD.org entnommen.

In unserem Beispiel wollen wir Byte 00 Bit 3 auswerten (Hinweis: Die Bytes werden von Links nach Rechts gezählt und die Bit's von Rechts nach Links, man beginnt jeweils mit 0). Byte 00 hat demnach den hexadezimal Wert 00, umgewandelt in das binäre System 00000000.

 

Bit Wert Bedeutung

Bit 0 0 Nebelscheinwerfer verbaut

Bit 1 0 Xenonscheinwerfer verbaut

Bit 2 0 Fußraumbeleuchtung verbaut

Bit 3 0 Tagfahrlicht (Skandinavien)

Bit 4 0 Tagfahrlicht (Nordamerika)

Bit 5 0 Assistenzfahrlicht

Bit 6 0 Regen-/Lichtsensor verbaut

Bit 7 0 Coming-Home verbaut

Anhand der Tabellen steht also Byte 00 Bit 3 für das Tagfahrlicht in der Skandinavien Variante (Hauptscheinfer), d.h. in diesem Fall ist kein Tagfahrlicht aktiviert.

 

Um nun das Tagfahrlicht zu aktivieren muss Byte 00 Bit 3 gesetzt werden, d.h. der neue Wert ist 1 der neue binäre Wert für Byte 00 ist demnach 00001000 umgerechnet ins Hexadezimal System ist der neue Wert 08.

 

Nun wird die komplette Lange Codierung wieder ins Steuergerät geschrieben: 088F8F020004200000120C

 

Da gibt es auch ein Programm namens LCode um das einfach umzurechnen, aber ich finde das bei mir nicht mehr...

Link to comment
Share on other sites

Da gibt es auch ein Programm namens LCode um das einfach umzurechnen, aber ich finde das bei mir nicht mehr...

 

Das macht doch nix Henrik, Quickbeam hat sicher Lust ein Beispielprogrämmchen zu schreiben, das das Auslesen der Zustände mittels Teilen und Rest beim CANBus veranschaulicht. :hrhrhr:

Link to comment
Share on other sites

Da das ja fast eine mathematische Frage ist, und ich grad die Masterprüfung hinter mir hab, muss ich jetzt auch noch meinen Senf dazugeben:

 

Hättest du die verschiedenen Gründe nicht kombinieren müssen, dann wär das Prinzip ein enum gewesen (bzw. Enumeration), aber da kannst nix kombinieren (zumindest nicht standardmäßig).

 

Namen dafür kenn ich auch keinen der wirklich gebräuchlich wäre, liegt vermutlich auch daran das es jeder macht ohne einen Namen dafür zu haben.

 

Wie du schon bemerkt hast wirds mit vielen verschiedenen Statusen eng. Am effizientesten bist du wenn du im binärsystem arbeitest. Es gänge aber jedes Zahlensystem als Grundlage (also zB das 10er System für 10, 100, 1000 etc). Vorteil am binärsystem: du nutzt den gesamten Zahlenbereich mit deinen Statusen aus, bei jedem anderen hättest du mehrere Zahlen die nie auftreten würden.

 

Bei 15 wirds im binären mit double aber noch nicht eng, ich würd auch auf keinen Fall double verwenden, da dir sonst irgendwann rundungsfehler ein paar errors killen :hrhrhr:

 

Mit normalen Integer kannst du für jedes Bit einen Status haben. Also im Regelfall 32 statuse. Notfalls musst halt ein zweites Int dazunehmen. Am einfachsten über vordefinierte Konstante (weiß nicht mehr ob equilla bitoperationen zulässt). Mit Bitoperationen ist das setzen/abfragen der statusbits natürlich am einfachsten. Wenn du die nicht zur Verfügung hast, dann gehts aber auch mit simplen Rechenoperationen:

Abfragen des x-ten status:

 

gesetzt= ((status/(2^x)) % 2) != 0;

setzen (geht nur wenn nicht schon gesetzt, als ggf. vorher prüfen):

status += 2^x;

bzw inline:

status += ((status/(2^x)) % 2) == 0 ? 2^x : 0;

 

(Die 2^x am einfachsten durch Konstante ersetzen, wenn du ein anderes System nehmen willst, einfach den 2er durch die entsprechende Zahl ersetzen)

 

hth

  • Upvote 2
Link to comment
Share on other sites

"bitmask" (engl) bzw. "Bitmaske" (deutsch) ist der entsprechende Ausdruck, Google gibt weitere Infos..

naja, eine Bitmaske verwendet man hier nur für das setzen/auslesen der Bits. Die Methode die Statuse so zu speichern ist dann eher ein Bitfield oder? Aber der Name ist glaub ich nicht so extrem verbreitet, vor allem nicht in Tradingkreisen ;)

Link to comment
Share on other sites

naja, eine Bitmaske verwendet man hier nur für das setzen/auslesen der Bits. Die Methode die Statuse so zu speichern ist dann eher ein Bitfield oder? Aber der Name ist glaub ich nicht so extrem verbreitet, vor allem nicht in Tradingkreisen ;)

 

Weiss nicht, ich kenns nur unter diesem Namen, meistens mit 2er Potenzen oder Primzahlen.

Link to comment
Share on other sites

Aber, wie nennt sich diese Methode?

Was du hier machst ist eigentlich eine Bit Codierung. Du weist jedem einzelnen Bit einen best. Status zu.

Du kannst das einfach mit folgender Formel codieren:

 

Code = ... Grund5 x 16 + Grund 4 x 8 + Grund3 x 4 + Grund2 x 2 + Grund1 x 1

 

GrundX kann hierbei die Werte 0/1 annehmen.

Link to comment
Share on other sites

@all:

 

Danke an Alle !!! Ihr habt mir sehr weitergeholfen...

 

Mit euren Infos kann ich einiges anfangen. Ich werd jetzt versuchen, das als zwei Funktionen StatusGet() und StatusSet() umzusetzen und wahrscheinlich noch ein paar Fragen haben. :-)

 

Bei Interesse stell ich die dann hier rein; ich hoffe, bis über's WE was funktionierendes zu Stande zu bringen.

 

Danke nochmals...

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...