SDM-220 mit EasyModbus in C# auslesen?

OP #4480662
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?
Angehängte Dateien:
OP #4484975
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren