Ich will in einem Versuchsaufbau einen Kryokühler benutzen. Dieser wird
von einem kleinen PC-Programm über eine RS-232 gesteuert. Man kann die
Solltemperatur vorgeben und ein paar Messwerte abfragen, wie
Ist-Temperatur oder man kann per Befehl den Kühler ein- und ausschalten.
Ich will jetzt aber mehrere Messungen miteinander kombinieren, d.h. bei
verschiedenen Temperaturen werden ein paar andere Messwerte ermittelt,
danach wird die Temperatur geändert usw. Da das ein Dauertest wird, muss
das logischerweise automatisiert funktionieren. Das Auslesen aller
Messwerte mit einem Pythonskript klappt, aber zum Kühler ist das
Protokoll nicht offen und es gibt vom Hersteller keine API. Ich dachte
mir jetzt, ob es einen Versuch wert wär, das selber zu entschlüsseln.
Ich muss nur die Solltemperatur vorgeben können und den Kühler ein- und
ausschalten. Um herauszufinden, wie das geht, habe ich einen seriellen
Portsniffer installiert und logge die Kommunikation mit, wenn ich
verschiedene Temperaturen vorgebe. Ein- und Ausschalten sollte nicht so
schwer sein, aber über den Temperatursettings zerbreche ich mir grad den
Kopf. Leider ist das Protokoll binär :-(
Hier ein Auszug aus der Kommunikation, wenn ein paar Temperaturen
gesetzt werden:
1
Sollwert 10K
2
30 06 00 49 E9 98
3
Sollwert 50K
4
30 06 00 46 00 84
5
Sollwert 100K
6
30 06 00 41 1E 6B
7
Sollwert 150K
8
30 06 00 3B DB B4
9
Sollwert 200K
10
30 06 00 36 16 7E
Ich sehe da im Moment keine Korrelation zwischen dem Sollwert und dem
Paket, ausser dass alle mit 30 06 00 anfangen. Die hinteren 3 Bytes
könnten noch eine Prüfsumme enthalten, das weiss man nicht. Wie könnte
man vorgehen, wenn man dieses Protokoll analysieren will? Habt ihr eine
Idee, wie man von der Temperatur auf die binären Werte kommen kann?
Tobias P. schrieb:> Wie könnte man vorgehen, wenn man dieses Protokoll analysieren will?
Man könnt die Hex-Werte mal aufaddieren, um zu sehen, ob dann im letzten
Byte immer 00 herauskommt. Dann hätte man sichergestellt, dass da eine
simple Zweierkomplement-Prüfsumme involviert ist. Und die würde ich dann
mal im letzten Byte vermuten...
Und zudem nimmt der Wert der dann noch fraglichen beiden Bytes mit
steigender Temperatur ab:
0x49E9 = 10K
0x4600 = 50K
0x411E = 100k
0x3BDB = 150K
0x3616 = 200K
Was ist denn die Schrittweite für die Temperatureinstellung (1K, 0.1K,
...)? Dann könntest du mal Temperaturen in dieser Schrittweite vorgeben.
Also 100K, 101K, 102K. Damit sollte man leichter sehen können, an
welcher Stelle der Daten sich was ändert und wieviel.
Wieso interessiert Dich denn überhaupt die Berechnung?
Sniff einfach die gewünschten Werte einfach mit und schreib die in eine
Tabelle. Dann gibst Du die einfach so aus und fertig ist die Laube.
Oder ändern sich die Pakete mit der Zeit?
Die Schrittweite habe ich grade zu ermitteln versucht. Die ist irgendwie
arbiträr:
1
Sollwert 10K
2
30 06 00 49 E9 98
3
10.1K
4
30 06 00 49 E8 99
5
10.2K
6
30 06 00 49 E8 99
7
10.21K
8
30 06 00 49 E8 99
9
10.29K
10
30 06 00 49 E5 9C
11
10.3K
12
30 06 00 49 E3 9E
Irgendwie scheint es, als würde da noch gerundet. Die exakte
Schrittweite lässt sich so leider nicht feststellen - wenn ich 10K, oder
10.1K, oder 10.19K als Sollwert benutze, wird der selbe Code verwendet,
hingegen bei 10.2K gibts einen Sprung.
honk schrieb:> Wieso interessiert Dich denn überhaupt die Berechnung?> Sniff einfach die gewünschten Werte einfach mit und schreib die in eine> Tabelle. Dann gibst Du die einfach so aus und fertig ist die Laube.> Oder ändern sich die Pakete mit der Zeit?
ja, werde ich als Notlösung so machen. Schöner wäre es, wenn man die
Werte berechnen könnte :-)
Komisch ist auch, das ist mir auch schon aufgefallen, dass die letzten
Bytes sich erniedrigen, wenn man die Temperatur erhöht.
Lothar M. schrieb:> 0x49E9 = 10K> 0x4600 = 50K> 0x411E = 100k> 0x3BDB = 150K> 0x3616 = 200K
Wenn man diese Werte mal in Excel eingibt, dann sieht man schon, dass da
irgend eine nahezu lineare Funktion dahinter verstecken könnte.
Wird da auf dem PC auch geregelt? Das wäre eine Begründung für die
Abweichungen von der Geraden. Oder werden da bei 100K immer statisch
411E ausgegeben?
Tobias P. schrieb:> Ich sehe da im Moment keine Korrelation zwischen dem Sollwert und dem> Paket
Doch, da ist eine, die HEX Zahlen werden kleiner mit größeren Werten:
Sollwert 10K
49 E9 98
Sollwert 50K
46 00 84
Sollwert 100K
41 1E 6B
Sollwert 150K
3B DB B4
Sollwert 200K
36 16 7E
Wahrscheinlich spielen nur die ersten zwei Bytes eine Rolle.
Also das mit der Prüfsumme stimmt tatsächlich. Habe es grade
verifiziert.
Ob auf dem PC geregelt wird, weiss ich nicht, es sieht mir aber nicht
danach aus, denn obwohl der PC die Temperaturen zwar abfragen kann,
sendet er den Sollwert z.B. 100K immer statisch die selbe Sequenz, und
während der Kühler läuft, sieht man, dass auf dem PC auch nur die
Messwerte eintreffen und mit ACK bestätigt werden. Insofern denke ich
also, dass der Regler im Gerät selbst sitzt.
Gut, ich werd jetzt einfach eine Funktion bauen, welche diese
gewünschten Werte ausgibt, und nicht weiter darüber nachdenken, wie die
zustande kommt ;-) auf die Excel-Idee bin ich noch gar nicht gekommen,
danke!
Tobias P. schrieb:> Gut, ich werd jetzt einfach eine Funktion bauen, welche diese> gewünschten Werte ausgibt, und nicht weiter darüber nachdenken, wie die> zustande kommt ;-) auf die Excel-Idee bin ich noch gar nicht gekommen,> danke!
De nada.
Excel kann dir übrigens auch gleich eine Funktion oder ein Polynom
berechnen, das du dann nur noch herauskopieren und in dein Programm
übernehmen musst...
Unter der Annahme daß das dritt- und zweitletzte Byte den Wert codieren
komme ich auf 25 bis 27 Schritte je Kelvin, scheint eine leicht
gekrümmte Kurve zu sein.
Evtl. wird vom PC berechnet welche Thermospannung ein Thermoelement bei
der eingestellten Temperatur liefern müßte.
A-Freak schrieb:> scheint eine leicht gekrümmte Kurve zu sein.
Dann wäre es am einfachsten, vom niedrigsten Wert beginnend alle 10K den
Wert zu ermitteln, in einer Tabelle abzulegen und dazwischen zu
interpolieren.
Hi,
also es scheint in der Tat so zu sein, dass der Wert des zweit- und
drittletzten Bytes nach
x = -26.7*Sollwert + 18921
berechnet wird. Das letzte Byte ist die Prüfsumme welche die Summe aller
vorhergehenden Bytes ist, invertiert und 1 addiert, wie mmm bereits
gesagt hat (wie kommt man darauf?).
Die Befehle zum Starten und Stoppen des Kühlers habe ich jetzt auch,
habe mti hTerm die entsprechenden Binärsequenzen gesendet und konnte den
Kühler beim Starten und Stoppen beobachten ;-) Bei der Temperatur bin
ich mir noch nicht ganz sicher, weil da so komische Sprünge in den
Hex-Werten sind.
Auch das Auswerten der Housekeeping-Daten, welche der Kühler zum PC
sendet, steht noch aus. Da stehen unter anderem der Fehlerstatus und die
Isttemperatur drin - zwei Grössen, die u.U. noch nützlich sein könnten
;-)
bei laufendem Kühler und einer Isttemperatur von 200K erhält man das
Telegramm
vom Kühler. 200K würde gemäss der oben erwähnten Umrechnung dem Hex-Wert
36 16 entsprechen - unter der Annahme, dass der Programmierer nicht zwei
verschiedene Umrechnungen verwendet hat für die Soll- und die
Isttemperatur. Und Bingo, den Wert 36 16 findet man im Statustelegramm,
also ist die Temperatur schon mal identifiziert. Herauszufinden, wo das
Statusflag und so weiter ist, wird schon schwieriger.
Tobias P. schrieb:> Das letzte Byte ist die Prüfsumme welche die Summe aller vorhergehenden> Bytes ist, invertiert und 1 addiert,
Ja, eben das bekannte "Zweierkomplement".
> (wie kommt man darauf?).
Man probiert einfach die einfachste Form der Prüfsumme. Dazu ist es
hilfreich selber ein paar solche Prüfsummenverfahren zu kennen. Die
Kurzform davon heißt in etwa "Erfahrung"... ;-)
> Herauszufinden, wo das Statusflag und so weiter ist, wird schon> schwieriger.
Du brauchst eben Telegramme, wo sich von jetzt auf nachher nur das eine
Flag im unbekannten Telegrammbereich ändert.
Lothar M. schrieb:> Du brauchst eben Telegramme, wo sich von jetzt auf nachher nur das eine> Flag im unbekannten Telegrammbereich ändert.
das ist klar. Nur habe ich auf die Statustelegramme leider überhaupt
keinen Einfluss - z.B. selbst bei der Temperatur wackelt da immer was um
+/-1 Count :-/
Tobias P. schrieb:> das ist klar. Nur habe ich auf die Statustelegramme leider überhaupt> keinen Einfluss - z.B. selbst bei der Temperatur wackelt da immer was um> +/-1 Count :-/
Ja, da musst du jetzt Bit für Bit herauskorrelieren: ändere etwas, auf
das du Einfluss hast und lokalisiere, wo die Änderung sich auswirkt.
Tobias P. schrieb:> bei laufendem Kühler und einer Isttemperatur von 200K erhält man das> Telegramm13 15 01 53 0A 45 00 0D 36 16 03 9C 00 06 00 04 64 01 00 00 68
Nun da findet sich ja schon wieder 06 00 <Temperatur> 01 00 00 könnte
der Status sein oder ein Telegramm Ende Marker.
Thomas