Hallo zusammen,
ich habe den "Fehler" gefunden. ""weil es evtl. gewollt passiert: Auch wenn man Quantity of Registers auf >1 setzt, wird für die Variable trotzdem nur 2 Byte (WORD) im Prozessabbild reserviert. Das lässt sich durch den durch Export gezeigten Offset der Variablen erkennen. Mit Verwendung eines Float-Konverters den ich hier im Forum gefunden habe konnte ich mein Problem mit Hilfe von import struct lösen.
Mit folgendem Code kann man dann auf die gewollten Register zugreifen, wobei der Parameter von readFloat32 der Offset der Variable im Prozessabbild ist. Da sich die benötigten Messwerte in meinem Anwendungsfall alle hintereinander befinden, alles 4-Byte-Floats sind und ich alle innerhalb eines Zyklus abfragen will, reicht eine Modbusanfrage aus:

- Beispiel2.PNG (31.17 KiB) Viewed 8528 times
#!/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):
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):
int32Val = np.int_(inputArray[1] + (inputArray[0] << 16));
newFloat = struct.unpack('f', struct.pack('i', int32Val))[0]
return newFloat
L_N_A2_U_L1_N = (readFloat32(802))
L_N_A2_U_L2_N = (readFloat32(806))
L_N_A2_U_L3_N = (readFloat32(810))
L_N_A2_U_L1_L2 = (readFloat32(814))
L_N_A2_U_L2_L3 = (readFloat32(818))
L_N_A2_U_L3_L1 = (readFloat32(822))
L_N_A2_I_L1 = (readFloat32(826))
L_N_A2_I_L2 = (readFloat32(830))
L_N_A2_I_L3 = (readFloat32(834))
L_N_A2_S_L1 = (readFloat32(838))
L_N_A2_S_L2 = (readFloat32(842))
L_N_A2_S_L3 = (readFloat32(846))
L_N_A2_P_L1 = (readFloat32(850))
L_N_A2_P_L2 = (readFloat32(854))
L_N_A2_P_L3 = (readFloat32(858))
L_N_A2_Q_L1 = (readFloat32(862))
-edit- ich weiß nicht warum das Codefenster so seltsam aussieht.
Da ich es jetzt ohne RevPiModIO gelöst habe steht der Beitrag vermutlich im falschen Forum... außer es gibt eine Möglichkeit, es damit zu lösen (und ich bin sicher die gibt es). Man könnte es denke ich auch mit der replace_io Funktion lösen, muss dann aber allerdings jede 2te Variable "auslassen", damit in dem hier vorliegendem Fall (4-byte-Float) keine Probleme hinsichtlich Offset zustande kommen. Bei der replace_io Funktion werden anscheinend ebenfalls die nächsten Variablen im Prozessabbild überschrieben, wenn der Datentyp >2 Byte ist.
Sven, falls du noch eine andere Möglichkeit kennst, oder du die replace_io Funktion anpassen willst, sodass sie "dynamisch", z.B. durch die Angabe Quantity of Registers, erkennt, wie groß eine Variable sein muss, lass es mich und die Community bitte Wissen. Ich denke ich bin nicht der Erste der mit diesem Problem zu kämpfen hatte.
Gruß
Luke