PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Reverse engineering eines Protokolls. Und UART mit BASCOM



128er
16.07.2015, 20:04
Guten Abend!

Ich habe einen industriellen Thyristorsteller und dieser besitzt zur parametrierung eine UART Schnittstelle. Mit dem zugehörigen PC Programm lassen sich aber nicht nur die Parametersätze ändern. Auch kann man sich Momentanwerte wie Spannung, Strom, Leistung, etc. anzeigen lassen. Diese Werte würde ich gerne mit einem Mikrocontroller vom Thyristorsteller anfordern und auf einem LCD darstellen.

Zuerst habe ich die Kommunikation mit meinem Speicheroszilloskop aufgenommen und mir die Telegramme angeschaut. Am einfachsten war es, mit der Abfrage der Kühlkörpertemperatur anzufangen. Das Telegram dafür war simpel zu finden. Mit Finger auf Temperatursensor drücken und gucken in welchem Telegramm sich Bytes ändern.

Nun möchte ich zum debuggen/testen, diesen Thyristorsteller der Parametrierungssoftware vorgaukeln.

UART Parameter sind: 38400 Baud, 8N1.

Hier Beispiele für die Kommunikation:
Software sendet zur Abfrage der Temperatur: 02 8E 90
Thyro liefert für Kühlkörpertemperatur 31,0°C: 02 8F 00 00 07 03 00 01 00 00 9C
30481

Software sendet zur Abfrage der Temperatur: 02 8E 90
Thyro liefert für Kühlkörpertemperatur 31,1°C: 02 8F 00 00 07 04 00 01 00 00 9D
30482

Software sendet zur Abfrage der Temperatur: 02 8E 90
Thyro liefert für Kühlkörpertemperatur 31,3°C: 02 8F 00 00 07 05 00 01 00 00 9E
30483

Es ändern sich nur das sechste und elfte Byte in der Antwort. Zwischendurch sendet die Software immer wieder "02 80 00 82", was mit "02 81 01 09 8D" auf der Geräteseite beantwortet werden muss, um der Software die Betriebsbereitschaft des Thyros anzuzeigen. Ansonsten wird ein Übertragungsfehler gemeldet.

Nun sind meine bisherigen Erfahrungen mit UART bei BASCOM eher bescheiden. Und ich bräuchte wohl einen Anstoß in die richtige Richtung, wie ich die teils unterschiedlich langen Bytefolgen am besten einlesen und auswerten sollte. Sollte ich jedes empfangene Byte einzeln in einem Byte-Array speichern? oder wie würde man es am sinnvollsten angehen?

Das war mein erster Ansatz um die UART Kommunikation zum Controller mit einem Terminalprogramm zu testen. Funktioniert soweit auch. Nur für die Auswertung von langen Bytefolgen fehlt mir der Lösungsansatz.


$regfile = "m32def.dat"
$crystal = 16000000
$hwstack = 20
$swstack = 20
$framesize = 20
$baud = 38400

Enable Interrupts

Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0

Config Lcd = 16 * 2

Config Serialin0 = Buffered , Size = 20 , Bytematch = All

Declare Sub Serial0bytereceived

Dim Incomingdata As Byte


Do

!NOP

Loop

End

Sub Serial0bytereceived()

Inputbin Incomingdata

If Incomingdata = &HAF Then

Printbin &H02 ; &H80 ; &H90

Else

Print "Bitte AF(HEX) senden!"

End If

Clear Serialin

End Sub

Ich hoffe meine gegebenen Informationen reichen erstmal aus.

Danke!

peterfido
16.07.2015, 20:34
Scheint, als ob jede Anfrage mit 02 beginnt. Dann kommt der Parameter dann die PrüfSUMME im wahrsten Sinne. Als Antwort kommt auch zuerst 02 und dann der Parameter +1 sowie die Werte. Zuletzt eine einfache PrüfSUMME
02 + 8F + 00 + 00 + 07 + 03 + 00 + 01 + 00 + 00 = 9C

Von Systernals gibt es einen Logger für die Schnittstelle, wenn ich mich nicht irre.

Peter(TOO)
17.07.2015, 07:36
Hallo,

Ich gehe da auch einig, dass mit 0x02 (STX = Start of TeXt) der Anfang markiert wird.
Hinten ist eine Prüfsumme angehängt.

Das zweite Byte (Befehl) scheint bei der Antwort um eins erhöht, in der Antwort zu stehen. Dazu müsste man aber unterschiedliche Abfragen auswerten.


Die dritte Antwort verwirrt mich etwas:
Entweder müsste die Temperatur 31.2°C sein oder in der Antwort 0x06 anstatt 0x05 vorkommen ?

MfG Peter(TOO)

schorsch_76
17.07.2015, 10:17
Das sieht aus wie USS.

https://cache.industry.siemens.com/dl/files/253/24178253/att_101236/v1/uss_24178253_spez_00.pdf

Peter(TOO)
17.07.2015, 12:57
Hallo,

Das sieht aus wie USS.

https://cache.industry.siemens.com/dl/files/253/24178253/att_101236/v1/uss_24178253_spez_00.pdf

Passt aber nicht:
1. das 2te Byte ist bestimmt nicht die Länge, sondern der Befehl.
2. Hier wird am Ende die Prüfsumme gesendet und kein XOR.

MfG Peter(TOO)

128er
17.07.2015, 23:50
Hallo,
Die dritte Antwort verwirrt mich etwas:
Entweder müsste die Temperatur 31.2°C sein oder in der Antwort 0x06 anstatt 0x05 vorkommen ?

MfG Peter(TOO)

Hi und vielen Dank für eure konstruktiven Antworten. Im Moment hab ich etwas wenig Zeit, deswegen nur kurz . . .

Die Lücken haben mich auch irritiert. Ich sehe darin auch kein Muster. Die angehängte Tabelle habe ich wie folgt erstellt. Oszilloskop an den UART, seriellen Trigger auf das Telegramm eingerichtet. Die PC Software des Thyros aktualisiert den Wert so gefühlt jede Sekunde, zeitgleich sah ich es auch auf dem Oszilloskop. Da konnte ich dann gemütlich das Oszilloskop stoppen und die Bytes notieren. So sind die Werte mit dem Vermerk "gemessen" zustande gekommen. Die Lücken in 0,1 °C Schritten werden niemals angezeigt. Egal wie lange ich die Software laufen lasse, oder ich den Temperatursensor auch trieze. Aus diesem Grund möchte ich der PC Software jetzt den Thyro vorgaukeln. Da sich die weiteren Temperaturwerte schwer ableiten lassen, wenn die Lücken so unregelmäßig vorhanden sind.

30490

Peter(TOO)
18.07.2015, 02:57
Hallo,

nur mal schnell überflogen: Der Umrechnungsfaktor ist 5,8, das erklärt die Lücken.
Möglicherweise rechnet das Ding intern in °F.
Byte4 und Byte 5 scheinen die Temperatur zu sein, wobei von Byte 4 nur Bit 0 sicher der Wert ist.

Wieso von Byte 4, die Bits 1+2 auf 1 stehen, weiss ich nicht?

Ich komme auch erst am Montag dazu, mehr rauszufinden.

128er
20.07.2015, 23:58
Kurze Info

Dieses Programm hat sich als Ideal rausgestellt für meine Zwecke:
http://docklight.de/

Man kann z.B. serielle Datensequenzen aufspüren und mit einer vorher definierten Antwort reagieren.

Werde morgen mal etwas damit experimentieren.

128er
23.07.2015, 22:31
Aktueller Stand:

Ich kann den Thyristorsteller fehlerfrei der Software vorgaukeln. Habe ca. 70% der erstmal wichtigen Telegramme identifiziert und fülle Listen mit Datensätzen. Es ist übrigens echt nervig die Telegramme von Hand zu schreiben/inkrementieren und die damit korrespondierenden physikalischen Einheiten aus der Software in eine Tabelle abzuschreiben. Auch bei den Werten wie Spannung, Strom und Leistung gibt es diese Lückenproblematik wie bei den Temperaturwerten. Ich kann also nicht einfach blind alles hintereinander wegschreiben.

Momentanwerte Außenleiter L1:

30504

Das läuft alles soweit sehr gut. Nun zurück zu meinem ersten Posting in diesem Beitrag. Die implementierung in BASCOM fällt mir noch etwas schwer, bzw. mir fehlt der richtige Ansatz. Gebt mir bitte mal einen Anstoß, was das Lesen/Schreiben von längeren Byteketten in BASCOM angeht. Zumindest ein Stichwort wo ich dann weiter lesen kann.

Danke!