Willkommen im Loxone Community Forum. Um alle Funktionen nutzen und sehen zu können, registriere dich bitte zuerst. Dies gilt auch für das herunterladen von Dateien.
bräuchte mal ein wenig hilfe bitte.
Stehe auf der Leitung.
Habe einen Modbus Server von dem ich auch erfogreich Werte erhalte.
Nur müsste ich die Erhaltenen Werte irgendwie umwandel damit die Anzeige Stimmt.
Erhalte aus dem Register zb.:
1214564 das wäre wenn ich in Hex umwandle 128864 und genau so würde ich es als anzeige benötigen.
Eingang am Analog Input 1 (AI1)
Ausgang am Textausgang 1 (TQ1)
Code:
int nEvents;
char strBuf[16];
while(TRUE)
{
nEvents = getinputevent(); // read Input changeflag bits
if (nEvents & 0x08) // check only change on AI1
{
sprintf(strBuf, "%x", getinput(0) );
setoutputtext(0,strBuf);
}
sleep(10); // give 10ms back to system
}
Du hast da halt ein kleines Problem
HEX Werte enthalten halt auch Buchstaben (a bis f) , somit lässt sich ein darstellbarer Hexwert nicht als Dezimalzahl handhaben sondern ist ein String, also ein Text.
Noch was:
-für was wird der Hexwert dann überhaupt verwendet ?
-das Script ist ungetestet.
Zuletzt geändert von Labmaster; 26.11.2021, 08:41.
und wie würde das script aussehen bei 15 eingänge?
Habe 15 Zähler die ich auslese, jetzt habe ich für jeden ein eigenes gemacht, doch leider bei dem 9 war schluss
"Too much Programs"
:-(
Habe von der Firma Wachendorf einen Gateway M-Bus Master / Modbus TCP Server
HD67044-B2-XX
Der mir den M-Bus der Heizung ausliest und per Modbus TCP Server weitergibt.
Bis jetzt hatte ich das ganze auf einem Raspberry pi3 laufen bzw läuft noch.
Nun wollte ich Interesse halber mal testen ob es bei loxone auch möglich ist.
Die werte kommen als Dez und wenn ich sie umwandle in hex, dann passen sie 1 zu 1 mit der anzeige am Heizungszähler.
Sollte halt aber über Modbus mal eine Dezimalzahl daherkommen welche einen Hexwert produziert welche einen Buchstaben enthält, dann kracht es eventuell, da dann atoi() einen nicht gültigen Nummernstring bekommt.
Ich verstehe seitens des Herstellers nicht wie man so einen Mist machen kann.
Kann es nicht sein, dass die richtige Heizungsanzeige die nicht umgewandelte Zahl ist und man die Anzeige auf dem Heizungszähler eher in dezimal umwandeln müsste ? Das wäre viel logischer.
Eingang: AIx
Ausgang: AQx
(also AI1 zu AQ1, AI2 zu AQ2 .....)
### Variante als linearer Code ###
Code:
int nEvents;
char strBuf[16];
while(TRUE)
{
nEvents = getinputevent(); // read Input changeflag bits
if (nEvents & 0x08) // check only change on AI1
{
sprintf(strBuf, "%x", getinput(0) ); // output as unsigned integer
setoutput(0, atoi(strBuf) );
}
if (nEvents & 0x10) // check only change on AI2
{
sprintf(strBuf, "%x", getinput(1) ); // output as unsigned integer
setoutput(1, atoi(strBuf) );
}
if (nEvents & 0x20) // check only change on AI3
{
sprintf(strBuf, "%x", getinput(2) ); // output as unsigned integer
setoutput(2, atoi(strBuf) );
}
if (nEvents & 0x40) // check only change on AI4
{
sprintf(strBuf, "%x", getinput(3) ); // output as unsigned integer
setoutput(3, atoi(strBuf) );
}
if (nEvents & 0x80) // check only change on AI5
{
sprintf(strBuf, "%x", getinput(4) ); // output as unsigned integer
setoutput(4, atoi(strBuf) );
}
if (nEvents & 0x100) // check only change on AI6
{
sprintf(strBuf, "%x", getinput(5) ); // output as unsigned integer
setoutput(5, atoi(strBuf) );
}
if (nEvents & 0x200) // check only change on AI7
{
sprintf(strBuf, "%x", getinput(6) ); // output as unsigned integer
setoutput(6, atoi(strBuf) );
}
if (nEvents & 0x400) // check only change on AI8
{
sprintf(strBuf, "%x", getinput(7) ); // output as unsigned integer
setoutput(7, atoi(strBuf) );
}
if (nEvents & 0x800) // check only change on AI9
{
sprintf(strBuf, "%x", getinput(8) ); // output as unsigned integer
setoutput(8, atoi(strBuf) );
}
if (nEvents & 0x1000) // check only change on AI10
{
sprintf(strBuf, "%x", getinput(9) ); // output as unsigned integer
setoutput(9, atoi(strBuf) );
}
if (nEvents & 0x2000) // check only change on AI11
{
sprintf(strBuf, "%x", getinput(10) ); // output as unsigned integer
setoutput(10, atoi(strBuf) );
}
if (nEvents & 0x4000) // check only change on AI12
{
sprintf(strBuf, "%x", getinput(11) ); // output as unsigned integer
setoutput(11, atoi(strBuf) );
}
if (nEvents & 0x8000) // check only change on AI13
{
sprintf(strBuf, "%x", getinput(12) ); // output as unsigned integer
setoutput(12, atoi(strBuf) );
}
sleep(20); // give 20ms back to system
}
### Variante mit Schleife ###
PHP-Code:
char i;
int nEvents;
char strBuf[16];
while(TRUE)
{
nEvents = getinputevent(); // read Input changeflag bits
for(i=0; i<13; i++)
{
if (nEvents & (0x08<<i)) // check only change on AIx
{
sprintf(strBuf, "%x", getinput(i) ); // output as unsigned integer
setoutput(i, atoi(strBuf) );
}
}
sleep(20); // give 20ms back to system
}
Zuletzt geändert von Labmaster; 07.12.2021, 17:03.
Hi, danke für deine Antwort.
Werde versuchen es am Abend zu testen.
Bezüglich des Heizungszählers.
Der ist von Qundis heat 5 mit einem
M-Bus-Aufsatzmodul Q module.
Da der Q heat auch ohne modul arbeitet und das ja nur ein zusatzt ist,
ist die angezeigte Wärme schon die Richtige.
Habe ja auch die Software von Qundis zum auslesen der einzelnen Zähler.
Es kann natürlich auch sein das ich beim anlegen im Modbus server bei den Variablen was falsch gemacht habe.
War damals schon froh das ich die werte auf dem pi bekommen habe und sie richtig darzustellen.
Ich lese den Qundis heat 5.5. mit dem M-Bus Aufsetzmodul aus (mit einem RasPi + M-Bus "Hat") - da kommen nur Dezimalzahlen an, allerdings in der Dimension "100 Wh" - also um auf kWh zu kommen muss man die Zahl durch 10 dividieren
Wir verarbeiten personenbezogene Daten über Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen, Werbung zu personalisieren und Websiteaktivitäten zu analysieren. Wir können bestimmte Informationen über unsere Nutzer mit unseren Werbe- und Analysepartnern teilen. Weitere Einzelheiten finden Sie in unserer Datenschutzrichtlinie.
Wenn Sie unten auf "Einverstanden" klicken, stimmen Sie unserer Datenschutzrichtlinie und unseren Datenverarbeitungs- und Cookie-Praktiken wie dort beschrieben zu. Sie erkennen außerdem an, dass dieses Forum möglicherweise außerhalb Ihres Landes gehostet wird und Sie der Erhebung, Speicherung und Verarbeitung Ihrer Daten in dem Land, in dem dieses Forum gehostet wird, zustimmen.
Kommentar