# KNX-Kommunkation über KNXnet/IP mit Siemens S7-1500/S7-1200; TIA-Portal



## kürbis85 (25 September 2018)

Hallo zusammen,

da ich in Zukunft privat Häuser mit KNX-Bus-Systemen ausstatten will, mir die KNX-Aktorik aber zu teuer ist, habe ich ein S7-Programm im TIA-Portal erstellt, um mit dem KNX-Bussystem zu kommunizieren. Die SPS soll Rollläden, Beleuchtung und die Fußbodenheizung steuern.
Die PN-Schnittstelle der SPS kommuniziert mit einer beliebigen IP-Schnittstelle für KNX. Durch Aufbau eines Tunnels, werden die KNX-Telegramme zur SPS weitergeleitet bzw. von der Steuerung gesendet.
Die nötigen Informationen dazu habe ich der KNX Spezifikation 2.1 von www.knx.org entnommen.

Folgende KNX Komponenten wurden zum Testen eingesetzt:
MDT     Glastaster II Smart   BE-GT2TW.01
MDT     IP Interface               SCN-IP000.02

Als SPS hatte ich eine S7-1510SP. (Das Programm sollte aber auch auf einer S7-1200 laufen!)

Die SPS kann über Gruppen-Adressen via "Bits" (Beleuchtung ein / aus), "16Bit Float" (Temperatur empfangen) und 1 Byte (Rollladen-Status senden) Daten kommunizieren!
Weitere Ergänzungen sollten einfach möglich sein.

Kommunikationsabbrüche werden abgefangen und automatisch wieder aufgebaut. Meiner Meinung nach sollte eine Hausautomatisierung damit erstmal nichts im Wege stehen!
Der Langzeittest muss noch erfolgen!!! (ggf. durch euch!)

Positive und wie auch negative Kritiken sind erwünscht.
Ansonsten übernehme ich keine Garantie auf irgendwas!! ;-)

Viel Erfolg!

Gruß

PS: Ich weiß, dass es von Wago-KNX-Kommunkationsbaugruppen gibt! Ich bin aber ein S7-Programmierer und halte die Siemens-Steuerungen für zukunftssicherer!


----------



## Burns848 (1 Oktober 2018)

Hallo, 

die Idee an sich ist wirklich super, ich selbst habe die ganze zeit schon ähnliches im Kopf jedoch unter zuhilfenahme eines KNX IP BAOS der firma Weinzierl. 
Dieses bietet den Vorteil der ETS integration und besitzt einen Objektserver. 

Ich denke mal deine Lösung hat keinerlei ETS integration sprich du schreibst und liest einfach die KNX Gruppenadressen richtig ?


----------



## kürbis85 (1 Oktober 2018)

Hallo,


Burns848 schrieb:


> die Idee an sich ist wirklich super, ich selbst habe die ganze zeit schon ähnliches im Kopf jedoch unter zuhilfenahme eines KNX IP BAOS der firma Weinzierl.
> Dieses bietet den Vorteil der ETS integration und besitzt einen Objektserver.


welchen Vorteil habe ich durch die Integration in ETS? Einfachere Handhabung?  



Burns848 schrieb:


> Ich denke mal deine Lösung hat keinerlei ETS integration sprich du schreibst und liest einfach die KNX Gruppenadressen richtig ?



 das ist richtig!

Gruß!


----------



## GLT (2 Oktober 2018)

kürbis85 schrieb:


> ...da ich in Zukunft privat Häuser mit KNX-Bus-Systemen ausstatten will....!


Als Lösung für Andere?

Auf welchen Kanalpreis kommst Du insgesamt, wenn man von 16A C-Last ausgeht?
Und welchen erreichst Du bei der Heizung?
Wie sieht es bei Beleuchtung jenseits von Klickklack aus?


----------



## kürbis85 (2 Oktober 2018)

GLT schrieb:


> Auf welchen Kanalpreis kommst Du insgesamt, wenn man von 16A C-Last ausgeht?


 ca. 17Euro (10Euro der Ausgang, 8 Euro Relais)


GLT schrieb:


> Und welchen erreichst Du bei der Heizung?


 ca. 10Euro (24V Stellantrieb)


GLT schrieb:


> Wie sieht es bei Beleuchtung jenseits von Klickklack aus?


 Bin ich noch auf der Suche!? (Analog/ Ethernet-Ansteuerbar oder eben KNX)

Alles gerechent auf S7-1200! 
Zuätzlich mindestens 170 Euro Kosten für die SPS!


----------



## GLT (2 Oktober 2018)

kürbis85 schrieb:


> ca. 17Euro (10Euro der Ausgang, 8 Euro Relais)


Da sehe ich jetzt keinen preislichen Vorteil, da kommst Du mit KNX-Aktoren direkt auch hin. Zusätzlich hast Du vor-Ort-Bedienung intergriert u. die Vorzugslage der Kontakte ebenfalls. Klar Strommessung ist da noch nicht bei (da wären wir dann bei KNX mit ca. 23,-- dabei), aber das dürfte wohl mit der S7 wesentlich aufwändiger u. teuerer werden.

Beim Heizungskanal wärst Du jetzt geringfügig günstiger unterwegs - was wohl am fehlenden Relais für 230V und der Einschränkung auf 24V liegen dürfte?

Immerhin könnte der reine DI-Abgriff wohl günstiger realisierbar werden - da stehen ca. 8,-- den 13,-- für KNX gegenüber - dafür quasi wahlfrei pot.frei/24V/230V.


----------



## Daniel_G (11 Oktober 2018)

> Wie sieht es bei Beleuchtung jenseits von Klickklack aus?


HUE ist mit S7 kein Problem, habe es selbst nicht drüber laufen aber schon ein Projekt dazu hier im Forum gefunden. Lifx ist auch möglich da offene API.

Ich habe deine Bausteine mal getestet und versucht aus meinem KNX System Temperaturen und Signale auszulesen, aber nicht erfolgreich. 
Aber, der Tunnel steht die Signale kommen rein, ich habe mir einen Puffer gebaut wo ich sehen kann welche 500 Adresen zu letzt kommuniziert haben. 
Ich glaube da ist ein Problem mit dem "Gruppenadresse zu einem Wort zusammenbauen" denn ich erhalte keine gleichen ergebnisse wenn ich die Gruppenadresse am Baustein eintrage und mit den empfangenden vergleiche. Ich sehe im IPS Server welche Adressen auf dem BUS arbeiten. Ich denke ich werde die Tage auch mal genauer Analysieren.

Vielen Dank für das Projekt ist wirklich toll mal direkt auf dem Bus zu arbeiten, nutze sonst ein KNX PN Gateway


----------



## kürbis85 (15 Oktober 2018)

Daniel_G schrieb:


> Ich glaube da ist ein Problem mit dem "Gruppenadresse zu einem Wort zusammenbauen" denn ich erhalte keine gleichen ergebnisse wenn ich die Gruppenadresse am Baustein eintrage und mit den empfangenden vergleiche. Ich sehe im IPS Server welche Adressen auf dem BUS arbeiten. Ich denke ich werde die Tage auch mal genauer Analysieren.


Hallo Daniel,
schön das du damit arbeitest bzw. versuche durchführst!
Falls du Fragen hast, was änderst oder optimierst, kannst du mir ja Bescheid geben! 
Wie gesagt, bei mir hat das Ganze nur mit den paar Gruppenaddressen aus den beigefügten KNX_Projekt gelaufen. Das Projekt ist auf 3-teilige Adressen ausgelegt. Ich meine es gibt auch 2-teilige!?
Gruß
Florian


----------



## Daniel_G (15 Oktober 2018)

kürbis85 schrieb:


> Falls du Fragen hast, was änderst oder optimierst, kannst du mir ja Bescheid geben!


Bin dabei, habe den Baustein schon erweitert und baue gerade die DPT´s ein, damit mann durch beschalten des Bausteins das Format mit übergeben kann und alle Werte erhalten kann. 
Ich habe den Lesen Eingang entfernt und Lese immer wenn ich nicht Schreibe. Ich bin mir noch nicht sicher wie es später mit der Zykluszeit ist, eventuell muss die abfrage schneller erfolgen und die Daten in einem Empfangspuffer geschoben werden. Die Zykluszeit ist derzeit bei ~4ms aber das auch nur 20% der Gruppenadressen im Programm und noch keine weiteren Funktionen! Denke das kann später schnell Richtung 10 - 20ms gehen. 


> Wie gesagt, bei mir hat das Ganze nur mit den paar Gruppenaddressen aus den beigefügten KNX_Projekt gelaufen. Das Projekt ist auf 3-teilige Adressen ausgelegt. Ich meine es gibt auch 2-teilige!?


Es gibt 1,2 und 3 Stufig aber nutzen ist in meinen Augen nur das 3 Stufige von Interesse und daher ist der Baustein auch für mich gut ausgelegt.
Wegen den Gruppenadressen habe ich aus ....

```
//Gruppenadresse zu einem Wort zusammenbauen!
#GruppenAddr := SHL (IN := #HauptGruppe, N := 12);
#GruppenAddr := #GruppenAddr OR SHL(IN := #MittelGruppe, N := 8);
#GruppenAddr := #GruppenAddr OR #TeilnehmerAddr;
```
... das gemacht......

```
//Gruppenadresse zu einem Wort zusammenbauen!
#GruppenAddr := SHL(IN := #HauptGruppe, N := 11);
#GruppenAddr := #GruppenAddr OR SHL(IN := #MittelGruppe, N := 8);
#GruppenAddr := #GruppenAddr OR #TeilnehmerAddr;
```

zur Analyse und Fehlersuche hab ich das auch einmal andersrum 

```
"vHauptGruppe" := SHR(IN := (#KNXDat.Empf_Dat.GruppenAddr AND 16#F800), N := 11);
"vMittelGruppe" := SHR(IN := (#KNXDat.Empf_Dat.GruppenAddr AND 16#700), N := 8);
"vTeilnehmer" := #KNXDat.Empf_Dat.GruppenAddr AND 16#FF;
```
und mein Logbuch wo ich alle Gruppenadressen der Telegramme sehen kann die angekommen sind

```
IF #KNXDat.Empfangen THEN
    FOR #index := 499 TO 0 BY -1 DO
        "DB KNX Logbuch".Adresse[#index+1] := "DB KNX Logbuch".Adresse[#index];
    IF #index = 0 THEN
        "DB KNX Logbuch".Adresse[0] := #KNXDat.Empf_Dat.GruppenAddr;
    END_IF;
    
END_FOR;
END_IF;
```

Aktuell arbeite ich an allen Datentypen weil ich fast alle im Haus habe 
Ich bin gespannt wie es läuft wenn alle Gruppenadressen im System sind. Kann auch später nen Zwischenstand zurückgeben damit du sehen kannst was ich mit den Bausteinen angestellt habe.

Gruß Daniel


----------



## kürbis85 (16 November 2018)

Daniel_G schrieb:


> ...
> Aktuell arbeite ich an allen Datentypen weil ich fast alle im Haus habe
> Ich bin gespannt wie es lÃ¤uft wenn alle Gruppenadressen im System sind. Kann auch spÃ¤ter nen Zwischenstand zurÃ¼ckgeben damit du sehen kannst was ich mit den Bausteinen angestellt habe.
> 
> GruÃŸ Daniel



Hallo Daniel,

hast du schon weitere Erfahrungen gesammelt! Funktioniert das auch im größeren Umfang?

Gruß
Kürbis


----------



## Girrekes (2 Dezember 2018)

Vielen dank für das Programm. Ich werde in den kommenden Monaten damit experimentieren und melde mich dan wieder hier.
Grüße aus den Niederlanden


----------



## Markus1995 (20 Februar 2019)

*Danke*

Hab mir dein Programm bzw. deine Funktionsbausteine mal angesehen.

Die sehen echt gut aus, kann es leider erst in ein paar Wochen testen.

Vielen Dank schon einmal, dass du es zur Verfügung stellst.

Gruß

Markus


----------



## Wickert (5 September 2019)

Hallo, hat mittlerweile jemand das Thema KNXnet/IP hier weiterentwickelt? Habe verschiedene KNX Komponenten an einer S7 300er am werkeln, damals über die S72EIB/KNX Softwarelösung. Gab es kurz als Package für die S7 300er, ebenfalls über eine CP oder direkt am PN der CPU. Funktioniert auch soweit ganz gut. Jetzt möchte ich den Umzug auf S7 1500 machen und habe hier mir das beschriebene Projekt mal angeschaut und angetestet, vielen Dank nochmals, die Kopplung mit der IP Schnittstelle funktioniert. Um die Teilnehmer besser ansprechen zu können, wäre noch die Angebe des DPT hilfreich. Hat dies jemand schon umgesetzt? bzw. getestet? Wie groß ist der maximale Datenpuffer bzw. Telegrammlänge bei KNX? Gibt es bei dieser Umsetzung eine Begrenzung? 

Momentan bin ich noch an der Anbindung von DMX an eine S7 1500er über ArtNet Node1 (Bausatz) und UDP. Erste Erfolge gibt es schon und läuft stabil. Bin gerade dabei dies noch in saubere FB's zu verpacken.

Gruß


----------



## van (15 September 2019)

Gibts zwischenzeitlich ein Update zu dem Projekt?

Würde demnächst auch mal ein paar Versuche mit einer S7-1200 machen.


----------



## kürbis85 (17 September 2019)

Hallo,
ein Upadate gibt es nicht. Habe in letzter Zeit auch nichts mehr damit gemacht. 
Wenn ich von euch ein Rückkopplung bekomme, kann ich mich gegenfalls nochmal damit beschäftigen. 
Aktuell befinden wir uns noch in der Rohbauphase....

@wickert





> Um die Teilnehmer besser ansprechen zu können, wäre noch die Angebe des DPT hilfreich.


Das kann man machen. Aktuell ist die Erkennung "SPS-Variablentyp" abhängig. Reicht das nicht? Gibt es diesbezüglich Probleme?

Gruß 
Kürbis85


----------



## t4sound (2 Dezember 2019)

Hallo Kürbis,

ich habe heute deine Bausteine auf meiner S7-1200 getestet. Danke für die saubere Integration der Bausteine.
Ich habe als KNX-Schnittstelle ein ABB IPS/S 3.1.1

Noch zwei Anmerkungen:
- Du verwendest den Datentyp "Date_and_Time". Auf der S7-1200 gibt es nur den DTL
- Bei höheren Gruppenadressen zb. 4/5/200 hatte ich Probleme mit der Hauptgruppe. Diese war um den Faktor 2 zu groß im Baustein "KNX_GruppeAddr".
  Ich habe deswegen in Zeile drei vom Baustein, beim SHL von 12 auf 11 geändert:   #GruppenAddr := SHL(IN := #HauptGruppe, N := 12); ==> #GruppenAddr := SHL(IN := #HauptGruppe, N := 11);  Somit ist das maximum für eine Gruppenandresse: 31/7/255

Die automatische Erkennung des "SPS-Variablentyp" über den Variant finde ich genial.
Praktisch währe noch eine Liste mit "KNX_Werten" die alles relevante für einen Wert enthält, über die man dann Iterieren kann. Dann müsste man nicht für jeden Wert einen Baustein anlegen.​


----------



## Waldemar1 (1 September 2020)

Hallo hat jemand das Projekt mit eine 1200 ausprobiert?


----------



## Waldemar1 (1 September 2020)

Ich nutze zur zeit die Kommunikation zwischen S 7 1214c und KNX Über 2xABBUniversal E/A-Konzentrator UK/S 32.2


----------



## kürbis85 (1 September 2020)

Hallo, 
wenn sich das Projekt übersetzen lässt, sollte es funktionieren. 
Ein Bekannter von mir verwendet das Programm auf einer S7-1200. 
Ältere 1200ter Steuerungen unterstützen teilweise nicht alle Funktionen die ich verwendet habe:-?... Aber dies stellt man beim Übersetzen fest.
Gruß
Kürbis85


----------



## Waldemar1 (1 September 2020)

Ich habe eine 214-BG31-0XB0 mit Firmware V3. Wurde mich freuen wen Ich das Projekt von ihrem bekannten bekommen könnten als Muster.
Danke.


----------



## Chris.S (2 September 2020)

kürbis85 schrieb:


> Hallo,
> wenn sich das Projekt übersetzen lässt, sollte es funktionieren.
> Ein Bekannter von mir verwendet das Programm auf einer S7-1200.
> Ältere 1200ter Steuerungen unterstützen teilweise nicht alle Funktionen die ich verwendet habe:-?... Aber dies stellt man beim Übersetzen fest.
> ...



Ich bin ebenso ziemlich günstig an eine 1211 mit FW V3 gekommen. Nachdem ich gemerkt habe, was dort alles nicht geht gegenüber der FW4.x (z.B. Serialize / Deserialize), wäre es interessant zu wissen, ob dein Bekannter eine 1200er mit FW 4.x oder höher verwendet oder ob er das Programm so anpassen konnte, damit es dort ebenfalls funktionsfähig ist.
Dann würde mich sehr interessieren, was er am Baustein "KNX_Kommunikation" angepasst hat.
Mit einer 1500er Steuerung der neueren Generation habe ich das Programm ebenfalls schon zu laufen gebracht. Sehr schöne Funktionen auf jeden Fall, danke dafür.


----------



## Waldemar1 (6 September 2020)

Hallo, an kürbis85. 
Wollte noch mal auf meine Frage zurückkommen, währe es möglich das ich das Projekt als Muster von ihrem bekannten bekommen könnte. Was verwendet er für eine Firmware auf die S7? Wenn es nicht möglich ist das Projekt zu bekommen, bitte bescheid geben. Vielen Dank im Voraus.
Waldemar1


----------



## SPS-Andy (5 November 2020)

Hallo kürbis85,

erstmal vielen Dank und "Hut-Ab" für das Bereitstellen der Software!

Ich habe seit längerem nach so etwas gesucht. Momentan habe ich eine CMK2000 mit einer LOGO verbaut das aber leider nicht alle Datentypen von KNX beherrscht.
Deine Software habe ich auf V15.1 hochgezogen und mit einer 1511F getestet.  mit der Änderung von Daniel  



```
#GruppenAddr := SHL (IN := #HauptGruppe, N := 12);
```
Funktioniert das auch schon sehr gut. Leider habe ich jetzt noch ein paar Proble bei denen ich Starthilfe benötige.
Temperaturen werden ohne Probleme übertragen genau so den Aktuellen Strom Wert meines KNX Netzteils 7.012. 

Bei der Spannung z.b. kommt was falsches an lt. ETS ist die Bus-Spannug 9.020 ein 2Byte Real Wert. 
Die S7 liest aber (anstatt von ca.30V) 204.8 mit dem CMK von LOGO bekomme ich einen plausiblen Wert von 30,38V.

Desweitern möchte ich einen Dimmwert und einen Stellwert eines Heizungsaktors in die S7 übertragen beides % 0-100 5.001 hier wird dauerhaft 0 angezeigt.

Könntest Du mir, uns auch erklären wie man den FB erweitern kann um noch andere Datentypen zu lesen/schreiben z.B. Szenennummern!

Vielen Dank für die Hilfe!!


----------



## Matthias92 (6 März 2021)

Danke für das Programm läuft super.
Habe den Baustein noch erweitert um Temperaturen bzw. Gleitpunkt Zahlen (DPT 9.x) und Strings (DPT 16.x) zu senden.
Mit der S7-1212 habe ich jetzt eine super Schnittstelle zwischen meiner ETA Hackschnitzelheizung mit Modbus TCP und KNX (nutze den GIRA X1 als Tunnel)

@SPS-Andy
Bei Prozentwerten musste ich wenn ich sie senden will skalieren:
*VARIABLE_FÜR_KNX* := REAL_TO_USINT(*VARIABLE_0-100%* * 2.55);


----------



## CaptainElektro (8 September 2021)

Hallo Matthias92, ich habe versucht die Funktionen, die du integriert hast selber zu integrieren.
Leider hat das nicht geklappt. Könntest du das Programm hochladen ?
Viele Grüße
Simon


----------



## Matthias92 (19 September 2021)

Hallo Simon,

hier mein aktuelles Projekt





						KNX_Client.zip
					






					drive.google.com
				




Grüße
Matthias


----------



## CaptainElektro (20 September 2021)

Matthias92 schrieb:


> Hallo Simon,
> 
> hier mein aktuelles Projekt
> 
> ...


Hallo Matthias, dank dafür ! Ich freue mich , das hilft mir sehr viel weiter !
Viele Grüße
Simon


----------



## themasterchris (1 Oktober 2021)

Hallo Matthias,
erst einmal vielen vielen Dank für deine wirklich tolle Arbeit.
Hab das ganze bei mir jetzt im Einsatz und muss sagen ist schon echt gut. 
Jedoch ist mir jetzt aufgefallen, wenn ich eine REAL-Zahl schicken möchte die größer als 327 ist kommt was falsches an. Scheint als würde hier die Wandlung nicht passen. 
Weiß schon grob wo das gemacht wird, jedoch nicht genau wie es gemacht wird und somit komm ich hier nicht weiter.  

Könnte sich das jemand mal anschauen? 



> ELSIF TypeOf(#Wert) = Real THEN
> VariantGet(SRC := #Wert,
> DST => #tmp_Real);
> #KNX_Dat.Send_Dat.GruppenAddr := #GruppenAddr;
> ...


----------



## Oberchefe (1 Oktober 2021)

ohne das Ding zu kennen würde ich mal vermuten, dass es in irgendeiner Form als Integer behandelt wird (mit 2 Nachkommastellen), und ein INT geht bis maximal 32767.


----------



## Oberchefe (1 Oktober 2021)

Man sollte den Code schon aufklappen...


----------



## themasterchris (1 Oktober 2021)

ja das hab ich soweit auch gesehen, weiß aber nicht wie ich das ändern kann.


----------



## Oberchefe (1 Oktober 2021)

```
DPT 9.xxx is defined for transmitting floating point values. Various datapoint types have
been defined for different physical variables. Not all datapoint types use the maximum value range. Devices shall ignore invalid or
undefined values.  The value to be transferred shall be coded in the mantissa. If the value multiplied by 100
(because of the resolution of 0,01) does not fit in the range of –2048 and +2047, the
mantissa shall be divided by a factor, which constitutes the exponent. The sign bit
indicates whether the value is a negative (S bit = 1) or a positive value (S bit =0). In case
of negative values, the mantissa shall moreover be the two’s complement of the
corresponding positive value.

4.10.3  Example
A temperature value of - 30 degrees C can be calculated according DPT 9.001 as follows:  Step 1: Calculate the mantissa Due to the resolution of 0.01, the value to be coded must be multiplied by 100: 30 x 100 =
3000  Step 2: Check if exponent is required  Mantissa is 11 bits, range is from + 2047 to -2048. 3000 is larger, therefore exponent is required. Which exponent? 2^1 = 2 is sufficient as 3000 : 2 = 1500, and this number can be coded in
the mantissa.  Step 3: Code the mantissa: 
Value: 1024 512 256 128 64 32 16 8 4 2 1
Number: 1 0 1 1 1 0 1 1 1 0 0  If the number is negative, then create a two’s complement! 

Output value:  101 1101 1100  Invert:   010 0010 0011 +1                        1 -------------------------------------------------   010 0010 0100  Step 4: Code sign and exponent Number is negative, therefore the S bit = 1 Exponent = 1, coded in four bits = 0001  Step 5: Final result 
-30 = 1   0001   010 0010 0100
```


----------



## Matthias92 (2 Oktober 2021)

den Datentyp der Variable tmp_int auf DINT ändern dann sollte es gehen.
allerdings lässt die Genauigkeit bei höheren Zahlen nach.
War froh das es soweit mal funktioniert hat.
Übertrage damit aktuell nur Temperaturen und zwischen -20.0 und +100.0 passt es


----------



## Oberchefe (3 Oktober 2021)

> den Datentyp der Variable tmp_int auf DINT ändern dann sollte es gehen.


Falsch.

So ungefähr könnte das aussehen (In Codesys, Siemens kann ich gerade nicht testen, sollte aber nicht schwer sein, das umzusetzen:


```
tmpExp := 0;    (*    Exponent initialisieren    *)

tmpIntValIn := REAL_TO_INT(tmp_Real * 100.0);

IF  tmpIntValIn > 2047 OR tmpIntValIn < -2048 THEN

    WHILE tmpIntValIn / EXPT(2,tmpExp) > 2047 DO
        tmpExp := tmpExp +1;
    END_WHILE;

ELSIF tmpIntValIn < -2048 THEN

    WHILE tmpIntValIn / EXPT(2,tmpExp) < -2048 DO
        tmpExp := tmpExp +1;
    END_WHILE;

ELSE            (*    Kein Exponent erforderlich    *)

    ;

END_IF;

tmp_Int := tmpIntValIn / REAL_TO_INT(EXPT(2,INT_TO_WORD(tmpExp) ));         (*    Mantisse roh                *)

tmp_Int := WORD_TO_INT(INT_TO_WORD(tmp_Int) AND 16#7FF);
tmpOut := SHL(tmpExp,11);                (*    Exponent positionieren        *)
IF tmpIntValIn < 0 THEN                    (*    negativ?    -> Vorzeichen setzen    *)
    tmpOut := tmpOut OR 16#8000;
END_IF;
tmpOut := tmpOut OR INT_TO_WORD(tmp_Int);
```


----------



## van (3 Oktober 2021)

Oberchefe schrieb:


> Falsch.
> 
> So ungefähr könnte das aussehen (In Codesys, Siemens kann ich gerade nicht testen, sollte aber nicht schwer sein, das umzusetzen:



Habs mal in TIA umgesetzt
Musste ein paar Int durch Dint ersetzen
Und bei negativen Zahlen gabs einen Fehler in der If



```
FUNCTION "knx-real-to-DPT9" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT
      inReal : Real;
   END_VAR

   VAR_OUTPUT
      outDPT9 : Word;
   END_VAR

   VAR_TEMP
      tmpExp : Int;
      tmpDIntValIn : DInt;
      tmp_dInt : DInt;
      tmpOut : Int;
   END_VAR


BEGIN
    
    (*
    
    Wandelt eine Real Zahl in den DPT9.xxx (2 Byte Gleitkommawert)
    
    Quelle:
    https://www.sps-forum.de/threads/knx-kommunkation-%C3%BCber-knxnet-ip-mit-siemens-s7-1500-s7-1200-tia-portal.93641/post-804342
    
    Weitere Infos:
    03_07_02 Datapoint Types v01.08.02 AS.pdf
    3.10 Datapoint Types “2-Octet Float Value”
    
    Range: [-671 088,64 … 670 760,96]
    
    *)
    
    #tmpExp := 0;    (*    Exponent initialisieren    *)
    
    #tmpDIntValIn := REAL_TO_DINT(#inReal * 100.0);
    
    IF #tmpDIntValIn > 2047  THEN   // OR #tmpDIntValIn < -2048
        
        WHILE #tmpDIntValIn / (2**#tmpExp) > 2047 DO     //EXPT(2, #tmpExp)
            #tmpExp := #tmpExp + 1;
        END_WHILE;
        
    ELSIF #tmpDIntValIn < -2048 THEN
        
        WHILE #tmpDIntValIn / (2**#tmpExp) < -2048 DO    // EXPT(2, #tmpExp)
            #tmpExp := #tmpExp + 1;
        END_WHILE;
        
    ELSE            (*    Kein Exponent erforderlich    *)
        
        ;
        
    END_IF;
    
    
    #tmp_dInt := #tmpDIntValIn / REAL_TO_DINT((2**(#tmpExp)));         (*    Mantisse roh   *)  //(EXPT(2, INT_TO_WORD(#tmpExp))
    
    #tmp_dInt := WORD_TO_DINT(DINT_TO_WORD(#tmp_dInt) AND 16#7FF);
    #tmpOut := SHL(IN := #tmpExp, N:=11);                (*    Exponent positionieren        *)
    
    
    IF #tmpDIntValIn < 0 THEN                    (*    negativ?    -> Vorzeichen setzen    *)
        #tmpOut := #tmpOut OR 16#8000;
    END_IF;
    
    
    #outDPT9 := #tmpOut OR DINT_TO_WORD(#tmp_dInt);
    
    
    
    
    
    
END_FUNCTION
```


----------



## themasterchris (4 Oktober 2021)

Hey Leute,

vielen Dank für die Umsetzung. Ist mega und funktioniert perfekt bei mir. 

Danke noch mal.


----------



## van (17 Oktober 2021)

Habe das Projekt mal erweitert

Leseanfrage (GroupValueRead) vom Bus an die SPS, und an von der SPS an den Bus
SendByChange
Init Scan
Weitere DPTs
Strukturierte Parametrierung der KO/GAs


----------



## kürbis85 (14 November 2021)

Hallo zusammen,
im Anhang das aktuelle Projekt von mir.
Das Projekt beinhaltet das gesamte SPS-Programm, wozu auch eine Fußbedenheizung (Mischer-Regelung) gehört.
Die KNX-Kommunikation sollte erkenntlich sein.

In der Version wurde einige Fehler beseitigt, dazugehört auch das Wandeln von Dpt 9.xxx nach Real.
Zusätzlich wurde das "GroupValueRead" mit implmentiert und einige DPTs erweitert.

Da es eine ständige Erweiterung war und ist, weiß ich garnicht mehr so genau was ich mittlerweile alles ergänzt habe.
Unterstützte DPTs werden in den Baustein-Kommentar angegeben.

Im großen und ganzen läuft das ganze in meinen Augen sehr stabil... hatte zumindest bis jetzt noch keine Ausfälle.

Bei Rückfragen einfach melden.

Gruß
Kürbis


----------



## apfelsaft (27 August 2022)

Hi Kürbis85,

auch von mit vielen Dank für die tolle Arbeit. Funktioniert sehr gut.

Ich habe ab und an noch Verbindungsabbrüche im Netzwerk aber das liegt wohl bei mir im Netz. Allerdings hat der Baustein danach Schwierigkeiten wieder mit dem KNX Gateway zu kommunizieren.
Kann leider noch nicht sagen in welchem Zustand er hängt aber der Ausgang Timeout kommt.

Im Zustand 270 (Ethernet-Verbindung freigeben) hast Du zwei mal If RueckState=0 Then State := 0 drin. Der State 0 ist aber nicht definiert.

Danke Dir schon mal!


----------



## mights (Heute um 20:07)

Hallo Leute, 
bin gerade zufällig auf diesen Eintrag gestossen und habe gleich angefangen das ganze bei mir zu testen. 
Hat jemand das ganze schon mal mit knxd ausprobiert? Ich kann zwar eine Verbindung aufbauen, jedoch komme ich über diesen Status nicht weiter. 










Bin mit KNX ein totaler Anfänger, wenn ich über knxtools eine Gruppe anspreche funktioniert das sofort. Heist an den Deamon kann es nicht liegen. 

Funktioniert das überhaupt mit den Deamon oder brauche ich ein KNX/IP Gateway? Weiß das jemand von euch?


----------

