bdqKlz
Topic Author
Posts: 2
Joined: 07 Mar 2019, 08:14

Fehlerhafte Werte in Prozessabbild ModBus RTU Master

19 Mar 2019, 13:20

Hallo zusammen,

Mein Vorhaben:
Ich möchte mittels RevPi Connect und der integrierten RS485 Schnittstelle bis zu 8 EnergyMeter (Stromzähler) auslesen, die Werte verarbeiten und auf einer CAN-Schnittstelle ausgeben.

Die Hardware:
RevPi Connect
RevPi con CAN Schnittstelle
Schneider Electric iEM 3155 (Stromzähler)

Die Software:
Ich habe zur bessern Übersicht mein Programm in drei Teile geteilt:
1. ModBus Kommunikation
2. CAN-Kommunikation (läuft bereits tadellos)
3. Eine Art "Main" um die Abläufe zu steuern

Das Problem:
Ich lese bereits über den Modbus RTU Master 150 Werte ein und greife mittels Python Skript auf das Prozessabbild wie von Volker in seinem "Zugriff mit Python" Beitrag beschrieben zu. https://revolution.kunbus.de/forum/view ... ?f=10&t=32
Soweit so gut. Leider bekomme ich immer wieder inkorrekte Werte angezeigt. Lasse ich mir zum Beispiel die Spannung der Phase 1 (Offset 27) anzeigen spuckt meine Funktion erst 233,xxxx Volt aus dann wieder "nan" sprich "not a number". (siehe Bilder)
Auch wenn ich mir die Werte direkt über piTest -r Slv1_Volt_P1_A anzeigen lasse sehe ich direkt das die Werte hier auch zwischen korrekt (~0x436C) und inkorrekt (0xFFC0) schwanken.
Dies bedeutet für mich das ich entweder zur falschen Zeit auf das Prozessabbild zugreife oder das ich falsche Werte empfangen.
Um dies genauer analysieren zu können habe ich eine weiter Config in PiCtory erstellt und lese in dieser nur 4 Register fehlerfrei ein.
Auch habe ich mal die Action Intervalle verändert (deshalb die ungeraden Zahlen im Bild unten) aber bringt nur eine geringe Verbesserung.

Ich komme wirklich nicht mehr weiter und wende mich nun an euch!

Vielen Dank für die Hilfe im Vorraus!

Viele Grüße
Raphael

Datei ModRead.py
#!/usr/bin/python3

import fcntl
import struct
import time
import numpy as np
import math

f = open("/dev/piControl0","wb+",0);

def filterNan(value):
    
    if math.isnan(value)== False:
         return value


def readFloat32(offset): #Register finden und lesen

    f.seek(offset);
    x = f.read(2);
    #print(x)
    a = struct.unpack('<H',x)
    #print(a)
    byte0 = np.int_(a[0]);

    f.seek(offset+2);
    x = f.read(2);
    b = struct.unpack('<H',x);
    byte1 = np.int_(b[0]);
    
    volt = floatConverter(inputArray = [byte0, byte1]);
    
    return volt


def floatConverter(inputArray): #Aus zwei Registern eine Floatzahl erzeugen 
    int32Val = np.int_(inputArray[1] + (inputArray[0] << 16)); 
    newFloat = struct.unpack('f', struct.pack('i', int32Val))[0]
    return newFloat

def readFloatToByte(offset):
    byte_0 = 0xFF;
    byte_1 = 0xFF;
    byte_2 = 0xFF;
    byte_3 = 0xFF;
    
    f.seek(offset);
    x = f.read(2);
    a = struct.unpack('<H',x)
    word1 = np.int_(a[0]);

    f.seek(offset+2);
    x = f.read(2);
    b = struct.unpack('<H',x);
    word2 = np.int_(b[0]);
    
    value = floatConverter(inputArray = [word1, word2]);
    
    if math.isnan(value) == False:
        f.seek(offset);
        byte_0 = int.from_bytes(f.read(1), "big");
        f.seek(offset+1);
        byte_1 = int.from_bytes(f.read(1), "big");
        f.seek(offset+2);
        byte_2 = int.from_bytes(f.read(1), "big");
        f.seek(offset+3);
        byte_3 = int.from_bytes(f.read(1), "big");
    return ([byte_0, byte_1, byte_2, byte_3]);
Strom.PNG
Strom.PNG (30.75 KiB) Viewed 1317 times
Fehlwerte.PNG
Fehlwerte.PNG (229.58 KiB) Viewed 1317 times
Extended_Data.PNG
Extended_Data.PNG (98.96 KiB) Viewed 1317 times
 
bdqKlz
Topic Author
Posts: 2
Joined: 07 Mar 2019, 08:14

Re: Fehlerhafte Werte in Prozessabbild ModBus RTU Master

26 Mar 2019, 08:32

Hallo zusammen,

habe jetzt meinen Fehler gefunden.
Ich hab bei der Config in PiCtory zweimal das gleiche Register ausgelesen.
Sprich ich habe in Action ID Register Addr. 3000 bzw. 3001 ausgelesen da ich bei Quantity of Registers 2 eingetragen habe.
Zusätzlich habe ich noch in Action ID 2 die Register Addr. 3001 ausgelesen.
Das hat dann dazu geführt das bei falschem Timing quatsch im Prozessabbild steht.
Berichtigt man die Angaben und ließt tatsächlich nur einmal die Werte aus kommen immer plausible Werte.

Leider habe ich jetzt ein neues Problem:
Da ich ja wie oben beschreiben mehrere gleiche Slaves (EnergyMeter) auslesen will habe ich diese in den ModBus RTU Master 150 eingetragen.
Es sind immer die selben Signale nur die Slave Addr. ändert sich.
Ich bin jetzt bei 3 Slaves und mein Problem ist das die Werte quasi nur noch alle 5 sec aktualisiert werden. Das reicht natürlich nicht.
Hat jemand etwas ähnliches schon einmal beobachtet bzw. kann mir sagen was ich falsch mache?
Die Zeit ist wenn ich mittels piTest auslese auch bei ca. 5 sek bis die Werte aktualisiert werden.

Viele Grüße
Raphael

Who is online

Users browsing this forum: No registered users and 1 guest