Seite 10 von 10

Re: ModBus TCP Interface

Verfasst: 29.03.2024, 19:09
von Hattermann
Script zum umwandel der Flieskomma Zahlen, einfach per pipe '| focnf.sh' an den TCL-Scriptaufruf hängen (z.B. für Kostal Plenticore).
fconf.sh:

Code: Alles auswählen

#/bin/sh
data=$(cat)
wertl=${data%% *}
werth=${data#* }
Vorzeichen=1
if [ $wertl -lt 0 ]
then
  let "wertl = wertl + 65536"
fi
if [ $werth -lt 0 ]
then
  let "werth = werth + 32768"
  Vorzeichen=-1
fi
let "exponent = werth / 128"
let "werth = werth % 128"
echo "$Vorzeichen*(1+$werth/128+$wertl/65536/128)*2^($exponent-127)" | bc -l
viel Spass Thomas

Re: ModBus TCP Interface

Verfasst: 04.04.2024, 22:13
von Balisto
Guten Abend zusammen,

im Dezimalbereich funktioniert alles super. Jetzt müsste ich aber den PV Überschuss als16bit 2er-Komplement übertragen, ggf auch lesen.
Siehe die Werte Adresse 2201 oder 2010.
Bild_2024-04-04_220933736.png
Jemand eine Lösung wie ich das umwandel in dezimal oder dezimal in ein 16bit 2er komplement?
Google ja findet man genug. Aber das so zu programmieren im tcl oder ein modul in redmatic?

script von indi55 läuft bei mir oder auch über redmatic.

Gruß Thomas

Re: ModBus TCP Interface

Verfasst: 04.04.2024, 22:38
von Henke
Zeig mal die msg, die in RedMatic ankommt.
Bei den 16bit dürfte das ein Buffer/Array sein.

Code: Alles auswählen

msg.Ueberschuss = msg.xxx.buffer[0] + msg.xxx.buffer[1] * 256;

Re: ModBus TCP Interface

Verfasst: 05.04.2024, 19:57
von Balisto
Hier der Istwert als dezimal. Kommt als 470. Muss halt nur noch in eine Kommazahl. 47,7. Aber das ist hier nicht so wild.

Der Überschuss kommt als undefined zurück.
Bild_2024-04-05_195648535.png

Re: ModBus TCP Interface

Verfasst: 09.04.2024, 19:57
von Balisto
Hier mein script zur Übergabe der Überschussleistung an die Warmwasserwärmepumpe (Ochsner genius 333)

Code: Alles auswählen

! Lesen der Systemvariablen
var sysvarname = "WWP_Überschussleistung";
var Wert = dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarname).Value();
! ist Systemvariable schon als Zeichenkette sollte es so gehen
! falls Systemvariable  als Zahl angelegt - erst in einen String wandeln - ohne Nachkommastellen = ToString(0).
Wert = Wert.ToString(0);
! zur Kontrolle
WriteLine(Wert);


! **************** Schreiben mit system.Exec ****************
string lGetOut;
string lGetErr;

! Schreiben des Wertes
system.Exec("tclsh /usr/local/addons/modbus/modbus_interface.tcl 192.168.178.181 8899 01 06 2201 "#Wert,&lGetOut,&lGetErr);
In der Variable Wert steht das was ich übertragen will. Als Zeichenkette.
Übergeben will ich hier als Beispiel 600 W Überschussleistung.
Die WWP nimmt wie oben ersichtlich die Überschussleistung nur als 16bit 2er Komplement an. Oder gibt diese auch so wieder zurück.

600 ist im 2er Komplement 11111101 10101000.
Ich vermute das, dass so nicht übertragen wird in dem tcl.
Evtl weiß da einer weiter. hier bin ich mit meinem latain am ende.
Bild_2024-04-09_195453456.png
Gruß Thomas

Re: ModBus TCP Interface

Verfasst: 09.04.2024, 20:42
von Henke
Die msg als Code Tag und dir kann geholfen werden.
Nicht msg.payload als Bildschirmcopy.