Hallo,
folgende Situation: Ich habe hier die Hauptplatine einer Anlage.
Dazu gibt es ein Diagnosegerät das mittels RJ10 Anschluss an die Platine
angeschlossen wird. Die Kommunikation funktioniert über RS485.
Mit diesem Diagnosegerät werden z.B. Fehler ausgelesen oder
Diagnosefunktionen gestartet. Ich versuche nun die Kommunikation davon
abzufangen. Ziel ist es, die Befehle der verschiedenen Funktionen so
abzufangen, das ich sie mit einem Laptop/PC senden kann und das
Diagnosegerät nicht benötige.
Mit Serial Port Monitor und selbstgebautem Adapter wird exakt gleich da
gestellt, was das Diagnosegerät auch anzeigt.
Wenn ich nun z.B "Fehler auslesen" wähle, bekomme ich im Serial Port
Monitor als Code "66 FC 68 20" und so weiter.Wenn ich aber den exakt
gleichen Code über den RJ10 Port an die Platine sende, gibt es keinerlei
Rekation. Ich habe wenig Ahnung, wie man vermutlich merkt.
Muss ich mir das aus dem Kopf schlagen oder ist das doch nicht so
schwer?
Mit freundlichen Grüßen
Kann man das Timing irgendwie mitschneiden? Also quasi der Abstand in
der Befehle gesendet werden müssen?
Meine Vorstellung von "Befehl XY wird gesendet -> Funktion 12 wird
ausgeführt" ist vermutlich zu schön?
Nachtrag:
Die Kommunikation im Serial Port Monitor, also Parity, Geschwindigkeit
etc. sind vermutlich richtig, da nur mit einer Geschwindigkeit Klartext
angezeigt wird, wenn ich zwischen Diagnosegerät und Platine lese.
Müsste diese dann nicht auch die richtige zum senden sein?
Thomas Klein schrieb:> Müsste diese dann nicht auch die richtige zum senden sein?
Im Prinzip stimmt das.
Aber du mußt auch die Antworten im zeitlichen Kontext erfassen.
Evtl. mußt du erst irgendwelche acknowledge Sequenzen abwarten bevor du
weiter senden darfst.
Kauf dir für paar Euro auf ebay so einen fx2 logic analyzer (gehandelt
als usbee oder saleae). Lad dir dazu pulseview/sigrok und schneid damit
die Kommunikation mit.
Rs485 kosten die Schnittstellenwandler ja nur cents...
Thomas Klein schrieb:> Mit diesem Diagnosegerät werden z.B. Fehler ausgelesen oder> Diagnosefunktionen gestartet.
Der Tester als Master konfiguriert oder als Slave ?
Auch kann man auf dem Bus einfach nur Lauschen und die Kommunikation
erledigt die Anlage. So ganz klar finde ich das nicht.
RS-485 ist nur die physikalische Spezifikation.
Die Kommunikation ist dann Protokollsache, vermutlich CAN.
Da kann man nicht mal eben einen zweiten Master anklemmen, es sei denn,
ein Tester ist da extra für konzipiert, aber der müsste sich dann
mit dem Master der Anlage irgendwie arangieren. Ohne Informationen
kann das hier aber keiner wissen.
naja, erstmal ist RS485 bidirektional. Wenn du da nur "mitliest" weißt
du ja noch nicht, wer was gesendet hat. Du mußt also erstmal
herausfinden was die Hauptplatine und was das Diagnosegerät geschickt
hat.
Dazu müßtest du zusätzlich die Steuersignale am Treiberbaustein abreifen
und auswerten ... da hilft auch der von max_d erwähnte Logikanalyzer.
Evtl. liegt der Fehler auch in deiner selbst gebauten Hardware, und sie
kann zwar lesen aber nicht korrekt senden.
Ich würde mir zunächst die Signal des Diagnosegerätes mit einem
Oszilloskop ansehen, damit bekommst du sowohl die genaue Bitrate als
auch die benötigten Pegel heraus.
Um herauszufinden, was vom Diagnosegerät kommt und was die Anlage
sendet, kann ein 1K Serienwiderstand in einer der Datenleitungen und ein
2-Kanal Oszilloskop hilfreich sein. Je nach dem, von welcher Seite
gesendet wird, ist der Signalpegel dann auf der jeweiligen Seite des
Serienwiderstandes ca. 10% höher.
Thomas Klein schrieb:> bekomme ich im Serial Port> Monitor als Code "66 FC 68 20" und so weiter
Man muss Frage UND Antwort analysieren - bei RS485 ist also zu klären,
was die Maschine und was das Diagnosegerät sendet. Das sieht man aber
bei RS485 den Daten auf der Leitung nicht an. Nach deinen Angaben könnte
z.B. das Diagnosegerät "66" gesendet haben und die Antwort darauf ist
"FC 68 20". Das bekommt man höchstens mit dem Timing heraus, wenn es
zwischen Frage und Antwort eine Pause gibt.
Georg
Georg schrieb:> Das bekommt man höchstens mit dem Timing heraus
Wie gesagt, ein Oszilloskop kann hier auch Aufschluss geben. Sehr
wahrscheinlich unterscheiden sich die Pegel der beiden Sender, falls sie
genau identisch sein sollten, kann ein Serienwiderstand eine
Pegeldifferenz herstellen, die man dann nutzen kann.
Joe F. schrieb:> Wie gesagt, ein Oszilloskop kann hier auch Aufschluss geben. Sehr> wahrscheinlich unterscheiden sich die Pegel der beiden Sender, falls sie> genau identisch sein sollten, kann ein Serienwiderstand eine> Pegeldifferenz herstellen, die man dann nutzen kann.
Oder man trennt ganz einfach die Verbindung und zeichnet nur das,
was von DG gesendet wird.
Dann verbindet man die beiden wieder und schaut nochmals...
P.S.
Max D. schrieb:> Rs485 kosten die Schnittstellenwandler ja nur cents...
Plus Arduino für 1,7E kann Wunder wirken...
Abdul K. schrieb:> Mit einem Zirkulator aus OpAmps kann man auch bidirektionale> Kommunikation auftrennen.
Sicher, aber das muss man erst zusamenbauen, mit RS485 Adapter und
Arduino dauert es nur Minuten bis das Ganze dekodiert ist:
1
Beispiel:
2
DG und Platine verbunden (Arduino als Listener):
3
*** DG sendet "Fehler auslesen" ***
4
Aufgezeichnet: 66 FC 68 20
5
*** Verbindung zwischen DG und Platine auftrennen ***
6
*** DG sendet wieder "Fehler auslesen" ***
7
Aufgezeichnet: 66
8
*** 1) Arduino empfängt 66, sendet FC zurück ***
9
*** Falls keine Antwort:
10
Arduino empfängt 66, sendet FC 68 zurück
11
DG antwortet mit 20
12
Oder:
13
*** 2) Arduino empfängt 66 FC, sendet 68 zurück ***
14
*** DG antwortet mit 20
oder so ähnlich, das Ganze sollte auf jeden Fall nicht länger
als ein paar Minuten pro Befehl dauern...