1. RS-485 Schnittstelle am PC konfigurieren/einrichten
TIPP: Ich verwende einen „Delock Adapter USB 2.0 to 4 x serial RS-422/485“ und bin sehr zufrieden damit (betreibe noch andere RS-485 Geräte auf diesem Adapter)
1.1. Wechselstromzähler einbauen und mit RS-485 Schnittstelle verbinden
|
|TIPP:
|—|
D entspricht D+
/D entspricht D-
siehe auch Smart Home - Uebersicht v1.0.pdf
bzw.
Smart Home - Energiemonitoring & Somfy RTS Transmitter v1.0.pdf|
2. In IP-Symcon einen ‚Serial Port‘ anlegen

2.1. Vorhanden RS-485 COM Port auswählen und Konfigurieren
Portkonfiguration 4800,8,1,Even
…
sollte dann so aussehen
3. In IP-Symcon einen ‚ModBus RTU TCP‘ Splitter anlegen

|
|Hier ‚Modebus RTU‘ und die Geräte-ID einstellen. Für ‚Übergeordnete Instanz‘ den vorher angelegten ‚Serial Port‘ auswählen.
|—|
TIPP: Die Geräte-ID ist die Modbus Adresse welche direkt am Wechselstromzähler eingestellt wird. Werden mehrere solche WSZ am selben Modebus betrieben, benötigen diese natürlich unterschiedlichen Adressen.|
…
sollte dann so aussehen
4. In IP-Symcon eine neue Kategorie anlegen
siehe nächsten Beitrag … (es können leider nur 10 Grafiken pro Beitrag hinzugefügt werden)


4. In IP-Symcon eine neue Kategorie anlegen
|
|
(im Screenshot ‚ALD1D5FD00A3A00 #10 – ModBus‘)|
|—|---|
|

|Unter der derzeit leeren Kategorie wird jetzt für jedes Modbus Register ein IP-Symcon ‚ModBus Gerät‘ angelegt|
|
|Einheit ist immer ‚Word (16Bit - Unsigned)
Schreibadresse ist immer 0
Leseadresse ist immer Registernummer minus 1 (also R01 hat Leseadresse 0)
Bei ‚Übergeordnete Instanz‘ die vorher angelegte ‚ModBus RTU TCP‘ Splitter Instanz auswählen.|
Nach dieser Tabelle jetzt ‚ModBus Gerät‘ für ‚ModBus Gerät‘ anlegen und konfigurieren.
Register (ModBus Gerät) |
Einheit |
Schreibadresse |
Leseadresse |
R01 - Firmware Version |
Word (16Bit - Unsigned) |
0 |
0 |
R02 - Modbus com. Anzahl unterstützte Register |
Word (16Bit - Unsigned) |
0 |
1 |
R03 - Modbus com. Anzahl unterstützte Flags |
Word (16Bit - Unsigned) |
0 |
2 |
R04 - Baudrate High |
Word (16Bit - Unsigned) |
0 |
3 |
R05 - Baudrate Low |
Word (16Bit - Unsigned) |
0 |
4 |
R15 - Hardware Version |
Word (16Bit - Unsigned) |
0 |
14 |
R16 - 32 Bit Seriennummer (high Byte) |
Word (16Bit - Unsigned) |
0 |
15 |
R17 - 32 Bit Seriennummer (low Byte) |
Word (16Bit - Unsigned) |
0 |
16 |
R22 - Status letzte Kommunikationsanfrage |
Word (16Bit - Unsigned) |
0 |
21 |
R23 - Modebus timeout |
Word (16Bit - Unsigned) |
0 |
22 |
R24 - Modebus Address |
Word (16Bit - Unsigned) |
0 |
23 |
R25 - Error Register |
Word (16Bit - Unsigned) |
0 |
24 |
R28 - WT1 total (high Byte) |
Word (16Bit - Unsigned) |
0 |
27 |
R29 - WT1 total (low Byte) |
Word (16Bit - Unsigned) |
0 |
28 |
R30 - WT1 partial (high Byte) |
Word (16Bit - Unsigned) |
0 |
29 |
R31 - WT1 partial (low Byte) |
Word (16Bit - Unsigned) |
0 |
30 |
R36 - URMS (Effective Voltage) |
Word (16Bit - Unsigned) |
0 |
35 |
R37 - IRMS (Effective Current) [x0.1] |
Word (16Bit - Unsigned) |
0 |
36 |
R38 - PRMS (Effective active Power) [x0.01] |
Word (16Bit - Unsigned) |
0 |
37 |
R39 - QRMS (Effective reactive Power) [x0.01] |
Word (16Bit - Unsigned) |
0 |
38 |
R40 - cos phi [x0.01] |
Word (16Bit - Unsigned) |
0 |
39 |
Danach sollte es so aussehen…
5. ModBus Register lesen
Mit dem Skript Befehl „ModBus_RequestRead(integer $InstanzID)“ sollten jetzt die einzelnen Register lesbar sein.
|
|Um hier nicht für jede Instanz die InstanzID in ein Skript schreiben zu müssen legen wir unter unserer Kategorie ein neues Skipt an (im Screenshot ‚Update - ModeBus Register‘)
|—|
und befüllen es mit diesem Code …|
<?
$scriptId = $_IPS['SELF']; //ID dieses Skripts
$parendId = IPS_GetParent($scriptId); //ID der Kategorie
$childList = IPS_GetChildrenIDs($parendId);
foreach($childList as $child) {
$object = IPS_GetObject($child);
$objTyp = $object['ObjectType'];
switch($objTyp) {
case 0: // Kategorie
break;
case 1: // Instanz
$return = ModBus_RequestRead($child);
break;
default:
break;
}
}
?>
Info: Dieses Skript durchläuft alle ModBus Instanzen und ruft ‚ModBus_RequestRead(…)‘ auf
Wenn alles klappt, sollten jetzt alle Register mit den ‚Raw-Daten‘ des Wechselstromzählers befüllt sein!
6. Daten aufbereiten und Anzeigen
siehe nächsten Beitrag … (es können leider nur 10 Grafiken pro Beitrag hinzugefügt werden)
6. Daten aufbereiten und Anzeigen
Um jetzt die Raw-Daten entsprechen aufzubereiten legen wir ein neues ‚Dummy Module‘ mit den entsprechenden Variablen an -> siehe Screenshot …
Tipp: Formatierung und Einheiten für Ausgabe werden per Variablen Profile zugewiesen
In ein Skript (im Screenshot Auswerteskript) stecken wir folgenden Code …
Achtung: Variablen IDs anpassen!
<?
//R36 - URMS (Effective Voltage)
$successful = ModBus_RequestRead(55706);
if($successful) {
$urms = GetValueInteger(44738) ;
SetValueFloat(10263,$urms);
}
//R37 - IRMS (Effective Current) [x0.1]
$successful = ModBus_RequestRead(51185);
if($successful) {
$irms = GetValueInteger(37971) ;
SetValueFloat(10781,$irms * 0.1);
}
//R38 - PRMS (Effective active Power) [x0.01]
$successful = ModBus_RequestRead(22508);
if($successful) {
$prms = GetValueInteger(40729) ;
SetValueFloat(26035,$prms * 10);
}
//R39 - QRMS (Effective reactive Power) [x0.01]
$successful = ModBus_RequestRead(23150);
if($successful) {
$qrms = GetValueInteger(53430) ;
SetValueFloat(19208,$qrms * 0.01);
}
//R40 - cos phi [x0.01]
$successful = ModBus_RequestRead(56781);
if($successful) {
$cosPhi = GetValueInteger(55547) ;
SetValueFloat(49798,$cosPhi * 0.01);
}
//R28 - WT1 total (high Byte) & R29 - WT1 total (low Byte)
$successful1 = ModBus_RequestRead(49619);
$successful2 = ModBus_RequestRead(16724);
if($successful1 && $successful2) {
$highByte = GetValueInteger(37385) ;
$lowByte= GetValueInteger(11850) ;
SetValueFloat(42165,($highByte*65536 + $lowByte)*0.01);
}
//R30 - WT1 partial (high Byte) & R31 - WT1 partial (low Byte)
$successful1 = ModBus_RequestRead(20948);
$successful2 = ModBus_RequestRead(35027);
if($successful1 && $successful2) {
$highByte = GetValueInteger(21450) ;
$lowByte= GetValueInteger(59989) ;
SetValueFloat(42051,($highByte*65536 + $lowByte)*0.01);
}
SetValueInteger(48777,GetValueInteger(48777)+1);
?>
[i]Info: Dieses Script liest die benötigten ModBus Register, rechnet die entsprechenden Raw-Daten um und steckt sie in die dafür vorgesehenen Variablen.
Zusatz: Wenn die Ausführung dieses Skripts erfolgreich ist, kann es mittels eines ‚Zyklischen Ereignis‘ zum Beispiel alle 60 Sekunden ausgeführt werden.[/i]
6. 1. Datenbank-Logging und Graph Visualisierung
Für die Variablen ‚PRMS - Effektive Wirkleistung‘ und ‚Total kWh‘ aktivieren wir Datenbanklogging und Graph Visualierung
mit Aggregationstyp ‚Standard‘
mit Aggregationstyp ‚Zähler‘
7. Im WebFront sieht das dann so aus
Hallo PreinfalkG
Das ist eine sauber Dokumentation.Respekt.
Viele Grüße
Jo