ModbusAttr : Es werden nicht alle Readings aktualisiert

Begonnen von m-d-ley, 12 Juli 2021, 08:37:54

Vorheriges Thema - Nächstes Thema

m-d-ley

Hallo nochmal und ein kurzes Update:

also der Fehler der sporadischen Ausfälle besteht hier im Netzwerk.
Vielen Dank erstmal für die ganzen Ratschläge.

Nun habe ich aber ein Register, welches ich nicht wirklich visualisiert bekomme und zwar soll es ein "UDINT" über FC4 sein.
Der Wert, welcher dort ausgegeben wird kommt nicht hin. Wenn ich die Hex-Werte der beiden Register (25 = C1C9 und 26 =000A) konvertiere ( https://www.scadacore.com/tools/programming-calculators/online-hex-converter/ )  ist der richtige Wert unter "UINT32 - Mid-Little Endian" gelistet. Dort wiederum werden anscheinend die Register gedreht und erst Register 26 und dann Register 25 ausgewertet.

Wie bekomme ich das ordentlich aufgelöst bzw. angezeigt?

StefanStrobel

Hallo,

Probier es mal mit RevRegs zum vertauschen der Register und dem Unpack-Code L für einen 32bit unsigned Integer als Little Endian (N wäre Big Endian)

Gruß
    Stefan

m-d-ley

Hallo,
also so hat es geklappt:

obj-i25-format %.1f
obj-i25-len 2
obj-i25-reading Betriebsstunden_min
obj-i25-revRegs 1
obj-i25-showGet Betriebsstunden_min
obj-i25-unpack I>

allerdings verstehe ich das echt überhaupt nicht. Ich würde ja gerne mal verstehen, was ich mit diesen Attributes so veranstaltet habe.
Dieses Attribute-Konstrukt habe ich aus dem Wiki kopiert und leich modifiziert. Dort steht es so:

attr WP dev-type-VT_R4-format %.1f
attr WP dev-type-VT_R4-len 2
attr WP dev-type-VT_R4-revRegs 1
attr WP dev-type-VT_R4-unpack f>

attr WP obj-h1234-reading Temp_In
attr WP obj-h1234-type VT_R4
attr WP obj-h1236-reading Temp_Out
attr WP obj-h1236-type VT_R4

This example defines a data type with the name VT_R4 which uses an unpack code of f>, length 2 and reversed register ordering. It then assigns this Type to the objects Temp_In and Temp_Out.


unpack habe ich auf I> geändert, da es kein Float ist, sonder ein unsigned Integer. Aber was der Rest da genau macht verstehe ich nicht so richtig. Ich hatte die Vermutung, dass ">" für das Drehen der Register steht.

StefanStrobel

Hallo,

für die unpack-Codes ist folgende Doku relevant:
https://perldoc.perl.org/functions/pack
Da steht das auch mit dem < bzw. > drin.

Revregs dreht die Reihenfolge der Register untereinander um. Beides ist in der Doku von ModbusAttr beschrieben:
Zitat
obj-[cdih][1-9][0-9]*-unpack
defines the unpack code to convert the raw data string read from the device to a reading. For an unsigned integer in big endian format this would be "n", for a signed 16 bit integer in big endian format this would be "s>" and for a 32 bit big endian float value this would be "f>". (see the perl documentation of the pack function).

obj-[cdih][1-9][0-9]*-revRegs
this is only applicable to objects that span several input registers or holding registers.
when they are read then the order of the registers will be reversed before
further interpretation / unpacking of the raw register string.
The same happens before the object is written with a set command.

Ich hoffe das erklärt alles.

Gruß
    Stefan