Huawei Wechselrichter (Modbus Fragen)

Hallo Zusammen,

bin Anfänger im Modbus Bereich und hätte da ein paar Fragen.
Ich möchte meine Huawei Wechselrichter auslesen und habe mir dafür einen RS485 zu USB Adapter gekauft. Dieser hängt am Server von Symcon und zur anderen Seite am RS485 Bus der Wechselrichter.

Bisher habe ich ein Modbus Gateway Angelegt und die dafür benötigte Schnittstelle, in meinem Fall Com 4 angewählt. Konfiguration des Gateways ist wie folgt.

Modbus RTU
Geräte ID 1 (Dies ist auch die Adresse des WR)
Swap aktiv.

Verbindung steht.

Nun habe ich ein Modbus Device angelegt und jetzt weis ich nicht weiter. Habe mir vom Hersteller die Modbus definitions geladen.

Beispiel Frequenz:

SN:32 / Signal Name : Frequency / Read/Write : RO / Type: U16/ Unit Hz/ Gain : 100 / Adress : 32085/Quantity : 1.

Wie gebe ich das in die Maske ein und was muss ich beachten?

Hi Dromik,

hier ein Beispiel von meiner Wago SPS

modbus

In deinem Fall:
Einheit: 16Bit
Adresse (Lesen): 32085

Gruß

Moin Moin,

Ein Freund von mir bekommt nun auch einen Huawei Wechselrichter und möchte ihn (ggf. über Symcon) überwachen und Heizung etc. steuern.

Ich lese, dass das auslesen der Daten wohl über die RS485 Schnittstelle und Modbus-Gateway funktioniert.

Kann mir jemand sagen, was für Daten der Huawei WR dann liefert.

Gruß Michael

Ich habe den Huawei SUN2000-5KTL-M1 und kann Ihn wunderbar über WLAn Dongle auslesen…

Wichtig zuerst am Gerät folgendes aktivieren:

image

image

Mein Installer Script:

<?
#include('globalfunction.ips.php');
$cat=41311 /*[Stromzähler]*/;

#$name="Gesamt Stromverbrauch";

$catname="PV 2";

$modbussplitterid=32757 ;

$catid1=GetorCreatcategory($catname,$cat);
$catid=GetorCreatcategory("modbus",$catid1);
IPS_Sethidden($catid, true);


$ac_spannungen_anzeigen=true;
$dc_spannungen_anzeigen=true;
$ac_strom_anzeigen=true;
$dc_strom_anzeigen=true;
$ac_leistung_anzeigen=true;
$dc_leistung_anzeigen=true;

$zaehlerstand_anzeigen=true;




/*
#*************************************************************  Modus Splitter anlegen ************************************************************* 

$modbussplitterid=IPS_CreateInstance("{A5F663AB-C400-4FE5-B207-4D67CC030564}");
IPS_SetName($modbussplitterid, "Huawei PV2 Modus"); // Instanz benennen
IPS_SetConfiguration($modbussplitterid, '{"GatewayMode":0,"DeviceID":1,"SwapWords":false,"DelayTimeTCP":10,"DelayTimeRTU":20,"DataBlocks":"[]"}');
IPS_ApplyChanges($modbussplitterid);

$serialportidtemp=IPS_GetInstance($modbussplitterid);
$serialportid=$serialportidtemp['ConnectionID'];


#*************************************************************  Serial Port konfig ************************************************************* 

#$serialportid=IPS_CreateInstance("{6DC3D946-0D31-450F-A8C6-C42DB8D7D4F1}");
IPS_SetName($serialportid, "Stromzaehler Serial Port"); // Instanz benennen
IPS_SetConfiguration($serialportid, '{"Open":true,"Port":"/dev/ttyUSB0","BaudRate":"9600","DataBits":"8","StopBits":"1","Parity":"None"}');
IPS_ApplyChanges($serialportid);
*/


# *********************************  Variable Profil erstellen ***********************
	
	 $vpname="Ampere";
	// Variable Profil erstellen
	if (!IPS_VariableProfileExists($vpname)) // Wenn das Provil noch nicht Exestiert dann lege es an:
	{
	IPS_CreateVariableProfile($vpname, 2); // Variabelprofil erstellen
	#IPS_SetVariableProfileIcon($vpname,"Intensity"); // Variabelprofil Icon zuweisen
	IPS_SetVariableProfileText($vpname,""," A");
	IPS_SetVariableProfileValues($vpname, 0, 0,0 ); //Der Befehl setzt den MinimalWert, MaximalWert und die Schrittweite eines Variablenprofils mit Namen ProfilName.
	IPS_SetVariableProfileDigits($vpname, 3);
} // Variabelprofil anlegen

# *********************************  Variable Profil erstellen ***********************
	
	 $vpname="KWh";
	// Variable Profil erstellen
	if (!IPS_VariableProfileExists($vpname)) // Wenn das Provil noch nicht Exestiert dann lege es an:
	{
	IPS_CreateVariableProfile($vpname, 2); // Variabelprofil erstellen
	#IPS_SetVariableProfileIcon($vpname,"Intensity"); // Variabelprofil Icon zuweisen
	IPS_SetVariableProfileText($vpname,""," KWh");
	IPS_SetVariableProfileValues($vpname, 0, 0,0 ); //Der Befehl setzt den MinimalWert, MaximalWert und die Schrittweite eines Variablenprofils mit Namen ProfilName.
	IPS_SetVariableProfileDigits($vpname, 3);
} // Variabelprofil anlegen

# *************************************************************  Cat anlegen ************************************************************* 
if ($ac_spannungen_anzeigen===true)
{

$spannungl1id=create_modbusdevice("Spannung L1", '{"DataType":2,"ReadFunctionCode":3,"ReadAddress":32069,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.1}',$modbussplitterid, "~Volt.230", $catid,"MQTT_VOLT_L1");

$spannungl2id=create_modbusdevice("Spannung L2", '{"DataType":2,"ReadFunctionCode":3,"ReadAddress":32070,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.1}',$modbussplitterid, "~Volt.230", $catid,"MQTT_VOLT_L2");

$spannungl3id=create_modbusdevice("Spannung L3", '{"DataType":2,"ReadFunctionCode":3,"ReadAddress":32071,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.1}',$modbussplitterid, "~Volt.230", $catid,"MQTT_VOLT_L3");
}

if ($ac_strom_anzeigen===true)
{
$stroml1id=create_modbusdevice("Strom L1", '{"DataType":6,"ReadFunctionCode":3,"ReadAddress":32072,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.001}',$modbussplitterid, "Ampere",$catid,"MQTT_AMPERE_L1");

$stroml2id=create_modbusdevice("Strom L2", '{"DataType":6,"ReadFunctionCode":3,"ReadAddress":32074,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.001}',$modbussplitterid, "Ampere",$catid,"MQTT_AMPERE_L2");

$stroml3id=create_modbusdevice("Strom L3", '{"DataType":6,"ReadFunctionCode":3,"ReadAddress":32076,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.001}',$modbussplitterid, "Ampere",$catid,"MQTT_AMPERE_L3");
}



if ($dc_spannungen_anzeigen===true)
{

$pv_volt1=create_modbusdevice("PV 1", '{"DataType":2,"ReadFunctionCode":3,"ReadAddress":32016,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.1}',$modbussplitterid, "~Volt.230", $catid,"MQTT_VOLT_L1");

$pv_volt2=create_modbusdevice("PV 2", '{"DataType":2,"ReadFunctionCode":3,"ReadAddress":32018,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.1}',$modbussplitterid, "~Volt.230", $catid,"MQTT_VOLT_L3");
}

if ($dc_strom_anzeigen===true)
{
$pv_strom1=create_modbusdevice("PV Strom 1", '{"DataType":2,"ReadFunctionCode":3,"ReadAddress":32017,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.01}',$modbussplitterid, "Ampere",$catid,"MQTT_AMPERE_L1");

$pv_strom2=create_modbusdevice("PV Strom 2", '{"DataType":2,"ReadFunctionCode":3,"ReadAddress":32019,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.01}',$modbussplitterid, "Ampere",$catid,"MQTT_AMPERE_L3");
}



if ($ac_leistung_anzeigen===true)
{
$ac_gesamtleistung=create_modbusdevice("Gesamtleistung", '{"DataType":6,"ReadFunctionCode":3,"ReadAddress":32080,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.001}',$modbussplitterid, "KWh",$catid,"MQTT_WATT_L3");
}

if ($dc_leistung_anzeigen===true)
{
$dc_gesamtleistung=create_modbusdevice("PV Gesamtleistung", '{"DataType":6,"ReadFunctionCode":3,"ReadAddress":32064,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.001}',$modbussplitterid, "KWh",$catid,"MQTT_WATT_L3");
}


if ($zaehlerstand_anzeigen===true) 
{ 
    $day=create_modbusdevice("Am Tag", '{"DataType":6,"ReadFunctionCode":3,"ReadAddress":32114,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.01}',$modbussplitterid, "KWh", $catid,"MQTT_KWH");
    $total=create_modbusdevice("Gesamtenergieertrag (seit 15.09.22)", '{"DataType":6,"ReadFunctionCode":3,"ReadAddress":32106,"WriteFunctionCode":0,"WriteAddress":0,"Length":0,"SwapBytes":false,"Poller":5000,"EmulateStatus":false,"Factor":0.01}',$modbussplitterid, "KWh", $catid,"MQTT_KWH");

}


#************************************************************* Verlinkungen ************************************************************* 
if ($ac_spannungen_anzeigen===true)
{
$spannungen_instanceid=GetOrCreateInstanz("Spannungen" , "dummy",$catid1 ); 
IPS_SetPosition($spannungen_instanceid,0);
GetorCreateLink("L1",$spannungen_instanceid,IPS_GetVariableIDByName("Spannung L1", $spannungl1id), 0);
GetorCreateLink("L2",$spannungen_instanceid,IPS_GetVariableIDByName("Spannung L2", $spannungl2id), 1);
GetorCreateLink("L3",$spannungen_instanceid,IPS_GetVariableIDByName("Spannung L3", $spannungl3id), 2);
}

if ($ac_strom_anzeigen===true)
{
$strom_instanceid=GetOrCreateInstanz("Strom" , "dummy",$catid1 ); 
IPS_SetPosition($strom_instanceid,1);
#GetorCreateLink("Gesamter Stromverbrauch",$strom_instanceid,IPS_GetVariableIDByName("Gesamter Stromverbrauch", $gstromverbrauchid), 4);
GetorCreateLink("L1",$strom_instanceid,IPS_GetVariableIDByName("Strom L1", $stroml1id), 0);
GetorCreateLink("L2",$strom_instanceid,IPS_GetVariableIDByName("Strom L2", $stroml2id), 1);
GetorCreateLink("L3",$strom_instanceid,IPS_GetVariableIDByName("Strom L3", $stroml3id), 2);
}

if ($ac_leistung_anzeigen===true)
{
$ac_gesamtleistung_instance_id=GetOrCreateInstanz("Leistung" , "dummy",$catid1 ); 
IPS_SetPosition($ac_gesamtleistung_instance_id,2);
GetorCreateLink("Gesamtleistung ",$ac_gesamtleistung_instance_id,IPS_GetVariableIDByName("Gesamtleistung", $ac_gesamtleistung), 0);
}


if ($dc_spannungen_anzeigen===true)
{
$pv_spannungen_instanceid=GetOrCreateInstanz("PV Sapnnungen" , "dummy",$catid1 ); 
IPS_SetPosition($pv_spannungen_instanceid,3);
GetorCreateLink("PV 1",$pv_spannungen_instanceid,IPS_GetVariableIDByName("PV 1", $pv_volt1), 0);
GetorCreateLink("PV 2",$pv_spannungen_instanceid,IPS_GetVariableIDByName("PV 2", $pv_volt2), 1);
}



if ($dc_strom_anzeigen===true)
{
$dc_strom_instanceid=GetOrCreateInstanz("PV Strom" , "dummy",$catid1 ); 
IPS_SetPosition($dc_strom_instanceid,4);
#GetorCreateLink("Gesamter Stromverbrauch",$strom_instanceid,IPS_GetVariableIDByName("Gesamter Stromverbrauch", $gstromverbrauchid), 4);
GetorCreateLink("L1",$dc_strom_instanceid,IPS_GetVariableIDByName("PV Strom 1", $pv_strom1), 0);
GetorCreateLink("L2",$dc_strom_instanceid,IPS_GetVariableIDByName("PV Strom 2", $pv_strom2), 1);
}

if ($dc_leistung_anzeigen===true)
{
$dc_gesamtleistung_instance_id=GetOrCreateInstanz("PV Leistung" , "dummy",$catid1 ); 
IPS_SetPosition($dc_gesamtleistung_instance_id,5);
GetorCreateLink("Gesamtleistung ",$dc_gesamtleistung_instance_id,IPS_GetVariableIDByName("PV Gesamtleistung", $dc_gesamtleistung), 0);
}



if ($zaehlerstand_anzeigen===true) 
{
    $erzeugnis_id=GetOrCreateInstanz("Energieertrag" , "dummy",$catid1 ); 
    IPS_SetPosition($erzeugnis_id,6);
    GetorCreateLink("Am Tag ",$erzeugnis_id,IPS_GetVariableIDByName("Am Tag", $day), 0);
    GetorCreateLink("Gesamtenergieertrag (seit 15.09.22) ",$erzeugnis_id,IPS_GetVariableIDByName("Gesamtenergieertrag (seit 15.09.22)", $total), 1);
}

function GetOrCreateInstanz($name , $ityp, $parent ) // erstellt eine Variable, wenn es noch nicht exestiert
// Erstellt eine Variable, Wert 1 = Name , Wert 2 ist der Typ der Variable, Wert 3, Variabel-Ident, Wert 4 Provil, Wert 5 ScriptID , Wert 6 ist die Übergeordnete Instanz, wo die Variable angelegt werden soll
{
    $ObjId = @IPS_GetObjectIDByName($name , $parent);
    if ($ObjId === false)
    {

    if ($ityp=="dummy") $ityp='{485D0419-BE97-4548-AA9C-C083EB82E61E}';

	     $ObjId = IPS_CreateInstance($ityp);
        IPS_SetName($ObjId, $name); // Namer vergeben

        IPS_SetParent($ObjId,$parent ); //  Variable unter die Instantz verschieben
		  }
     $position=instance_pos($name);
     IPS_SetPosition($ObjId,$position);     
    return $ObjId;
} //Ende der Funktion GetOrCreateInstanz

function GetorCreateLink($name,$parent,$id, $position)
{
$LinkID = @IPS_GetObjectIDByName($name , $parent);
$linkziel=@IPS_GetLink($LinkID);
$linkzielid=@$linkziel[TargetID];
$exziel=IPS_ObjectExists($id);
#IPS_SetPosition($LinkID,$position); //Position festlegen
if (@$linkzielid != $id or  $exziel===false )  @IPS_DeleteLink(@$LinkID);

if ($linkzielid != $id && $exziel===true ) 
 {
$LinkID = IPS_CreateLink();             // Link anlegen
IPS_SetName($LinkID, $name); // Link benennen
IPS_SetParent($LinkID, $parent); // Link einsortieren unter dem Objekt mit der ID "12345"
IPS_SetLinkTargetID($LinkID, $id);    // Link verknüpfen
IPS_SetPosition($LinkID,$position); //Position festlegen
}
IPS_SetPosition($LinkID,$position); //Position festlegen
return $LinkID;
}

function GetorCreatcategory($name,$parent, $position=0, $hidden=false)
{
$LinkID = @IPS_GetObjectIDByName($name , $parent);
    if ($LinkID === false)
    {
$LinkID = IPS_CreateCategory();             // Link anlegen
IPS_SetName($LinkID, $name); // Link benennen
IPS_SetParent($LinkID, $parent); // Link einsortieren unter dem Objekt mit der ID "12345"
if ($hidden ===true) IPS_SetHidden($LinkID,true);
$position=room_pos($name);
IPS_SetPosition($LinkID,$position); //Position festlegen
}
$position=room_pos($name);
IPS_SetPosition($LinkID,$position);
return $LinkID;
}


function create_modbusdevice($name, $config,$modbussplitterid, $profil, $catid,$ident)
{
$modbusdevice='{CB197E50-273D-4535-8C91-BB35273E3CA5}';
$modbusinstanceid=IPS_CreateInstance($modbusdevice);
IPS_SetName($modbusinstanceid,$name);
IPS_SetConfiguration($modbusinstanceid, $config);
IPS_SetParent($modbusinstanceid, $catid);
IPS_ApplyChanges($modbusinstanceid);
$valueid=IPS_GetVariableIDByName("Wert",$modbusinstanceid);
IPS_SetName($valueid,$name);
IPS_SetVariableCustomProfile($valueid,$profil);
IPS_DisconnectInstance($modbusinstanceid);
IPS_ConnectInstance($modbusinstanceid,$modbussplitterid);
#IPS_SetIdent($valueid,$ident);
// Archive Control ID herrausfinden
foreach(IPS_GetInstanceList ( ) as $m_id)// Durchsucht alle Instanzen und gibt die INstanzid an $i_id weiter
{
$typ=IPS_GetInstance($m_id)['ModuleInfo']['ModuleName']; // Fragt die Instanzen nach den Modulnamen ab....
if ($typ=="Archive Control") $modul_id=$m_id; // Wenn die INstanz den Modulnamen "Archive Control" hat, dann schreibe die ID in $modul_id
}

AC_SetLoggingStatus($modul_id,$valueid,true);
AC_SetAggregationType($modul_id,$valueid,1);
AC_ReAggregateVariable($modul_id,$valueid);
return $modbusinstanceid;
}

Hier die Doku:

Modbus Adressen