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 als
16bit 2er-Komplement übertragen, ggf auch lesen.
Siehe die Werte Adresse 2201 oder 2010.
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.
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.
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.