Forum: Haus & Smart Home SDM-220 mit EasyModbus in C# auslesen?


von Matt B. (mattb)


Angehängte Dateien:

Lesenswert?

Hallo,

hat schon mal jemand versucht einen SDM-220-Standard 
Einphasenstromzähler mit C# auszulesen? Ich verwende dafür EasyModbus. 
Allerdings kommen keine plausiblen Werte an.

Hier der Einstiegs-Code:
1
static void Main(string[] args)
2
{
3
  EasyModbus.ModbusClient client = new EasyModbus.ModbusClient("COM3");
4
  client.Baudrate = 9600;
5
  client.Parity = System.IO.Ports.Parity.Even;
6
7
  client.Connect();
8
  if (client.Connected)
9
  {
10
    int[] int_array = client.ReadInputRegisters(0, 2);
11
12
    for (int i = 0; i < int_array.Length; i++)
13
      Console.WriteLine("Register " + i.ToString() + ": " + int_array[i].ToString());
14
15
    client.Disconnect();
16
  }
17
  else
18
    Console.WriteLine("Keine Verbindung");
19
20
  Console.WriteLine("Fertig");
21
  Console.ReadLine();
22
}

Port, Baudrate und Parität stimmt. In den Inputregistern 0 und 1 sollte 
eigentlich der Messwert der Netzspannung liegen.

Für den Vergleich habe ich einfach mal "Modbus Poll" installiert und 
damit den Stromzähler ausgelesen. Dort passt es auch.

Hat jemand eine Idee?

von Matt B. (mattb)


Lesenswert?

Hi,

ich bin weiter gekommen!

Hier mal der angepasste Code:
1
static void Main(string[] args)
2
{
3
  EasyModbus.ModbusProtocol p = new ModbusProtocol();
4
  EasyModbus.ModbusClient c = new ModbusClient("COM3");
5
  
6
  c.Baudrate = 9600;
7
  c.Parity = System.IO.Ports.Parity.Even;
8
  c.StopBits = System.IO.Ports.StopBits.One;
9
10
  c.UnitIdentifier = 1;
11
12
  c.Connect();
13
14
  int[] voltage_register = new int[2];
15
  int[] current_register = new int[2];
16
  float voltage = new float();
17
  float current = new float();
18
  float power = new float();
19
20
  while (true)
21
  {
22
    if(Console.KeyAvailable)
23
    {
24
      ConsoleKeyInfo key = Console.ReadKey();
25
      if (key.Key == ConsoleKey.Enter)
26
        break;
27
    }
28
    
29
    voltage_register = c.ReadInputRegisters(0, 2);
30
    voltage = ModbusClient.ConvertRegistersToFloat(voltage_register, ModbusClient.RegisterOrder.HighLow);
31
    System.Threading.Thread.Sleep(10);
32
33
    current_register = c.ReadInputRegisters(6, 2);
34
    current = ModbusClient.ConvertRegistersToFloat(current_register, ModbusClient.RegisterOrder.HighLow);
35
    power = voltage * current;
36
37
    Console.WriteLine("============================================");
38
    Console.WriteLine(DateTime.Now.ToString());
39
    Console.WriteLine("Spannung: " + voltage.ToString() + " V");
40
    Console.WriteLine("Strom:    " + current.ToString() + " A");
41
    Console.WriteLine("Leistung: " + power.ToString() + " W");
42
    System.Threading.Thread.Sleep(1000);
43
  }
44
45
  c.Disconnect();
46
47
  Console.WriteLine("Fertig");
48
  Console.ReadLine();
49
}

Grundsätzlich bekomme ich damit korrekte Messwerte. Für den Test habe 
ich einfach eine 40 Watt-Glühbirne an den Stromzähler angeschlossen.

Allerdings bekomme ich manchmal auch falsche Werte geliefert. Dann steht 
zum Beispiel in der Variablen 'current' der gleiche Wert wie in der 
'voltage', also der Spannungswert. Manchmal steht in der 'voltage' auf 
der Stromwert. Und manchmal stehen auch total unplausible Werte darin.
Das ist bei (gefühlt) jeder 5 Messung der Fall.

von Stefan (Gast)


Lesenswert?

Hi,

Benutzt Du Die neueste Version des Library V1.9?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.