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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.