Heizöltank Messen

Das sind keine gültigen Telegramme. Sind viel zu kurz. Müssten 22 Bytes, ansonsten ist das für das Skript ungültig und es wird verworfen.

Welchen Proteus hast du gekauft?

EcoMeter - ohne S und ohne Plus

So sieht z.B. ein gültiges Telegramm aus: 53 49 00 16 02 10 16 0a 34 00 00 00 31 00 00 00 08 fc 13 88 39 67.

Das Modell habe ich auch. Kannst du mal nen Screenshot der IO Schnittstelle machen? Hast du bei der RegisterVariable auch als Gateway deine IO Instanz konfiguriert?


Ich denke, es ist soweit alles richtig verknüpft …

Das passt soweit. Hast du mal über die Proteus eigene Software, kann man runterladen von deren Homepage, versucht, die Daten auszulesen?

nein - ich habe mal einen Port-Sniffer eingeschaltet, aber da kommt überhaupt nichts an. Ich werde das mit der Proteus-SW mal versuchen.

OK - Original-SW heruntergeladen und den bereitgestellten Treiber benutzt (aus dem Jahr 2012 !) und die Verbindung klappt. Fazit 1: Die neuen Treiber vom Chiphersteller sind wohl nicht geeignet.
Danach habe ich die Original-SW geschlossen und über IPS den Port allokiert… leider wieder nur eine 3-Byte-lange Rückmeldung bekommen.

Hm - vlt. habe ich einen Denk- oder Verständnisfehler. Wenn ich eine Registervariable anlege, kann ich den Typ ja nicht bestimmen. Trotzdem gibt es laut Handbuch REGISTERVARIABLESTRING oder REGISTERVARIABLEINTEGER. Kann das damit etwas zu tun haben ? Ich habe mal versucht, ein Beispiel aus dem Handbuch umzusetzen, laufe aber auf Fehler, wenn ich die Anweisung von dort in einem Script ausführe:

$variablenID = $this->RegisterVariableString("RegVar", "Registervariable Proteus");

Irgendwie stehe ich da auf dem Schlauch …

Ne, hat damit nichts zu tun. Das sind Befehle aus dem SDK/Modulentwicklung, diese sind nicht für Skripte vorgesehen. Der Befehl erzeugt Status variablen.
Was mir einfällt: hast du die Variablen in der Sektion IDs meines Skriptes im Objektbaum angelegt und die IDs der Variablen dann in meinem Skript angepasst? Ohne geht es nicht.

ja, habe ich gemacht

$Level_ID = 55201; //Tankinhalt, Integer
$Level_Percent_ID = 28845; //Tankinhalt in Prozent, Float
$MaxLevel_ID = 49722; //Tankkapazität, Float
$Ullage_ID = 16998; // Ullage (gemessene Höhe von der oberen Kante des Behälters)#, Float
$Temp_ID = 10412; //Temperatur, Float
$Time_ID = 35189; //Receiver Zeit, String
$Telegram_ID = 51890; //empfangenes Telegramm, String

Bei einer Lieferung der Daten an die Original-SW funktioniert alles.

So, ich habe nochmal in die Protokoll Spec geschaut:
Du musst die serielle Schnittstelle in Symcon auf 115200 Baud stellen. Die Baudrate oben (9600) ist falsch. Danach solltest du die Werte im Debug sehen und das Skript arbeiten.

…und installiere dir die aktuellen Treiber, lt. Doku Proteus:
Technical Support - Silicon Labs Documents/Software/CP210x_VCP_Windows.zip
… wie gesagt: du musst die Baudrate umstellen auf 115200.

Ich hatte die Original-SW mit Treiber heruntergeladen und installiert. Darüber hinaus habe ich auf der Homepage ein Firmware-Update für Ölmessungen gefunden. Nun habe ich dieses Update aufspielen wollen und seitdem funktioniert das Gerät überhaupt nicht mehr :(.
Ich denke, jetzt geht das erst mal wieder zurück an den Hersteller. Wenn ich Ersatz habe, werde ich es nochmals versuchen. Auf jeden Fall vielen Dank für Deine Hilfe. Stellst Du bitte noch das Script für die Uhrzeit zu Verfügung ?
Grüße Frank

Ich habe zwei gute Nachrichten: Der freundliche Reset-Knopf hat das Teil wieder zum Leben erweckt und ja, ich bekomme auch die Daten geliefert. Die Baudrate war der Schlüssel zum Erfolg.
Jetzt fehlt nur noch das Script für die Uhrzeit.
VIELEN DANK für die tolle Unterstützung !

Hier noch das Skript für die Uhrzeit des Receivers:
Am Anfang des Skriptes die Instanz ID der seriellen Schnittstelle anpassen. Habe das für deinen Fall auf serielle Kommunikation umgestellt, sollte so passen. Wenn jemand den Receiver per TCP - so wie ich - angebunden hat, muss im Skript entsprechend am Anfang auf Client Socket umgestellt werden um am Ende des Skriptes der entsprechende Befehl für Client Socket Kommunikation gesetzt werden und der für serielle Kommunikation muss entsprechend kommentiert werden (mit //).
Kommunikation per serieller Schnittstelle ist ungetestet, sollte aber so passen. Wie gesagt bei mir werden die Daten per TCP über einen Client Socket an Symcon geschickt (per ser2net von einem Raspi).

Viel Spaß damit und Gruß
Georg

<?php

// IDs hier anpassen und jeweils passend zum Anschluß auskommentieren
// $ClientSocket_Instance_ID = 17616; //hier den ClientSocket Instanz ID, falls der Proteus per TCP z.B. über ser2net angebunden ist
$SPR_Instance_ID = 12346; //hier die Instanz ID der seriellen Schnittstelle eingeben, falls der Proteus direkt per USB->Seriell verbunden ist
// IDs anpassen Ende
// am Ende des Skriptes noch passend den Befehl zum Senden richtig setzen

function hexToStr($hex){
    $string='';
    for ($i=0; $i < strlen($hex)-1; $i+=2){
        $string .= chr(hexdec($hex[$i].$hex[$i+1]));
    }
    return $string;
}

$crc_table = array(
        0x0,  0x1021,  0x2042,  0x3063,  0x4084,  0x50a5,  0x60c6,  0x70e7,
        0x8108,  0x9129,  0xa14a,  0xb16b,  0xc18c,  0xd1ad,  0xe1ce,  0xf1ef,
        0x1231,  0x210,  0x3273,  0x2252,  0x52b5,  0x4294,  0x72f7,  0x62d6,
        0x9339,  0x8318,  0xb37b,  0xa35a,  0xd3bd,  0xc39c,  0xf3ff,  0xe3de,
        0x2462,  0x3443,  0x420,  0x1401,  0x64e6,  0x74c7,  0x44a4,  0x5485,
        0xa56a,  0xb54b,  0x8528,  0x9509,  0xe5ee,  0xf5cf,  0xc5ac,  0xd58d,
        0x3653,  0x2672,  0x1611,  0x630,  0x76d7,  0x66f6,  0x5695,  0x46b4,
        0xb75b,  0xa77a,  0x9719,  0x8738,  0xf7df,  0xe7fe,  0xd79d,  0xc7bc,
        0x48c4,  0x58e5,  0x6886,  0x78a7,  0x840,  0x1861,  0x2802,  0x3823,
        0xc9cc,  0xd9ed,  0xe98e,  0xf9af,  0x8948,  0x9969,  0xa90a,  0xb92b,
        0x5af5,  0x4ad4,  0x7ab7,  0x6a96,  0x1a71,  0xa50,  0x3a33,  0x2a12,
        0xdbfd,  0xcbdc,  0xfbbf,  0xeb9e,  0x9b79,  0x8b58,  0xbb3b,  0xab1a,
        0x6ca6,  0x7c87,  0x4ce4,  0x5cc5,  0x2c22,  0x3c03,  0xc60,  0x1c41,
        0xedae,  0xfd8f,  0xcdec,  0xddcd,  0xad2a,  0xbd0b,  0x8d68,  0x9d49,
        0x7e97,  0x6eb6,  0x5ed5,  0x4ef4,  0x3e13,  0x2e32,  0x1e51,  0xe70,
        0xff9f,  0xefbe,  0xdfdd,  0xcffc,  0xbf1b,  0xaf3a,  0x9f59,  0x8f78,
        0x9188,  0x81a9,  0xb1ca,  0xa1eb,  0xd10c,  0xc12d,  0xf14e,  0xe16f,
        0x1080,  0xa1,  0x30c2,  0x20e3,  0x5004,  0x4025,  0x7046,  0x6067,
        0x83b9,  0x9398,  0xa3fb,  0xb3da,  0xc33d,  0xd31c,  0xe37f,  0xf35e,
        0x2b1,  0x1290,  0x22f3,  0x32d2,  0x4235,  0x5214,  0x6277,  0x7256,
        0xb5ea,  0xa5cb,  0x95a8,  0x8589,  0xf56e,  0xe54f,  0xd52c,  0xc50d,
        0x34e2,  0x24c3,  0x14a0,  0x481,  0x7466,  0x6447,  0x5424,  0x4405,
        0xa7db,  0xb7fa,  0x8799,  0x97b8,  0xe75f,  0xf77e,  0xc71d,  0xd73c,
        0x26d3,  0x36f2,  0x691,  0x16b0,  0x6657,  0x7676,  0x4615,  0x5634,
        0xd94c,  0xc96d,  0xf90e,  0xe92f,  0x99c8,  0x89e9,  0xb98a,  0xa9ab,
        0x5844,  0x4865,  0x7806,  0x6827,  0x18c0,  0x8e1,  0x3882,  0x28a3,
        0xcb7d,  0xdb5c,  0xeb3f,  0xfb1e,  0x8bf9,  0x9bd8,  0xabbb,  0xbb9a,
        0x4a75,  0x5a54,  0x6a37,  0x7a16,  0xaf1,  0x1ad0,  0x2ab3,  0x3a92,
        0xfd2e,  0xed0f,  0xdd6c,  0xcd4d,  0xbdaa,  0xad8b,  0x9de8,  0x8dc9,
        0x7c26,  0x6c07,  0x5c64,  0x4c45,  0x3ca2,  0x2c83,  0x1ce0,  0xcc1,
        0xef1f,  0xff3e,  0xcf5d,  0xdf7c,  0xaf9b,  0xbfba,  0x8fd9,  0x9ff8,
        0x6e17,  0x7e36,  0x4e55,  0x5e74,  0x2e93,  0x3eb2,  0xed1,  0x1ef0);

function genCRC (&$ptr) //CCITT XMODEM CRC
{
    $crc = 0x0000;
    $crc_table = $GLOBALS['crc_table'];
    for ($i = 0; $i < strlen($ptr); $i++)
        $crc =  $crc_table[(($crc>>8) ^ ord($ptr[$i]))] ^ (($crc<<8) & 0x00FFFF);
    return $crc;
}

//see if the routine is working; for debugging
//5349000F0101131D2200000031
//correct CRC: 6D 66
//$hour_hex= "13";
//$minutes_hex = "1D";
//$seconds_hex = "22";

// setze Uhrzeit des Receivers
$date = new DateTime();
$hour_hex=dechex($date->format('H'));
$hour_hex=str_pad($hour_hex, 2 ,'0', STR_PAD_LEFT); //fülle mit führenden Nullen auf, falls nötig
$minutes_hex=dechex($date->format('i'));
$minutes_hex=str_pad($minutes_hex, 2 ,'0', STR_PAD_LEFT); //fülle mit führenden Nullen auf, falls nötig
$seconds_hex=dechex($date->format('s'));
$seconds_hex=str_pad($seconds_hex, 2 ,'0', STR_PAD_LEFT); //fülle mit führenden Nullen auf, falls nötig
//echo $hour_hex."\n";
//echo $minutes_hex."\n";
//echo $seconds_hex."\n";'
$data_0 = "5349000F0101".$hour_hex.$minutes_hex.$seconds_hex."00000031";
$data_1 = hexToStr($data_0);
$data_2 = strtoupper($data_0.dechex(genCRC($data_1)));

// Befehl hier anpassen: 
// CSCK_SendText für Client Socket Kommunikation auskommentieren
// SPRT_SendText für USB->seriell Kommunikation
// CSCK_SendText($ClientSocket_Instance_ID,hexToStr($data_2)); //send the actual time to the receiver with the generated telegram as the receiver has VERY bad RTC
SPRT_SendText($SPR_Instance_ID,hexToStr($data_2)); 

Achso: An das Skript ein Ereignis dranhängen, z.B. jeden Tag um drei Uhr nachts das Skript ausführen. Damit wird dann jeden Tag die Uhrzeit des Receivers gesetzt.

Greetz
Georg

Bei meiner Installation funktioniert soweit alles - die Uhrzeitdifferenz liegt ohne Korrektur bei ca. 1 Sekunde pro Tag.
Eine Frage noch: Der Tankinhalt wird offensichtlich alle 24 Stunden gemessen - er nimmt aber nicht kontinuierlich ab, sondern es kann auch passieren, dass er mal wieder etwas raufgeht. Ist das bei dir auch so ?
Grüße Frank

Ja, ist bei mir auch so. Aber keine Sorge, der Tankinhalt nimmt ab mit der Zeit ….
Uhrzeit: war bei mir auch so, Anfangs ok, nach einiger Zeit driftet der immer weiter weg…