Ich arbeite mit Canbus in Python (Pcan grundlegende API) und möchte es einfacher zu bedienen.High Level/Abstract Canbus Schnittstelle in Python
Über den Bus werden viele Geräte/Module angeschlossen. Sie dürfen alle Daten senden, wenn eine Kollision eintritt, wird die niedrigste ID gewonnen.
Die Daten werden in Rahmen organisiert mit ID, SubID, hexvalues
das Problem zu veranschaulichen, ich bin versucht, Adresse, die Amplitude eines Signals vorstellen.
Um den Wert ein Rahmen senden
- QuestionID QuestionSUBID QuestionData
zu lesen Wenn es keine Meldung mit höherer Priorität (= lowerID) ist die Antwort auf den Bus geschrieben wird:
- answerID AnswerSubID AnswerData
Da jedes Modul/Gerät auf den Bus schreiben darf, wissen Sie nicht im Voraus, welche Antwort Sie als nächstes bekommen. Einen Wert zu setzen morks den gleichen Weg, nur mit verschiedenen IDs. So für das obige Beispiel würde die Amplitude:
- 4-IDs und SubIDs Verbunden mit Lese/Schreib-Frage/Antwort
- Zusätzlich wird die Länge der Daten hat (0-8) hat angegeben/gespeichert werden.
- Da die Daten all hex-Werte ein Parser den für Menschen lesbaren Wert (zB Spannung in Dezimaldarstellung) zu spezifizieren hat
Um diese Informationen zu erhalten, zu speichern I nested dicts verwenden:
parameters = {'Parameter_1': {'Read': {'question_ID': ID,
'question_SUBID': SubID,
'question_Data': hex_value_list,
'answer_ID': ...,
'answer_subID': ...,
'answer_parser': function},
'Write': {'ID': ...,
'SubID': ...,
'parser' ...,
'answer_ID': ...,
'answer_subID': ...}},
'Parameter_2': ... }}
Es gibt viele Tools, die zeigen, welcher Wert wann eingestellt wurde, aber für die Hardwaresteuerung ist die Reihenfolge, in der die Parameter gelesen werden, nicht relevant, solange sie aktuell sind. Somit ist ein Teil einer möglichen Lösung wäre, den gesamten Verkehr in einem dict von dicts Speicherung:
busdata = {'firstID' : {'first_subID': {'data': data,
'timestamp': timestamp},
'second_subID': {'data': data,
'timestamp': timestamp},
},
secondID': ...}
Aufgrund der Natur des Busses, erhalte ich eine Menge Antworten andere Geräte gefragt - der Bus ist ziemlich voll - Diese sollten nicht verworfen werden, da sie möglicherweise die Werte sind, die ich als nächstes brauche, und es besteht keine Notwendigkeit, zusätzlichen Verkehr zu erzeugen - ich könnte den Zeitstempel mit einem Ablaufdatum verwenden, aber darüber habe ich bisher nicht viel nachgedacht.
Das funktioniert, aber es ist schrecklich mit zu arbeiten. Im Allgemeinen werde ich ungefähr 300 Parameter haben. Das letzte Ziel besteht darin, die Geräte über ein (pyqt) Gui zu steuern, einige Werte wie Seriennummern zu lesen, aber auch Messaufgaben auszuführen.
Die große Frage ist also, wie man eine bessere Datenstruktur definiert, die leicht zugänglich und verständlich ist? Ich freue mich auf jeden Vorschlag für ein sauberes Design.
Das Hauptziel wäre etwas wie los von der ganzen Nachricht basierte Ansatz.
EDIT: Mein Ziel ist die gesamten CAN-basierte aproach bestimmte Nachricht loszuwerden:
ich, dass ich für die Kommunikation einen Thread muß davon ausgehen, soll es:
- die Puffer lesen und aktualisieren meine Variablen
- senden Anfragen (Nachrichten) an andere Werte/Variablen erhalten
- einige Werte senden periodisch
vom gui Also ich würde gerne derte:
- get Parameter nach Namen -> str (name), Wert -> einen String mit Parameternamen
- Einstellparameterregister Signal senden (als displayedin die gui)
- get Werte in regelmäßigen Abständen -> Name, Intervall, Dauer (10s oder unendlich)
Der Faden müßte:
- Log alle Daten auf dem Bus für interne Speicher
- Prozessanforderungen von Nachrichten von Name, Wert zu erzeugen und lesen, bis Ergebnis
- Senden periodischer Signale
erhalten wird Ich mag diesen Entwurf idependant haben der tatsächlichen Hardware:
- die Lösung, die ich dachte, ist das oben parameters_dict
für den internen Speicher dachte ich über die bus_data_dict
Noch ich bin nicht sicher, wie man:
- Pass Daten vom Bus Thread zu dem gui (alle Werte vs. neu/angeforderter Wert)
- So implementieren Sie es mit Signalen und Steckplätzen in pyqt
- Speichern Sie Daten intern (Diktat oder einige neue bessere Idee)
- Wenn dieser Entwurf eine gute Wahl
machen Sie eine Klasse, die dies abstrahiert ... Canbus basiert vollständig auf Nachrichtenpakete, so dass ich glaube nicht, Sie können es beseitigen ... aber Sie können es sicherlich abstrahieren ... –
Ja, natürlich. Vielleicht habe ich das deutlich genug gesagt. Die Frage ist, wie dies zu implementieren ist. Ich dachte über Eigenschaften mit richtigen Gettern und Setter nach - trotzdem würde ich eine interne Darstellung der Daten benötigen. – slepton