Wechselstromzähler Saia-Burgess ALD1D5F10 mit Modbus-Schnittstelle (RTU)

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
010-SerialPort Instanz hinzufügen.png

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
020-ModBus-Splitter anlegen.png
|021-ModBus-Splitter-Settings.png|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)

023-ModBus-Splitter-Settings.png

031-ModBus Geraete hinzufuegen.png

4. In IP-Symcon eine neue Kategorie anlegen
|

| (im Screenshot ‚ALD1D5FD00A3A00 #10 – ModBus‘)|
|—|---|
|031-ModBus Geraete hinzufuegen.png|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

Das Thema ist zwar schon uralt, aber mich hat die obenstehende Angabe in die Irre geführt.
Ich habe ganz viele dieser SAIA.Zähler und bei allen der Anschluss wie folgt:
/D entspricht plus (+) bzw. A
D entspricht minus (-) bzw. B