[Modul] Alle ModBus Zähler von B+G E-Tech

ich habe ja Probiert :slight_smile:

Es kommen keine Werte mit denen ich was Anfangen kann :confused:

Beispiel:

Adresse 3205 in IPS = 65
Adresse 3206 in IPS = 13825

((65*65536)+13825)/1000 = 4273,665 kWh

im Modul: Quantity auf 2

Adresse 3203 = 0
Adresse 3204 = 9,108440018111311e-44
Adresse 3205 = 5,9887670820435075e-39
Adresse 3206 = 3,0696392059326172e-06
Adresse 3207 = 0
Adresse 3208 = 0
Adresse 3209 = 0

im Modul: Quantity auf 4

Adresse 3202 = 9,108440018111311e-44
Adresse 3203 = 5,9889674677239059e-39
Adresse 3204 = 6,6161155700683594e-06
Adresse 3205 = 0
Adresse 3206 = 0
Adresse 3207 = 0
Adresse 3208 = 9,1745813056274423e-41
Adresse 3209 = -nan

Gruß

Ich habe mal anhand deiner Werte hin und herprobiert.

Das hier sollte passen.

Länge 2, Adresse 2305

$total = (unpack(‚V‘,$total)[1]) / 1000;

So in etwa:


$total= $this->SendDataToParent(json_encode(Array("DataID" => "{E310B701-4AE7-458E-B618-EC13A1A6F6A8}", "Function" => 3, "Address" => 3205, "Quantity" => 2, "Data" => ""))); 
        if ($total === false) 
        { 
            $this->unlock($IO); 
            return false; 
        } 
        $total = (unpack('V',$total)[1]) / 1000;
        $this->SendDebug('Total', $total, 0); 

Ich habe es jetzt nur in einem Script umrechnen lassen.
Also so:


$data =  pack('f',  5.9887670820435075e-39); // falscher Float Wert von Adresse 3205 wieder nach BIN
echo bin2hex($data).PHP_EOL; //BIN in lesbares HEX für die Console.
echo unpack('V',$data)[1].PHP_EOL; // BIN (wie es auch vom Splitter kommt) mit unpack 'V' getestet

Dann wirft mit PHP das aus:

3f364100
4273727

4273727 / 1000 = 4273,727

Paßt das ?

Michael

Hallo Michael,

du bist der Hammer :D:D:D Danke.

Ich musste etwas basteln damit es geht. Anscheinend irgendwo doppel gemoppelt:D aber es geht.

   $total= $this->SendDataToParent(json_encode(Array("DataID" => "{E310B701-4AE7-458E-B618-EC13A1A6F6A8}", "Function" => 3, "Address" => 3205, "Quantity" => 2, "Data" => "")));  
        if ($total === false)  
        {  
            $this->unlock($IO);  
            return false;  
        } 
	$total= unpack("f", strrev(substr($total, 2)))[1];
	$total = pack('f', $total); // falscher Float Wert von Adresse 3205 wieder nach BIN  
        $total = (unpack('V',$total)[1])/1000; 
        $this->SendDebug('Total', $total, 0); 
	SetValue($this->GetIDForIdent("Total"), $total);

Alle werte kommen jetzt an.

Eine Kleinigkeit noch :o

Wenn ich im IPS ins Modul gehe, (wo die Intervall Zeit eingestellt wird)
habe ich Unten keine Auswahlmöglichkeit für Modbus Splitter Instanzen.

Woran liegt das?

Gruß

Äh… danke.
Das ist jetzt aber doch etwas Quark… Ändere das mal mit dem pack und unpack.
So war das von mir nicht gedacht :wink:

   $total= $this->SendDataToParent(json_encode(Array("DataID" => "{E310B701-4AE7-458E-B618-EC13A1A6F6A8}", "Function" => 3, "Address" => 3205, "Quantity" => 2, "Data" => "")));  
        if ($total === false)  
        {  
            $this->unlock($IO);  
            return false;  
        } 
// WECH
//	$total= unpack("f", strrev(substr($total, 2)))[1];
// WECH
//	$total = pack('f', $total); // falscher Float Wert von Adresse 3205 wieder nach BIN  
// Und jetzt statt 'V' in 'N' ändern
        $total = (unpack('N',substr($total,2))[1])/1000; 
        $this->SendDebug('Total', $total, 0); 
	SetValue($this->GetIDForIdent("Total"), $total);

Das du keinen Splitter auswählen kannst, ist merkwürdig.
Zumal ja Daten übertragen werden, also einer verbunden ist.

Zeig mal die module.json.
Hast du dort die GUIDs bei implemented und parentRequirements verändert ? Du müssen zum Modus-Gateway ‚passen‘.
Also nicht verändern.
Michael

Hmm,

wenn ich es so ändere bekomme ich als wert 50593,857000000004

EDIT:

Hast du dort die GUIDs bei implemented und parentRequirements verändert ? Du müssen zum Modus-Gateway ‚passen‘.

GUIDs waren Falsch. Danke für die Hilfe

sorry, hatte das Substr vergessen…

Hast du das nachgetragen ?

Wenn dann noch immer nicht… dann so:


   $total= $this->SendDataToParent(json_encode(Array("DataID" => "{E310B701-4AE7-458E-B618-EC13A1A6F6A8}", "Function" => 3, "Address" => 3205, "Quantity" => 2, "Data" => "")));  
        if ($total === false)  
        {  
            $this->unlock($IO);  
            return false;  
        } 
        $total = unpack('n*',substr($total,2));
        $total = (($total[2] << 16) | $total[1]) / 1000;
        $this->SendDebug('Total', $total, 0); 
    SetValue($this->GetIDForIdent("Total"), $total);

Michael

Geht.

Musste aber von

n*

auf

N
ändern. Sonst kommen wieder komische Werte.
die Richtige werte kommen mit „N“ an, habe in IPS aber Fehlermeldung

22.10.2017 20:33:32*| TimerPool*| iEM3155 (UpdateTimer): <br />
<b>Notice</b>:  Undefined offset: 2 in <b>/var/lib/symcon/modules/IPSBGETech/iEM3155/module.php</b> on line <b>168</b><br />

EDIT:

mal was anderes.

nach paar Minuten verliere ich die Verbindung. Dann wird sie wieder hergestellt.
Ist das Normal?

Ah… dann war der Fehler nur mein fehlendes substr :smiley:

        $total = unpack('N',substr($total,2))[1] / 1000; 

// oder
        $total = unpack('N',substr($total,2)); 
        $total = $total[1] /  1000;

Wenn die Verbindung weg ist, liegt das aber nicht an dieser Instanz.

Wie äußert sich dass denn ?
Was für eine IO hast du den ?

Michael

Hallo Michael,

mit

$total = unpack('N',substr($total,2))[1] / 1000;  

Läuft jetzt alles :smiley:

Vielen Dank für die Hilfe und geduld.

Das mit Verbindungsprobleme war meine Schuld. Hat sich erledigt.

Kann ich diesen Modul bei dir Uploaden?
Oder soll ich auf mein Account Uploaden?

Gruß

Direkt auf meinen geht nicht.
Du kannst nur einen Pull-Request machen, wenn du es vorher bei mir geforkt hast und bei dir aktualisiert hast.

Michael

Moin,

beim Anlegen des Moduls in IPS kommt es zu dieser Fehlermeldung:

modulfehler.JPG

Was bedeutet das?

Das dein Windows, auf welchem der IPS Dienst läuft, ein Update braucht…

Fehler bei Modul-Update

Module aktualisieren klappt nicht

Bei mir reichte es einmal Windows Update durchlaufen zu lassen.

Michael

Danke, das war schon mal gut. Ein Modul mal von https in git umgestellt - klappte. Habe den Fix dennoch installiert, damit kamen die restlichen auch und warfen keine Fehler.

Somit läßt sich das Modul auch mit vielen Variablen anlegen, allerdings werden die Werte nicht gefüllt. Die Zeit habe ich mit 10000 ms angegeben.In den Meldungen sehe ich kein Einträge, die auf das Modul hinweisen würden.

Funktioniert den jetzt deine Verbindung zum Zähler?
Im Debug der Instanz bzw. der Splitter-Instanz sollten die Antworten auftauchen.
Michael

Moin,

habe entgegen der Bezeichungen am Adapter/Zähler mal die Adern vertauscht und es kamen Werte. Allerdings nicht lange. Daher den Adapter (alt: CH340 neu: FTDI) ersetzt und die Adern zurückgetauscht - und schon läuft es auch damit. :banghead: Inwieweit der neue stabil bleibt, wird sich zeigen. Was mich wundert, dass gleich beide alten Adapter defekt sein sollen…

Welchen Adapter benutzt du bzw. wie hast du deine Zähler angeschaltet?

Defekte Adapter hatte ich noch nicht.

Produktiv läuft das alles bei mir noch immer nicht, keine Zeit. Verteilung(en) zu klein usw…
Aber ich habe es sowohl mit einem USB/RS485 Adapter (FTDI-Chip), als auch mit einem USR-TCP232 ausprobiert.
Letztere ist ja auch ‚doof‘ also TCP zu RS485 wird 1:1 durchgereicht. Somit ist das in IPS dann Modbus RTU over TCP.

Zusätzlich habe ich mit MSC51 unsere eigene Hardware erfolgreich getestet.
Die Kann sowohl ModBus TCP zu ModBus RTU wandeln als auch 1:1 durchreichen. Zusätzlich hat es einen ‚cool down‘ Timer zwischen den Abfragen.

Michael

Leider hatte ich mit meinem Bauchgefühl recht - seit gestern steht die Verbindung wieder nicht. :confused:

Was habe ich gemacht?

Der Adapter hatte genau ein Gerät am Bus, den SDM630. Diesen habe ich abgeklemmt, um meinen neuen SDM230 vorübergehend anzuschließen. Dafür habe ich gleichen Einstellungen im Gerät verwendet (9600,n,8,1), nur die Geräte-ID auf 2 gesetzt. Dann eine neue Splitter-Instanz dafür erstellt mit Verweis auf den gleichen Serial Port. Nach ein wenig hin und her mit den passenden Registern kommen dessen Werte.

Nach dem Umklemmen des Busses wieder zurück auf den SDM630 kommen dessen Werte nun nicht mehr an. Noch mit Widerständen versucht. Alles ohne Erfolg, im SerialPort-Debug kommen seitdem nur Transmit-Meldungen ohne eine Antwort. Testweise wieder SDM230 dran: läuft.

Ziel war es, beide Geräte an einem Bus zu betrieben, die sich nur in der Geräte-ID unterscheiden.

Keine Ahnung warum es einzeln nicht (mehr) läuft.
Ich hatte folgende Themen beim zusammenschalten des SDM630 und DRS210C auf einem Bus:

  • Beide Unterstützen unterschiedliche Bereiche von Baudraten ( 9600, mehr kann der DRS nicht)
  • Unterschiedliche Werkeinstellungen Baud, Parität (imho kann der DRS nur mit Parität Odd betrieben werden)
  • Der DRS stellt sich ca 250ms ‚tot‘ wenn er vorher nicht seine Adresse über den Bus gibt.

Das Modul ist eigentlich nur für diesen letzten Punkt (+ der vereinfachten Einrichtung).
Da IPS nur die 3,5 Symbolrate Pause zwischen den Abfragen macht (= Modus RTU Specs) die Zähler aber leider eine größe Pause benötigen, löst dieses Modul dies durch eine Sperre über alle Instanzen dieses Moduls welche am gleichen IO hängen.
Problem siehe hier:
IP-Symcon Community Forum

Also wirst du auch später keine Freude mit diesem Modul haben, wenn die Abfrage der SDM220 dazwischenfunkt.
Allerdings habe ich gesehen das die Register dem des SDM630 entsprechen, halt nur für eine Phase anstatt für drei.
Ich werde da heute Abend den SDM220 mit einbauen :slight_smile:

Michael

  1. ChanglogVersion 2.0:

[ul]
[li]DRS 458 ergänzt[/li][li]SDM 72D ergänzt[/li][li]SDM 120C ergänzt[/li][li]SDM 220 ergänzt[/li][li]SDM 230 ergänzt[/li][li]SDM 630 fehlende Werte ergänzt und kleiner Bugfixes[/li][/ul]

Da ich nicht alle Zähler habe, konnte ich nicht jeden Messwert testen und musste mich auf die Hersteller-Doku stützen.
Bei Fehlern bitte melden :slight_smile:

Michael

Version 2.3:
SDM 530 ergänzt